From c2328ec0f4ad45d84b3d96c2b3f80017ef30af52 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 12 Feb 2017 04:18:45 -0800 Subject: [PATCH 0001/2287] [backport to 3.6] Support "bpo-" in Misc/NEWS (#42) (cherry picked from commit 79ab8be05fb4ffb5c258d2ca49be5fc2d4880431) --- Doc/tools/extensions/pyspecific.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index 273191bbd3c025..1141d6c5ac1891 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -34,7 +34,7 @@ ISSUE_URI = 'https://bugs.python.org/issue%s' -SOURCE_URI = 'https://hg.python.org/cpython/file/3.6/%s' +SOURCE_URI = 'https://github.com/python/cpython/tree/3.6/%s' # monkey-patch reST parser to disable alphabetic and roman enumerated lists from docutils.parsers.rst.states import Body @@ -79,7 +79,7 @@ def new_depart_literal_block(self, node): def issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): issue = utils.unescape(text) - text = 'issue ' + issue + text = 'bpo-' + issue refnode = nodes.reference(text, text, refuri=ISSUE_URI % issue) return [refnode], [] @@ -225,7 +225,7 @@ def run(self): # Support for including Misc/NEWS -issue_re = re.compile('([Ii])ssue #([0-9]+)') +issue_re = re.compile('(?:[Ii]ssue #|bpo-)([0-9]+)') whatsnew_re = re.compile(r"(?im)^what's new in (.*?)\??$") @@ -253,7 +253,7 @@ def run(self): text = 'The NEWS file is not available.' node = nodes.strong(text, text) return [node] - content = issue_re.sub(r'`\1ssue #\2 `__', + content = issue_re.sub(r'`bpo-\1 `__', content) content = whatsnew_re.sub(r'\1', content) # remove first 3 lines as they are the main heading From 89b1824e693419b20b6a9113e5293f1c1a78065f Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Sun, 12 Feb 2017 19:13:31 +0300 Subject: [PATCH 0002/2287] bpo-27122: Fix comment to point to correct issue number (#48) It took me quite a bit to figure out what this was referring to, since the given issue number is wrong, and the original commit message I found through git blame lists a different, also wrong issue number... see https://bugs.python.org/issue27122#msg279449 (cherry picked from commit af88e7eda4101f36e904771d3cf59a5f740b3b00) --- Lib/contextlib.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/contextlib.py b/Lib/contextlib.py index 7d94a579c872b7..8421968525947e 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -105,7 +105,7 @@ def __exit__(self, type, value, traceback): # raised inside the "with" statement from being suppressed. return exc is not value except RuntimeError as exc: - # Don't re-raise the passed in exception. (issue27112) + # Don't re-raise the passed in exception. (issue27122) if exc is value: return False # Likewise, avoid suppressing if a StopIteration exception From 308f789d00735e6707dbc5c8f60a1c8cf245fb4b Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 12 Feb 2017 08:18:07 -0800 Subject: [PATCH 0003/2287] bpo-29474: Improve documentation for weakref.WeakValueDictionary (#22) There were some grammatical errors in weakref.WeakValueDictionary documentation. --- Doc/library/weakref.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst index e289b971e7c269..b02a006d733b6e 100644 --- a/Doc/library/weakref.rst +++ b/Doc/library/weakref.rst @@ -166,8 +166,8 @@ Extension types can easily be made to support weak references; see performed by the program during iteration may cause items in the dictionary to vanish "by magic" (as a side effect of garbage collection). -:class:`WeakKeyDictionary` objects have the following additional methods. These -expose the internal references directly. The references are not guaranteed to +:class:`WeakKeyDictionary` objects have an additional method that +exposes the internal references directly. The references are not guaranteed to be "live" at the time they are used, so the result of calling the references needs to be checked before being used. This can be used to avoid creating references that will cause the garbage collector to keep the keys around longer @@ -192,9 +192,9 @@ than needed. by the program during iteration may cause items in the dictionary to vanish "by magic" (as a side effect of garbage collection). -:class:`WeakValueDictionary` objects have the following additional methods. -These method have the same issues as the and :meth:`keyrefs` method of -:class:`WeakKeyDictionary` objects. +:class:`WeakValueDictionary` objects have an additional method that has the +same issues as the :meth:`keyrefs` method of :class:`WeakKeyDictionary` +objects. .. method:: WeakValueDictionary.valuerefs() From f66c81ff499fb431e56bc68f5e39c2f7b9fcb6a7 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 12 Feb 2017 13:08:24 -0800 Subject: [PATCH 0004/2287] [backport to 3.6] bpo-28929: Link the documentation to its source file on GitHub (#37) * bpo-28929: Link the documentation to its source file on GitHub Change the documentation's `Show Source` link on the left menu to GitHub source file. (cherry picked from commit 23bafa294c75c20cb85ae5d97d7571a3a0ad8dd3) * remove if statement --- Doc/tools/templates/customsourcelink.html | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Doc/tools/templates/customsourcelink.html b/Doc/tools/templates/customsourcelink.html index 243d8107779361..71d0bba683074e 100644 --- a/Doc/tools/templates/customsourcelink.html +++ b/Doc/tools/templates/customsourcelink.html @@ -3,8 +3,11 @@

{{ _('This Page') }}

{%- endif %} From 89ddffbe9dcb38b79f99563b0d4d594d1105a192 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Mon, 13 Feb 2017 09:19:05 +0900 Subject: [PATCH 0005/2287] bpo-29438: fixed use-after-free in key sharing dict (#39) --- Misc/NEWS | 2 ++ Objects/dictobject.c | 10 +++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index d79ff2450defaa..ceea2226561fd6 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ What's New in Python 3.6.1 release candidate 1? Core and Builtins ----------------- +- bpo-29438: Fixed use-after-free problem in key sharing dict. + - Issue #29319: Prevent RunMainFromImporter overwriting sys.path[0]. - Issue #29337: Fixed possible BytesWarning when compare the code objects. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index a7b403bcecc5da..b63b78a337225a 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -4376,15 +4376,19 @@ _PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr, } if (value == NULL) { res = PyDict_DelItem(dict, key); - if (cached != ((PyDictObject *)dict)->ma_keys) { + // Since key sharing dict doesn't allow deletion, PyDict_DelItem() + // always converts dict to combined form. + if ((cached = CACHED_KEYS(tp)) != NULL) { CACHED_KEYS(tp) = NULL; DK_DECREF(cached); } } else { - int was_shared = cached == ((PyDictObject *)dict)->ma_keys; + int was_shared = (cached == ((PyDictObject *)dict)->ma_keys); res = PyDict_SetItem(dict, key, value); - if (was_shared && cached != ((PyDictObject *)dict)->ma_keys) { + if (was_shared && + (cached = CACHED_KEYS(tp)) != NULL && + cached != ((PyDictObject *)dict)->ma_keys) { /* PyDict_SetItem() may call dictresize and convert split table * into combined table. In such case, convert it to split * table again and update type's shared key only when this is From 2d0c2286f8e19e5d6a45cf16f766382115431c2e Mon Sep 17 00:00:00 2001 From: Mariatta Date: Mon, 13 Feb 2017 15:48:40 -0800 Subject: [PATCH 0006/2287] A few README tweaks (#73) (#79) * Add a paragraph at the top for users, not builders, of Python. * Use nicer rst url syntax to avoid borking paragraphs in the plain text. Contributed by Ned Batchelder @nedbat (cherry picked from commit 3cdbd68ce8230cff1afb67472b96fbfa7f047e32) --- README | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/README b/README index 4fc97e6013063e..03c4b03f68a1ff 100644 --- a/README +++ b/README @@ -11,6 +11,14 @@ especially how built-in objects like dictionaries and strings work, have changed considerably, and a lot of deprecated features have finally been removed. +Using Python +------------ + +Installable Python kits, and information about using Python, are available at +`python.org`_. + +.. _python.org: https://www.python.org/ + Build Instructions ------------------ @@ -151,7 +159,7 @@ IMPORTANT: If the tests fail and you decide to mail a bug report, *don't* include the output of "make test". It is useless. Run the failing test manually, as follows: - ./python -m test -v test_whatever + ./python -m test -v test_whatever (substituting the top of the source tree for '.' if you built in a different directory). This runs the test in verbose mode. @@ -198,11 +206,12 @@ Proposals for enhancement ------------------------- If you have a proposal to change Python, you may want to send an email to the -comp.lang.python or python-ideas mailing lists for initial feedback. A Python +comp.lang.python or `python-ideas`_ mailing lists for initial feedback. A Python Enhancement Proposal (PEP) may be submitted if your idea gains ground. All current PEPs, as well as guidelines for submitting a new PEP, are listed at https://www.python.org/dev/peps/. +.. _python-ideas: https://mail.python.org/mailman/listinfo/python-ideas/ Release Schedule ---------------- @@ -231,4 +240,3 @@ so it may be used in proprietary projects. There are interfaces to some GNU code but these are entirely optional. All trademarks referenced herein are property of their respective holders. - From 0230e64d2c976ab755c145e97bf86032e0fe3a53 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 14 Feb 2017 06:11:12 -0800 Subject: [PATCH 0007/2287] bpo-28556: Various updates to typing (#28) (#77) various updates from upstream python/typing repo: - Added typing.Counter and typing.ChainMap generics - More flexible typing.NamedTuple - Improved generic ABC caching - More tests - Bugfixes - Other updates * Add Misc/NEWS entry (cherry picked from commit b692dc8475a032740576129d0990ddc3edccab2b) --- Lib/test/mod_generics_cache.py | 14 ++ Lib/test/test_typing.py | 237 +++++++++++++++++++++++++++++---- Lib/typing.py | 138 ++++++++++++++----- Misc/NEWS | 4 + 4 files changed, 335 insertions(+), 58 deletions(-) create mode 100644 Lib/test/mod_generics_cache.py diff --git a/Lib/test/mod_generics_cache.py b/Lib/test/mod_generics_cache.py new file mode 100644 index 00000000000000..d9a60b4b28c325 --- /dev/null +++ b/Lib/test/mod_generics_cache.py @@ -0,0 +1,14 @@ +"""Module for testing the behavior of generics across different modules.""" + +from typing import TypeVar, Generic + +T = TypeVar('T') + + +class A(Generic[T]): + pass + + +class B(Generic[T]): + class A(Generic[T]): + pass diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index fce6b5aaffdf93..64d8276658ee7f 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -190,6 +190,10 @@ def test_bound_errors(self): with self.assertRaises(TypeError): TypeVar('X', str, float, bound=Employee) + def test_no_bivariant(self): + with self.assertRaises(ValueError): + TypeVar('T', covariant=True, contravariant=True) + class UnionTests(BaseTestCase): @@ -254,6 +258,11 @@ def test_repr(self): self.assertEqual(repr(u), 'typing.Union[%s.Employee, int]' % __name__) u = Union[int, Employee] self.assertEqual(repr(u), 'typing.Union[int, %s.Employee]' % __name__) + T = TypeVar('T') + u = Union[T, int][int] + self.assertEqual(repr(u), repr(int)) + u = Union[List[int], int] + self.assertEqual(repr(u), 'typing.Union[typing.List[int], int]') def test_cannot_subclass(self): with self.assertRaises(TypeError): @@ -304,6 +313,15 @@ def test_union_instance_type_error(self): with self.assertRaises(TypeError): isinstance(42, Union[int, str]) + def test_no_eval_union(self): + u = Union[int, str] + def f(x: u): ... + self.assertIs(get_type_hints(f)['x'], u) + + def test_function_repr_union(self): + def fun() -> int: ... + self.assertEqual(repr(Union[fun, int]), 'typing.Union[fun, int]') + def test_union_str_pattern(self): # Shouldn't crash; see http://bugs.python.org/issue25390 A = Union[str, Pattern] @@ -401,6 +419,8 @@ def test_callable_wrong_forms(self): Callable[[()], int] with self.assertRaises(TypeError): Callable[[int, 1], 2] + with self.assertRaises(TypeError): + Callable[int] def test_callable_instance_works(self): def f(): @@ -546,15 +566,27 @@ def test_basics(self): Y[str] with self.assertRaises(TypeError): Y[str, str] + self.assertIsSubclass(SimpleMapping[str, int], SimpleMapping) def test_generic_errors(self): T = TypeVar('T') + S = TypeVar('S') with self.assertRaises(TypeError): Generic[T]() + with self.assertRaises(TypeError): + Generic[T][T] + with self.assertRaises(TypeError): + Generic[T][S] with self.assertRaises(TypeError): isinstance([], List[int]) with self.assertRaises(TypeError): issubclass(list, List[int]) + with self.assertRaises(TypeError): + class NewGeneric(Generic): ... + with self.assertRaises(TypeError): + class MyGeneric(Generic[T], Generic[S]): ... + with self.assertRaises(TypeError): + class MyGeneric(List[T], Generic[S]): ... def test_init(self): T = TypeVar('T') @@ -738,6 +770,53 @@ def test_subscript_meta(self): self.assertEqual(Union[T, int][GenericMeta], Union[GenericMeta, int]) self.assertEqual(Callable[..., GenericMeta].__args__, (Ellipsis, GenericMeta)) + def test_generic_hashes(self): + try: + from test import mod_generics_cache + except ImportError: # for Python 3.4 and previous versions + import mod_generics_cache + class A(Generic[T]): + ... + + class B(Generic[T]): + class A(Generic[T]): + ... + + self.assertEqual(A, A) + self.assertEqual(mod_generics_cache.A[str], mod_generics_cache.A[str]) + self.assertEqual(B.A, B.A) + self.assertEqual(mod_generics_cache.B.A[B.A[str]], + mod_generics_cache.B.A[B.A[str]]) + + self.assertNotEqual(A, B.A) + self.assertNotEqual(A, mod_generics_cache.A) + self.assertNotEqual(A, mod_generics_cache.B.A) + self.assertNotEqual(B.A, mod_generics_cache.A) + self.assertNotEqual(B.A, mod_generics_cache.B.A) + + self.assertNotEqual(A[str], B.A[str]) + self.assertNotEqual(A[List[Any]], B.A[List[Any]]) + self.assertNotEqual(A[str], mod_generics_cache.A[str]) + self.assertNotEqual(A[str], mod_generics_cache.B.A[str]) + self.assertNotEqual(B.A[int], mod_generics_cache.A[int]) + self.assertNotEqual(B.A[List[Any]], mod_generics_cache.B.A[List[Any]]) + + self.assertNotEqual(Tuple[A[str]], Tuple[B.A[str]]) + self.assertNotEqual(Tuple[A[List[Any]]], Tuple[B.A[List[Any]]]) + self.assertNotEqual(Union[str, A[str]], Union[str, mod_generics_cache.A[str]]) + self.assertNotEqual(Union[A[str], A[str]], + Union[A[str], mod_generics_cache.A[str]]) + self.assertNotEqual(typing.FrozenSet[A[str]], + typing.FrozenSet[mod_generics_cache.B.A[str]]) + + if sys.version_info[:2] > (3, 2): + self.assertTrue(repr(Tuple[A[str]]).endswith('.A[str]]')) + self.assertTrue(repr(Tuple[B.A[str]]).endswith('.B.A[str]]')) + self.assertTrue(repr(Tuple[mod_generics_cache.A[str]]) + .endswith('mod_generics_cache.A[str]]')) + self.assertTrue(repr(Tuple[mod_generics_cache.B.A[str]]) + .endswith('mod_generics_cache.B.A[str]]')) + def test_extended_generic_rules_eq(self): T = TypeVar('T') U = TypeVar('U') @@ -835,6 +914,8 @@ def test_fail_with_bare_generic(self): Tuple[Generic[T]] with self.assertRaises(TypeError): List[typing._Protocol] + with self.assertRaises(TypeError): + isinstance(1, Generic) def test_type_erasure_special(self): T = TypeVar('T') @@ -853,6 +934,11 @@ class MyDict(typing.Dict[T, T]): ... class MyDef(typing.DefaultDict[str, T]): ... self.assertIs(MyDef[int]().__class__, MyDef) self.assertIs(MyDef[int]().__orig_class__, MyDef[int]) + # ChainMap was added in 3.3 + if sys.version_info >= (3, 3): + class MyChain(typing.ChainMap[str, T]): ... + self.assertIs(MyChain[int]().__class__, MyChain) + self.assertIs(MyChain[int]().__orig_class__, MyChain[int]) def test_all_repr_eq_any(self): objs = (getattr(typing, el) for el in typing.__all__) @@ -1203,6 +1289,19 @@ def test_forwardref_instance_type_error(self): with self.assertRaises(TypeError): isinstance(42, fr) + def test_forwardref_subclass_type_error(self): + fr = typing._ForwardRef('int') + with self.assertRaises(TypeError): + issubclass(int, fr) + + def test_forward_equality(self): + fr = typing._ForwardRef('int') + self.assertEqual(fr, typing._ForwardRef('int')) + self.assertNotEqual(List['int'], List[int]) + + def test_forward_repr(self): + self.assertEqual(repr(List['int']), "typing.List[_ForwardRef('int')]") + def test_union_forward(self): def foo(a: Union['T']): @@ -1285,6 +1384,15 @@ def foo(a: 'whatevers') -> {}: ith = get_type_hints(C().foo) self.assertEqual(ith, {}) + def test_no_type_check_no_bases(self): + class C: + def meth(self, x: int): ... + @no_type_check + class D(C): + c = C + # verify that @no_type_check never affects bases + self.assertEqual(get_type_hints(C.meth), {'x': int}) + def test_meta_no_type_check(self): @no_type_check_decorator @@ -1401,11 +1509,16 @@ class A: class B(A): x: ClassVar[Optional['B']] = None y: int + b: int class CSub(B): z: ClassVar['CSub'] = B() class G(Generic[T]): lst: ClassVar[List[T]] = [] +class NoneAndForward: + parent: 'NoneAndForward' + meaning: None + class CoolEmployee(NamedTuple): name: str cool: int @@ -1419,10 +1532,13 @@ class XMeth(NamedTuple): def double(self): return 2 * self.x -class XMethBad(NamedTuple): +class XRepr(NamedTuple): x: int - def _fields(self): - return 'no chance for this' + y: int = 1 + def __str__(self): + return f'{self.x} -> {self.y}' + def __add__(self, other): + return 0 """ if PY36: @@ -1431,7 +1547,7 @@ def _fields(self): # fake names for the sake of static analysis ann_module = ann_module2 = ann_module3 = None A = B = CSub = G = CoolEmployee = CoolEmployeeWithDefault = object - XMeth = XMethBad = object + XMeth = XRepr = NoneAndForward = object gth = get_type_hints @@ -1466,6 +1582,8 @@ def test_get_type_hints_classes(self): {'y': Optional[ann_module.C]}) self.assertEqual(gth(ann_module.S), {'x': str, 'y': str}) self.assertEqual(gth(ann_module.foo), {'x': int}) + self.assertEqual(gth(NoneAndForward, globals()), + {'parent': NoneAndForward, 'meaning': type(None)}) @skipUnless(PY36, 'Python 3.6 required') def test_respect_no_type_check(self): @@ -1482,17 +1600,22 @@ def meth(x: int): ... class Der(ABase): ... self.assertEqual(gth(ABase.meth), {'x': int}) - def test_get_type_hints_for_builins(self): + def test_get_type_hints_for_builtins(self): # Should not fail for built-in classes and functions. self.assertEqual(gth(int), {}) self.assertEqual(gth(type), {}) self.assertEqual(gth(dir), {}) self.assertEqual(gth(len), {}) + self.assertEqual(gth(object.__str__), {}) + self.assertEqual(gth(object().__str__), {}) + self.assertEqual(gth(str.join), {}) def test_previous_behavior(self): def testf(x, y): ... testf.__annotations__['x'] = 'int' self.assertEqual(gth(testf), {'x': int}) + def testg(x: None): ... + self.assertEqual(gth(testg), {'x': type(None)}) def test_get_type_hints_for_object_with_annotations(self): class A: ... @@ -1506,9 +1629,10 @@ def test_get_type_hints_ClassVar(self): self.assertEqual(gth(ann_module2.CV, ann_module2.__dict__), {'var': typing.ClassVar[ann_module2.CV]}) self.assertEqual(gth(B, globals()), - {'y': int, 'x': ClassVar[Optional[B]]}) + {'y': int, 'x': ClassVar[Optional[B]], 'b': int}) self.assertEqual(gth(CSub, globals()), - {'z': ClassVar[CSub], 'y': int, 'x': ClassVar[Optional[B]]}) + {'z': ClassVar[CSub], 'y': int, 'b': int, + 'x': ClassVar[Optional[B]]}) self.assertEqual(gth(G), {'lst': ClassVar[List[T]]}) @@ -1628,6 +1752,11 @@ def test_list(self): def test_deque(self): self.assertIsSubclass(collections.deque, typing.Deque) + class MyDeque(typing.Deque[int]): ... + self.assertIsInstance(MyDeque(), collections.deque) + + def test_counter(self): + self.assertIsSubclass(collections.Counter, typing.Counter) def test_set(self): self.assertIsSubclass(set, typing.Set) @@ -1680,13 +1809,10 @@ class MyDict(typing.Dict[str, int]): self.assertIsSubclass(MyDict, dict) self.assertNotIsSubclass(dict, MyDict) - def test_no_defaultdict_instantiation(self): - with self.assertRaises(TypeError): - typing.DefaultDict() - with self.assertRaises(TypeError): - typing.DefaultDict[KT, VT]() - with self.assertRaises(TypeError): - typing.DefaultDict[str, int]() + def test_defaultdict_instantiation(self): + self.assertIs(type(typing.DefaultDict()), collections.defaultdict) + self.assertIs(type(typing.DefaultDict[KT, VT]()), collections.defaultdict) + self.assertIs(type(typing.DefaultDict[str, int]()), collections.defaultdict) def test_defaultdict_subclass(self): @@ -1699,13 +1825,49 @@ class MyDefDict(typing.DefaultDict[str, int]): self.assertIsSubclass(MyDefDict, collections.defaultdict) self.assertNotIsSubclass(collections.defaultdict, MyDefDict) - def test_no_deque_instantiation(self): - with self.assertRaises(TypeError): - typing.Deque() - with self.assertRaises(TypeError): - typing.Deque[T]() - with self.assertRaises(TypeError): - typing.Deque[int]() + @skipUnless(sys.version_info >= (3, 3), 'ChainMap was added in 3.3') + def test_chainmap_instantiation(self): + self.assertIs(type(typing.ChainMap()), collections.ChainMap) + self.assertIs(type(typing.ChainMap[KT, VT]()), collections.ChainMap) + self.assertIs(type(typing.ChainMap[str, int]()), collections.ChainMap) + class CM(typing.ChainMap[KT, VT]): ... + self.assertIs(type(CM[int, str]()), CM) + + @skipUnless(sys.version_info >= (3, 3), 'ChainMap was added in 3.3') + def test_chainmap_subclass(self): + + class MyChainMap(typing.ChainMap[str, int]): + pass + + cm = MyChainMap() + self.assertIsInstance(cm, MyChainMap) + + self.assertIsSubclass(MyChainMap, collections.ChainMap) + self.assertNotIsSubclass(collections.ChainMap, MyChainMap) + + def test_deque_instantiation(self): + self.assertIs(type(typing.Deque()), collections.deque) + self.assertIs(type(typing.Deque[T]()), collections.deque) + self.assertIs(type(typing.Deque[int]()), collections.deque) + class D(typing.Deque[T]): ... + self.assertIs(type(D[int]()), D) + + def test_counter_instantiation(self): + self.assertIs(type(typing.Counter()), collections.Counter) + self.assertIs(type(typing.Counter[T]()), collections.Counter) + self.assertIs(type(typing.Counter[int]()), collections.Counter) + class C(typing.Counter[T]): ... + self.assertIs(type(C[int]()), C) + + def test_counter_subclass_instantiation(self): + + class MyCounter(typing.Counter[int]): + pass + + d = MyCounter() + self.assertIsInstance(d, MyCounter) + self.assertIsInstance(d, typing.Counter) + self.assertIsInstance(d, collections.Counter) def test_no_set_instantiation(self): with self.assertRaises(TypeError): @@ -2018,6 +2180,14 @@ def test_basics(self): collections.OrderedDict([('name', str), ('id', int)])) self.assertIs(Emp._field_types, Emp.__annotations__) + def test_namedtuple_pyversion(self): + if sys.version_info[:2] < (3, 6): + with self.assertRaises(TypeError): + NamedTuple('Name', one=int, other=str) + with self.assertRaises(TypeError): + class NotYet(NamedTuple): + whatever = 0 + @skipUnless(PY36, 'Python 3.6 required') def test_annotation_usage(self): tim = CoolEmployee('Tim', 9000) @@ -2055,10 +2225,18 @@ class NonDefaultAfterDefault(NamedTuple): @skipUnless(PY36, 'Python 3.6 required') def test_annotation_usage_with_methods(self): - self.assertEquals(XMeth(1).double(), 2) - self.assertEquals(XMeth(42).x, XMeth(42)[0]) - self.assertEquals(XMethBad(1)._fields, ('x',)) - self.assertEquals(XMethBad(1).__annotations__, {'x': int}) + self.assertEqual(XMeth(1).double(), 2) + self.assertEqual(XMeth(42).x, XMeth(42)[0]) + self.assertEqual(str(XRepr(42)), '42 -> 1') + self.assertEqual(XRepr(1, 2) + XRepr(3), 0) + + with self.assertRaises(AttributeError): + exec(""" +class XMethBad(NamedTuple): + x: int + def _fields(self): + return 'no chance for this' +""") @skipUnless(PY36, 'Python 3.6 required') def test_namedtuple_keyword_usage(self): @@ -2138,6 +2316,12 @@ def test_basics(self): Pattern[Union[str, bytes]] Match[Union[bytes, str]] + def test_alias_equality(self): + self.assertEqual(Pattern[str], Pattern[str]) + self.assertNotEqual(Pattern[str], Pattern[bytes]) + self.assertNotEqual(Pattern[str], Match[str]) + self.assertNotEqual(Pattern[str], str) + def test_errors(self): with self.assertRaises(TypeError): # Doesn't fit AnyStr. @@ -2152,6 +2336,9 @@ def test_errors(self): with self.assertRaises(TypeError): # We don't support isinstance(). isinstance(42, Pattern[str]) + with self.assertRaises(TypeError): + # We don't support issubclass(). + issubclass(Pattern[bytes], Pattern[str]) def test_repr(self): self.assertEqual(repr(Pattern), 'Pattern[~AnyStr]') diff --git a/Lib/typing.py b/Lib/typing.py index c9e341753769e0..efe358faf20988 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -10,6 +10,12 @@ import collections.abc as collections_abc except ImportError: import collections as collections_abc # Fallback for PY3.2. +try: + from types import SlotWrapperType, MethodWrapperType, MethodDescriptorType +except ImportError: + SlotWrapperType = type(object.__init__) + MethodWrapperType = type(object().__str__) + MethodDescriptorType = type(str.join) # Please keep __all__ alphabetized within each category. @@ -62,6 +68,7 @@ 'SupportsRound', # Concrete collection types. + 'Counter', 'Deque', 'Dict', 'DefaultDict', @@ -849,19 +856,6 @@ def _next_in_mro(cls): return next_in_mro -def _valid_for_check(cls): - """An internal helper to prohibit isinstance([1], List[str]) etc.""" - if cls is Generic: - raise TypeError("Class %r cannot be used with class " - "or instance checks" % cls) - if ( - cls.__origin__ is not None and - sys._getframe(3).f_globals['__name__'] not in ['abc', 'functools'] - ): - raise TypeError("Parameterized generics cannot be used with class " - "or instance checks") - - def _make_subclasshook(cls): """Construct a __subclasshook__ callable that incorporates the associated __extra__ class in subclass checks performed @@ -872,7 +866,6 @@ def _make_subclasshook(cls): # Registered classes need not be checked here because # cls and its extra share the same _abc_registry. def __extrahook__(subclass): - _valid_for_check(cls) res = cls.__extra__.__subclasshook__(subclass) if res is not NotImplemented: return res @@ -887,7 +880,6 @@ def __extrahook__(subclass): else: # For non-ABC extras we'll just call issubclass(). def __extrahook__(subclass): - _valid_for_check(cls) if cls.__extra__ and issubclass(subclass, cls.__extra__): return True return NotImplemented @@ -974,6 +966,7 @@ def __new__(cls, name, bases, namespace, # remove bare Generic from bases if there are other generic bases if any(isinstance(b, GenericMeta) and b is not Generic for b in bases): bases = tuple(b for b in bases if b is not Generic) + namespace.update({'__origin__': origin, '__extra__': extra}) self = super().__new__(cls, name, bases, namespace, _root=True) self.__parameters__ = tvars @@ -982,8 +975,6 @@ def __new__(cls, name, bases, namespace, self.__args__ = tuple(... if a is _TypingEllipsis else () if a is _TypingEmpty else a for a in args) if args else None - self.__origin__ = origin - self.__extra__ = extra # Speed hack (https://github.com/python/typing/issues/196). self.__next_in_mro__ = _next_in_mro(self) # Preserve base classes on subclassing (__bases__ are type erased now). @@ -994,20 +985,56 @@ def __new__(cls, name, bases, namespace, # with issubclass() and isinstance() in the same way as their # collections.abc counterparts (e.g., isinstance([], Iterable)). if ( - # allow overriding '__subclasshook__' not in namespace and extra or - hasattr(self.__subclasshook__, '__name__') and - self.__subclasshook__.__name__ == '__extrahook__' + # allow overriding + getattr(self.__subclasshook__, '__name__', '') == '__extrahook__' ): self.__subclasshook__ = _make_subclasshook(self) if isinstance(extra, abc.ABCMeta): self._abc_registry = extra._abc_registry + self._abc_cache = extra._abc_cache + elif origin is not None: + self._abc_registry = origin._abc_registry + self._abc_cache = origin._abc_cache if origin and hasattr(origin, '__qualname__'): # Fix for Python 3.2. self.__qualname__ = origin.__qualname__ - self.__tree_hash__ = hash(self._subs_tree()) if origin else hash((self.__name__,)) + self.__tree_hash__ = (hash(self._subs_tree()) if origin else + super(GenericMeta, self).__hash__()) return self + # _abc_negative_cache and _abc_negative_cache_version + # realised as descriptors, since GenClass[t1, t2, ...] always + # share subclass info with GenClass. + # This is an important memory optimization. + @property + def _abc_negative_cache(self): + if isinstance(self.__extra__, abc.ABCMeta): + return self.__extra__._abc_negative_cache + return _gorg(self)._abc_generic_negative_cache + + @_abc_negative_cache.setter + def _abc_negative_cache(self, value): + if self.__origin__ is None: + if isinstance(self.__extra__, abc.ABCMeta): + self.__extra__._abc_negative_cache = value + else: + self._abc_generic_negative_cache = value + + @property + def _abc_negative_cache_version(self): + if isinstance(self.__extra__, abc.ABCMeta): + return self.__extra__._abc_negative_cache_version + return _gorg(self)._abc_generic_negative_cache_version + + @_abc_negative_cache_version.setter + def _abc_negative_cache_version(self, value): + if self.__origin__ is None: + if isinstance(self.__extra__, abc.ABCMeta): + self.__extra__._abc_negative_cache_version = value + else: + self._abc_generic_negative_cache_version = value + def _get_type_vars(self, tvars): if self.__origin__ and self.__parameters__: _get_type_vars(self.__parameters__, tvars) @@ -1095,8 +1122,10 @@ def __getitem__(self, params): _check_generic(self, params) tvars = _type_vars(params) args = params + + prepend = (self,) if self.__origin__ is None else () return self.__class__(self.__name__, - self.__bases__, + prepend + self.__bases__, _no_slots_copy(self.__dict__), tvars=tvars, args=args, @@ -1104,6 +1133,17 @@ def __getitem__(self, params): extra=self.__extra__, orig_bases=self.__orig_bases__) + def __subclasscheck__(self, cls): + if self.__origin__ is not None: + if sys._getframe(1).f_globals['__name__'] not in ['abc', 'functools']: + raise TypeError("Parameterized generics cannot be used with class " + "or instance checks") + return False + if self is Generic: + raise TypeError("Class %r cannot be used with class " + "or instance checks" % self) + return super().__subclasscheck__(cls) + def __instancecheck__(self, instance): # Since we extend ABC.__subclasscheck__ and # ABC.__instancecheck__ inlines the cache checking done by the @@ -1398,6 +1438,11 @@ def _get_defaults(func): return res +_allowed_types = (types.FunctionType, types.BuiltinFunctionType, + types.MethodType, types.ModuleType, + SlotWrapperType, MethodWrapperType, MethodDescriptorType) + + def get_type_hints(obj, globalns=None, localns=None): """Return type hints for an object. @@ -1452,12 +1497,7 @@ def get_type_hints(obj, globalns=None, localns=None): hints = getattr(obj, '__annotations__', None) if hints is None: # Return empty annotations for something that _could_ have them. - if ( - isinstance(obj, types.FunctionType) or - isinstance(obj, types.BuiltinFunctionType) or - isinstance(obj, types.MethodType) or - isinstance(obj, types.ModuleType) - ): + if isinstance(obj, _allowed_types): return {} else: raise TypeError('{!r} is not a module, class, method, ' @@ -1824,8 +1864,7 @@ class Deque(collections.deque, MutableSequence[T], extra=collections.deque): def __new__(cls, *args, **kwds): if _geqv(cls, Deque): - raise TypeError("Type Deque cannot be instantiated; " - "use deque() instead") + return collections.deque(*args, **kwds) return _generic_new(collections.deque, cls, *args, **kwds) @@ -1894,11 +1933,35 @@ class DefaultDict(collections.defaultdict, MutableMapping[KT, VT], def __new__(cls, *args, **kwds): if _geqv(cls, DefaultDict): - raise TypeError("Type DefaultDict cannot be instantiated; " - "use collections.defaultdict() instead") + return collections.defaultdict(*args, **kwds) return _generic_new(collections.defaultdict, cls, *args, **kwds) +class Counter(collections.Counter, Dict[T, int], extra=collections.Counter): + + __slots__ = () + + def __new__(cls, *args, **kwds): + if _geqv(cls, Counter): + return collections.Counter(*args, **kwds) + return _generic_new(collections.Counter, cls, *args, **kwds) + + +if hasattr(collections, 'ChainMap'): + # ChainMap only exists in 3.3+ + __all__.append('ChainMap') + + class ChainMap(collections.ChainMap, MutableMapping[KT, VT], + extra=collections.ChainMap): + + __slots__ = () + + def __new__(cls, *args, **kwds): + if _geqv(cls, ChainMap): + return collections.ChainMap(*args, **kwds) + return _generic_new(collections.ChainMap, cls, *args, **kwds) + + # Determine what base class to use for Generator. if hasattr(collections_abc, 'Generator'): # Sufficiently recent versions of 3.5 have a Generator ABC. @@ -1975,6 +2038,13 @@ def _make_nmtuple(name, types): _PY36 = sys.version_info[:2] >= (3, 6) +# attributes prohibited to set in NamedTuple class syntax +_prohibited = ('__new__', '__init__', '__slots__', '__getnewargs__', + '_fields', '_field_defaults', '_field_types', + '_make', '_replace', '_asdict') + +_special = ('__module__', '__name__', '__qualname__', '__annotations__') + class NamedTupleMeta(type): @@ -2002,7 +2072,9 @@ def __new__(cls, typename, bases, ns): nm_tpl._field_defaults = defaults_dict # update from user namespace without overriding special namedtuple attributes for key in ns: - if not hasattr(nm_tpl, key): + if key in _prohibited: + raise AttributeError("Cannot overwrite NamedTuple attribute " + key) + elif key not in _special and key not in nm_tpl._fields: setattr(nm_tpl, key, ns[key]) return nm_tpl diff --git a/Misc/NEWS b/Misc/NEWS index ceea2226561fd6..0fe1f9b9d651bf 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -59,6 +59,10 @@ Extension Modules Library ------- +- Issue #28556: Various updates to typing module: typing.Counter, typing.ChainMap, + improved ABC caching, etc. Original PRs by Jelle Zijlstra, Ivan Levkivskyi, + Manuel Krebber, and Łukasz Langa. + - Issue #29100: Fix datetime.fromtimestamp() regression introduced in Python 3.6.0: check minimum and maximum years. From 9268855ba6e99bf595e75b75780cf29667371f45 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 14 Feb 2017 06:11:48 -0800 Subject: [PATCH 0008/2287] Fix some sphinx warnings (#9) (#81) * Fix some deprecation warnings in Doc/conf.py * Fix an rst error in Misc/NEWS Contributed by Ryan Gonzalez @kirbyfan64 (cherry picked from commit e7ffb99f842ebff97cffa0fc90b18be4e5abecf2) --- Doc/Makefile | 2 +- Doc/conf.py | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Doc/Makefile b/Doc/Makefile index 91f937f985831a..6e1c18304080d6 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -10,7 +10,7 @@ PAPER = SOURCES = DISTVERSION = $(shell $(PYTHON) tools/extensions/patchlevel.py) -ALLSPHINXOPTS = -b $(BUILDER) -d build/doctrees -D latex_paper_size=$(PAPER) \ +ALLSPHINXOPTS = -b $(BUILDER) -d build/doctrees -D latex_elements.papersize=$(PAPER) \ $(SPHINXOPTS) . build/$(BUILDER) $(SOURCES) .PHONY: help build html htmlhelp latex text changes linkcheck \ diff --git a/Doc/conf.py b/Doc/conf.py index b1bb6208bb4b8e..b3f26d5a692163 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -88,11 +88,24 @@ # Options for LaTeX output # ------------------------ +# Get LaTeX to handle Unicode correctly +latex_elements = {'inputenc': r'\usepackage[utf8x]{inputenc}', 'utf8extra': ''} + +# Additional stuff for the LaTeX preamble. +latex_elements['preamble'] = r''' +\authoraddress{ + \strong{Python Software Foundation}\\ + Email: \email{docs@python.org} +} +\let\Verbatim=\OriginalVerbatim +\let\endVerbatim=\endOriginalVerbatim +''' + # The paper size ('letter' or 'a4'). -latex_paper_size = 'a4' +latex_elements['papersize'] = 'a4' # The font size ('10pt', '11pt' or '12pt'). -latex_font_size = '10pt' +latex_elements['font_size'] = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, document class [howto/manual]). @@ -125,22 +138,9 @@ for fn in os.listdir('howto') if fn.endswith('.rst') and fn != 'index.rst') -# Additional stuff for the LaTeX preamble. -latex_preamble = r''' -\authoraddress{ - \strong{Python Software Foundation}\\ - Email: \email{docs@python.org} -} -\let\Verbatim=\OriginalVerbatim -\let\endVerbatim=\endOriginalVerbatim -''' - # Documents to append as an appendix to all manuals. latex_appendices = ['glossary', 'about', 'license', 'copyright'] -# Get LaTeX to handle Unicode correctly -latex_elements = {'inputenc': r'\usepackage[utf8x]{inputenc}', 'utf8extra': ''} - # Options for Epub output # ----------------------- From db3deb98e969d3f43b169cd320abd46b21a10c6d Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 14 Feb 2017 08:54:59 -0800 Subject: [PATCH 0009/2287] bpo-29521 Fix two minor documentation build warnings (#41) (#83) Much of bpo-29521 was fixed in parallel with commit e7ffb99 . This cleans up the rest. Apply parallel change to Doc/make.bat to read "set SPHINXOPTS=-D latex_elements.papersize=" I don't have a Windows system on which to observe the warning, but it should be necessary. The warning: .../workspace/cpython_github/Doc/faq/windows.rst:303: WARNING: unknown option: -t In the Windows FAQ, `How do I keep editors from inserting tabs into my Python source?`, contained a reference to a Python -t option. In Python 2.x, this caused Python to issue warnings about lines with mixed spaces and tabs, but as of Python 3.6 it does nothing. Per discussion at http://bugs.python.org/issue29387, take their wording. Python [3] raises an IndentationError or TabError. Tabnanny is now a module. (cherry picked from commit 3d707be950b387552585451071928e7b39cdfa53) --- Doc/faq/windows.rst | 7 ++++--- Doc/make.bat | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Doc/faq/windows.rst b/Doc/faq/windows.rst index d7253436beaf61..b9b7b8d359bdf2 100644 --- a/Doc/faq/windows.rst +++ b/Doc/faq/windows.rst @@ -300,9 +300,10 @@ this respect, and is easily configured to use spaces: Take :menuselection:`Tools --> Options --> Tabs`, and for file type "Default" set "Tab size" and "Indent size" to 4, and select the "Insert spaces" radio button. -If you suspect mixed tabs and spaces are causing problems in leading whitespace, -run Python with the :option:`-t` switch or run ``Tools/Scripts/tabnanny.py`` to -check a directory tree in batch mode. +Python raises :exc:`IndentationError` or :exc:`TabError` if mixed tabs +and spaces are causing problems in leading whitespace. +You may also run the :mod:`tabnanny` module to check a directory tree +in batch mode. How do I check for a keypress without blocking? diff --git a/Doc/make.bat b/Doc/make.bat index da1f8765a4f358..d0b59618261011 100644 --- a/Doc/make.bat +++ b/Doc/make.bat @@ -86,7 +86,7 @@ goto end :build if NOT "%PAPER%" == "" ( - set SPHINXOPTS=-D latex_paper_size=%PAPER% %SPHINXOPTS% + set SPHINXOPTS=-D latex_elements.papersize=%PAPER% %SPHINXOPTS% ) cmd /C %SPHINXBUILD% %SPHINXOPTS% -b%1 -dbuild\doctrees . %BUILDDIR%\%* From 7d5587e687ba78563b0f026019e638800497e021 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Wed, 15 Feb 2017 18:59:47 +0900 Subject: [PATCH 0010/2287] Update URL of Mersenne Twister Home Page (#20) (#115) --- Modules/_randommodule.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c index 0d3282db8f2810..e5dd2c96166384 100644 --- a/Modules/_randommodule.c +++ b/Modules/_randommodule.c @@ -2,7 +2,7 @@ /* ------------------------------------------------------------------ The code in this module was based on a download from: - http://www.math.keio.ac.jp/~matumoto/MT2002/emt19937ar.html + http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html It was modified in 2002 by Raymond Hettinger as follows: @@ -60,8 +60,8 @@ Any feedback is very welcome. - http://www.math.keio.ac.jp/matumoto/emt.html - email: matumoto@math.keio.ac.jp + http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html + email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) */ /* ---------------------------------------------------------------*/ From 1e8cc88a48a049b064f786bb4b97ea60b70dc504 Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Wed, 15 Feb 2017 13:29:16 -0600 Subject: [PATCH 0011/2287] Backport master's README.rst to 3.6 (GH-86) Includes GH-2, GH-70, GH-73 (GH-79), and GH-21. --- README | 242 ----------------------------------------------------- README.rst | 235 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 235 insertions(+), 242 deletions(-) delete mode 100644 README create mode 100644 README.rst diff --git a/README b/README deleted file mode 100644 index 03c4b03f68a1ff..00000000000000 --- a/README +++ /dev/null @@ -1,242 +0,0 @@ -This is Python version 3.6.1 release candidate 1 -================================================ - -Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, -2012, 2013, 2014, 2015, 2016, 2017 Python Software Foundation. All rights -reserved. - -Python 3.x is a new version of the language, which is incompatible with the -2.x line of releases. The language is mostly the same, but many details, -especially how built-in objects like dictionaries and strings work, -have changed considerably, and a lot of deprecated features have finally -been removed. - -Using Python ------------- - -Installable Python kits, and information about using Python, are available at -`python.org`_. - -.. _python.org: https://www.python.org/ - - -Build Instructions ------------------- - -On Unix, Linux, BSD, OSX, and Cygwin: - - ./configure - make - make test - sudo make install - -This will install Python as python3. - -You can pass many options to the configure script; run "./configure --help" to -find out more. On OSX and Cygwin, the executable is called python.exe; -elsewhere it's just python. - -On Mac OS X, if you have configured Python with --enable-framework, you should -use "make frameworkinstall" to do the installation. Note that this installs the -Python executable in a place that is not normally on your PATH, you may want to -set up a symlink in /usr/local/bin. - -On Windows, see PCbuild/readme.txt. - -If you wish, you can create a subdirectory and invoke configure from there. -For example: - - mkdir debug - cd debug - ../configure --with-pydebug - make - make test - -(This will fail if you *also* built at the top-level directory. -You should do a "make clean" at the toplevel first.) - -To get an optimized build of Python, "configure --enable-optimizations" before -you run make. This sets the default make targets up to enable Profile Guided -Optimization (PGO) and may be used to auto-enable Link Time Optimization (LTO) -on some platforms. For more details, see the sections bellow. - - -Profile Guided Optimization ---------------------------- - -PGO takes advantage of recent versions of the GCC or Clang compilers. -If ran, "make profile-opt" will do several steps. - -First, the entire Python directory is cleaned of temporary files that -may have resulted in a previous compilation. - -Then, an instrumented version of the interpreter is built, using suitable -compiler flags for each flavour. Note that this is just an intermediary -step and the binary resulted after this step is not good for real life -workloads, as it has profiling instructions embedded inside. - -After this instrumented version of the interpreter is built, the Makefile -will automatically run a training workload. This is necessary in order to -profile the interpreter execution. Note also that any output, both stdout -and stderr, that may appear at this step is suppressed. - -Finally, the last step is to rebuild the interpreter, using the information -collected in the previous one. The end result will be a Python binary -that is optimized and suitable for distribution or production installation. - - -Link Time Optimization ----------------------- - -Enabled via configure's --with-lto flag. LTO takes advantages of recent -compiler toolchains ability to optimize across the otherwise arbitrary .o file -boundary when building final executables or shared libraries for additional -performance gains. - - -What's New ----------- - -We have a comprehensive overview of the changes in the "What's New in -Python 3.6" document, found at - - https://docs.python.org/3.6/whatsnew/3.6.html - -For a more detailed change log, read Misc/NEWS (though this file, too, -is incomplete, and also doesn't list anything merged in from the 2.7 -release under development). - -If you want to install multiple versions of Python see the section below -entitled "Installing multiple versions". - - -Documentation -------------- - -Documentation for Python 3.6 is online, updated daily: - - https://docs.python.org/3.6/ - -It can also be downloaded in many formats for faster access. The documentation -is downloadable in HTML, PDF, and reStructuredText formats; the latter version -is primarily for documentation authors, translators, and people with special -formatting requirements. - -If you would like to contribute to the development of Python, relevant -documentation is available at: - - https://docs.python.org/devguide/ - -For information about building Python's documentation, refer to Doc/README.txt. - - -Converting From Python 2.x to 3.x ---------------------------------- - -Python starting with 2.6 contains features to help locating code that needs to -be changed, such as optional warnings when deprecated features are used, and -backported versions of certain key Python 3.x features. - -A source-to-source translation tool, "2to3", can take care of the mundane task -of converting large amounts of source code. It is not a complete solution but -is complemented by the deprecation warnings in 2.6. See -https://docs.python.org/3.6/library/2to3.html for more information. - - -Testing -------- - -To test the interpreter, type "make test" in the top-level directory. -The test set produces some output. You can generally ignore the messages -about skipped tests due to optional features which can't be imported. -If a message is printed about a failed test or a traceback or core dump -is produced, something is wrong. - -By default, tests are prevented from overusing resources like disk space and -memory. To enable these tests, run "make testall". - -IMPORTANT: If the tests fail and you decide to mail a bug report, *don't* -include the output of "make test". It is useless. Run the failing test -manually, as follows: - - ./python -m test -v test_whatever - -(substituting the top of the source tree for '.' if you built in a different -directory). This runs the test in verbose mode. - - -Installing multiple versions ----------------------------- - -On Unix and Mac systems if you intend to install multiple versions of Python -using the same installation prefix (--prefix argument to the configure script) -you must take care that your primary python executable is not overwritten by the -installation of a different version. All files and directories installed using -"make altinstall" contain the major and minor version and can thus live -side-by-side. "make install" also creates ${prefix}/bin/python3 which refers to -${prefix}/bin/pythonX.Y. If you intend to install multiple versions using the -same prefix you must decide which version (if any) is your "primary" version. -Install that version using "make install". Install all other versions using -"make altinstall". - -For example, if you want to install Python 2.7, 3.5, and 3.6 with 3.6 being the -primary version, you would execute "make install" in your 3.6 build directory -and "make altinstall" in the others. - - -Issue Tracker and Mailing List ------------------------------- - -We're soliciting bug reports about all aspects of the language. Fixes are also -welcome, preferably in unified diff format. Please use the issue tracker: - - https://bugs.python.org/ - -If you're not sure whether you're dealing with a bug or a feature, use the -mailing list: - - python-dev@python.org - -To subscribe to the list, use the mailman form: - - https://mail.python.org/mailman/listinfo/python-dev/ - - -Proposals for enhancement -------------------------- - -If you have a proposal to change Python, you may want to send an email to the -comp.lang.python or `python-ideas`_ mailing lists for initial feedback. A Python -Enhancement Proposal (PEP) may be submitted if your idea gains ground. All -current PEPs, as well as guidelines for submitting a new PEP, are listed at -https://www.python.org/dev/peps/. - -.. _python-ideas: https://mail.python.org/mailman/listinfo/python-ideas/ - -Release Schedule ----------------- - -See PEP 494 for release details: https://www.python.org/dev/peps/pep-0494/ - - -Copyright and License Information ---------------------------------- - -Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, -2012, 2013, 2014, 2015, 2016 Python Software Foundation. All rights reserved. - -Copyright (c) 2000 BeOpen.com. All rights reserved. - -Copyright (c) 1995-2001 Corporation for National Research Initiatives. All -rights reserved. - -Copyright (c) 1991-1995 Stichting Mathematisch Centrum. All rights reserved. - -See the file "LICENSE" for information on the history of this software, -terms & conditions for usage, and a DISCLAIMER OF ALL WARRANTIES. - -This Python distribution contains *no* GNU General Public License (GPL) code, -so it may be used in proprietary projects. There are interfaces to some GNU -code but these are entirely optional. - -All trademarks referenced herein are property of their respective holders. diff --git a/README.rst b/README.rst new file mode 100644 index 00000000000000..d02ae64b7fc660 --- /dev/null +++ b/README.rst @@ -0,0 +1,235 @@ +This is Python version 3.6.1 release candidate 1 +================================================ + +.. image:: https://travis-ci.org/python/cpython.svg?branch=3.6 + :alt: CPython build status on Travis CI + :target: https://travis-ci.org/python/cpython + +.. image:: https://codecov.io/gh/python/cpython/branch/3.6/graph/badge.svg + :alt: CPython code coverage on Codecov + :target: https://codecov.io/gh/python/cpython + +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, +2012, 2013, 2014, 2015, 2016, 2017 Python Software Foundation. All rights +reserved. + +See the end of this file for further copyright and license information. + + +Using Python +------------ + +Installable Python kits, and information about using Python, are available at +`python.org`_. + +.. _python.org: https://www.python.org/ + + +Build Instructions +------------------ + +On Unix, Linux, BSD, OSX, and Cygwin:: + + ./configure + make + make test + sudo make install + +This will install Python as python3. + +You can pass many options to the configure script; run ``./configure --help`` +to find out more. On OSX and Cygwin, the executable is called ``python.exe``; +elsewhere it's just ``python``. + +On Mac OS X, if you have configured Python with ``--enable-framework``, you +should use ``make frameworkinstall`` to do the installation. Note that this +installs the Python executable in a place that is not normally on your PATH, +you may want to set up a symlink in ``/usr/local/bin``. + +On Windows, see `PCbuild/readme.txt +`_. + +If you wish, you can create a subdirectory and invoke configure from there. +For example:: + + mkdir debug + cd debug + ../configure --with-pydebug + make + make test + +(This will fail if you *also* built at the top-level directory. You should do +a ``make clean`` at the toplevel first.) + +To get an optimized build of Python, ``configure --enable-optimizations`` +before you run ``make``. This sets the default make targets up to enable +Profile Guided Optimization (PGO) and may be used to auto-enable Link Time +Optimization (LTO) on some platforms. For more details, see the sections +below. + + +Profile Guided Optimization +--------------------------- + +PGO takes advantage of recent versions of the GCC or Clang compilers. If ran, +``make profile-opt`` will do several steps. + +First, the entire Python directory is cleaned of temporary files that may have +resulted in a previous compilation. + +Then, an instrumented version of the interpreter is built, using suitable +compiler flags for each flavour. Note that this is just an intermediary step +and the binary resulted after this step is not good for real life workloads, as +it has profiling instructions embedded inside. + +After this instrumented version of the interpreter is built, the Makefile will +automatically run a training workload. This is necessary in order to profile +the interpreter execution. Note also that any output, both stdout and stderr, +that may appear at this step is suppressed. + +Finally, the last step is to rebuild the interpreter, using the information +collected in the previous one. The end result will be a Python binary that is +optimized and suitable for distribution or production installation. + + +Link Time Optimization +---------------------- + +Enabled via configure's ``--with-lto`` flag. LTO takes advantage of the +ability of recent compiler toolchains to optimize across the otherwise +arbitrary ``.o`` file boundary when building final executables or shared +libraries for additional performance gains. + + +What's New +---------- + +We have a comprehensive overview of the changes in the `What's New in Python +3.6 `_ document. For a more +detailed change log, read `Misc/NEWS +`_, but a full +accounting of changes can only be gleaned from the `commit history +`_. + +If you want to install multiple versions of Python see the section below +entitled "Installing multiple versions". + + +Documentation +------------- + +`Documentation for Python 3.6 `_ is online, +updated daily. + +It can also be downloaded in many formats for faster access. The documentation +is downloadable in HTML, PDF, and reStructuredText formats; the latter version +is primarily for documentation authors, translators, and people with special +formatting requirements. + +If you would like to contribute to the development of Python, relevant +documentation is available in the `Python Developer's Guide +`_. + +For information about building Python's documentation, refer to `Doc/README.txt +`_. + + +Converting From Python 2.x to 3.x +--------------------------------- + +Significant backward incompatible changes were made for the release of Python +3.0, which may cause programs written for Python 2 to fail when run with Python +3. For more information about porting your code from Python 2 to Python 3, see +the `Porting HOWTO `_. + + +Testing +------- + +To test the interpreter, type ``make test`` in the top-level directory. The +test set produces some output. You can generally ignore the messages about +skipped tests due to optional features which can't be imported. If a message +is printed about a failed test or a traceback or core dump is produced, +something is wrong. + +By default, tests are prevented from overusing resources like disk space and +memory. To enable these tests, run ``make testall``. + +If any tests fail, you can re-run the failing test(s) in verbose mode:: + + make test TESTOPTS="-v test_that_failed" + +If the failure persists and appears to be a problem with Python rather than +your environment, you can `file a bug report `_ and +include relevant output from that command to show the issue. + + +Installing multiple versions +---------------------------- + +On Unix and Mac systems if you intend to install multiple versions of Python +using the same installation prefix (``--prefix`` argument to the configure +script) you must take care that your primary python executable is not +overwritten by the installation of a different version. All files and +directories installed using ``make altinstall`` contain the major and minor +version and can thus live side-by-side. ``make install`` also creates +``${prefix}/bin/python3`` which refers to ``${prefix}/bin/pythonX.Y``. If you +intend to install multiple versions using the same prefix you must decide which +version (if any) is your "primary" version. Install that version using ``make +install``. Install all other versions using ``make altinstall``. + +For example, if you want to install Python 2.7, 3.5, and 3.6 with 3.6 being the +primary version, you would execute ``make install`` in your 3.6 build directory +and ``make altinstall`` in the others. + + +Issue Tracker and Mailing List +------------------------------ + +Bug reports are welcome! You can use the `issue tracker +`_ to report bugs, and/or submit pull requests `on +GitHub `_. + +You can also follow development discussion on the `python-dev mailing list +`_. + + +Proposals for enhancement +------------------------- + +If you have a proposal to change Python, you may want to send an email to the +comp.lang.python or `python-ideas`_ mailing lists for initial feedback. A +Python Enhancement Proposal (PEP) may be submitted if your idea gains ground. +All current PEPs, as well as guidelines for submitting a new PEP, are listed at +`python.org/dev/peps/ `_. + +.. _python-ideas: https://mail.python.org/mailman/listinfo/python-ideas/ + + +Release Schedule +---------------- + +See :pep:`494` for Python 3.6 release details. + + +Copyright and License Information +--------------------------------- + +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, +2012, 2013, 2014, 2015, 2016 Python Software Foundation. All rights reserved. + +Copyright (c) 2000 BeOpen.com. All rights reserved. + +Copyright (c) 1995-2001 Corporation for National Research Initiatives. All +rights reserved. + +Copyright (c) 1991-1995 Stichting Mathematisch Centrum. All rights reserved. + +See the file "LICENSE" for information on the history of this software, terms & +conditions for usage, and a DISCLAIMER OF ALL WARRANTIES. + +This Python distribution contains *no* GNU General Public License (GPL) code, +so it may be used in proprietary projects. There are interfaces to some GNU +code but these are entirely optional. + +All trademarks referenced herein are property of their respective holders. From 7224a049b88ed37c510861528147e0db54911bb7 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 15 Feb 2017 11:38:48 -0800 Subject: [PATCH 0012/2287] bpo-29481: add versionadded 3.6.1 to typing.Deque docs (#108) (cherry picked from commit 7e147f1ddb8233964ff0981e6b64fc12edac99aa) --- Doc/library/typing.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 6c8982ba743526..d130e1759d8f59 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -574,6 +574,8 @@ The module defines the following classes, functions and decorators: A generic version of :class:`collections.deque`. + .. versionadded:: 3.6.1 + .. class:: List(list, MutableSequence[T]) Generic version of :class:`list`. From 02e3357e089f37c23d0f3d1ebee9aa3d7a1492a9 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 15 Feb 2017 15:14:41 -0800 Subject: [PATCH 0013/2287] bpo-29521 update Misc/ACKS (#110) (cherry picked from commit 6420088b924a23e5de40be6623d2a80b12f71d97) --- Misc/ACKS | 1 + 1 file changed, 1 insertion(+) diff --git a/Misc/ACKS b/Misc/ACKS index a6b3df12ff230c..1d6e773b553c52 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -347,6 +347,7 @@ A. Jesse Jiryu Davis Merlijn van Deen John DeGood Ned Deily +Jim DeLaHunt Vincent Delft Arnaud Delobelle Konrad Delong From b300c660d34d2027d443098ea605a8e0eb51d383 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 16 Feb 2017 00:56:54 +0100 Subject: [PATCH 0014/2287] Backport36 doc fixes: PR#68 and PR#124 (#125) * Travis CI: run rstlint.py in the docs job (#68) Currently, http://buildbot.python.org/all/buildslaves/ware-docs buildbot is only run as post-commit. For example, bpo-29521 (PR#41) introduced two warnings, unnotified by the Travis CI docs job. Modify the docs job to run toosl/rstlint.py. Fix also the two minor warnings which causes the buildbot slave to fail. (cherry picked from commit 2b501866ed493758e4c4b29f0ce9b24023d910a1) * Doc/Makefile: set PYTHON to python3 (#124) rstlint.py run by "make check" doesn't support Python 2. "make venv" runs "$(PYTHON) -m venv", whereas Python 2 doens't provide the venv module: it's a module of Python 3 standard library. (cherry picked from commit 91b0e7d0ca7c59df28f6a6fc1e8eb86a3925b76c) --- Doc/Makefile | 2 +- Doc/faq/windows.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/Makefile b/Doc/Makefile index 6e1c18304080d6..eb62df5b87cebe 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -4,7 +4,7 @@ # # You can set these variables from the command line. -PYTHON = python +PYTHON = python3 SPHINXBUILD = sphinx-build PAPER = SOURCES = diff --git a/Doc/faq/windows.rst b/Doc/faq/windows.rst index b9b7b8d359bdf2..6ac83e45d2e815 100644 --- a/Doc/faq/windows.rst +++ b/Doc/faq/windows.rst @@ -300,9 +300,9 @@ this respect, and is easily configured to use spaces: Take :menuselection:`Tools --> Options --> Tabs`, and for file type "Default" set "Tab size" and "Indent size" to 4, and select the "Insert spaces" radio button. -Python raises :exc:`IndentationError` or :exc:`TabError` if mixed tabs +Python raises :exc:`IndentationError` or :exc:`TabError` if mixed tabs and spaces are causing problems in leading whitespace. -You may also run the :mod:`tabnanny` module to check a directory tree +You may also run the :mod:`tabnanny` module to check a directory tree in batch mode. From d372cda5cd46712c4e59262ec1ab981773b20bff Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Sat, 18 Feb 2017 16:12:06 -0800 Subject: [PATCH 0015/2287] bpo-29579: Removes readme.txt from the installer. (#161) --- Misc/NEWS | 2 ++ Tools/msi/exe/exe_files.wxs | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 0fe1f9b9d651bf..5f682e5d8fb4a4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -160,6 +160,8 @@ Library Windows ------- +- bpo-29579: Removes readme.txt from the installer + - Issue #29326: Ignores blank lines in ._pth files (Patch by Alexey Izbyshev) - Issue #28164: Correctly handle special console filenames (patch by Eryk Sun) diff --git a/Tools/msi/exe/exe_files.wxs b/Tools/msi/exe/exe_files.wxs index 01385874fa90b7..e675c21c8975ef 100644 --- a/Tools/msi/exe/exe_files.wxs +++ b/Tools/msi/exe/exe_files.wxs @@ -8,9 +8,6 @@ - - - From 0683d6889bd4430599d22e12e201b8e9c45be5a2 Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Sun, 19 Feb 2017 10:03:35 +0530 Subject: [PATCH 0016/2287] [3.6] bpo-29571: Use correct locale encoding in test_re (#149) (#153) ``local.getlocale(locale.LC_CTYPE)`` and ``locale.getpreferredencoding(False)`` may give different answers in some cases (such as the ``en_IN`` locale). ``re.LOCALE`` uses the latter, so update the test case to match. --- Lib/test/test_re.py | 2 +- Misc/NEWS | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index b945cf094e99c1..a506b98be4aeb2 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1402,7 +1402,7 @@ def test_ascii_and_unicode_flag(self): def test_locale_flag(self): import locale - _, enc = locale.getlocale(locale.LC_CTYPE) + enc = locale.getpreferredencoding(False) # Search non-ASCII letter for i in range(128, 256): try: diff --git a/Misc/NEWS b/Misc/NEWS index 5f682e5d8fb4a4..b631fde8e52e0d 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -202,6 +202,11 @@ Documentation Tests ----- +- Issue #29571: to match the behaviour of the ``re.LOCALE`` flag, + test_re.test_locale_flag now uses ``locale.getpreferredencoding(False)`` to + determine the candidate encoding for the test regex (allowing it to correctly + skip the test when the default locale encoding is a multi-byte encoding) + - Issue #28950: Disallow -j0 to be combined with -T/-l in regrtest command line arguments. From 3337d33a4518f7ab8a7ab6c9a75b8b92ba348b27 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Sun, 19 Feb 2017 14:11:59 +0900 Subject: [PATCH 0017/2287] [backport to 3.6] bpo-29529: Add .travis.yml to 3.6 branch (#25) * Add .travis.yml to 3.6 branch * Travis CI: run rstlint.py in the docs job (#68) Currently, http://buildbot.python.org/all/buildslaves/ware-docs buildbot is only run as post-commit. For example, bpo-29521 (PR#41) introduced two warnings, unnotified by the Travis CI docs job. Modify the docs job to run toosl/rstlint.py. Fix also the two minor warnings which causes the buildbot slave to fail. * Only run CI checks when appropriate files have changed (#74) Closes python/core-workflow#14 * Use 'make check' instead of 'python3 tools/rstlint.py' (#96) --- .travis.yml | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000000000..dc3a00d1f4b5a3 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,104 @@ +language: c +dist: trusty +sudo: false +group: beta + +# To cache doc-building dependencies. +cache: pip + +os: + - linux + # macOS builds are disabled as the machines are under-provisioned on Travis, + # adding up to an extra hour completing a full CI run. + #- osx + +compiler: + - clang + - gcc + +env: + - TESTING=cpython + +matrix: + allow_failures: + - env: + - TESTING=coverage + include: + - os: linux + language: python + python: 3.5 + env: + - TESTING=docs + before_script: + - | + if git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '^Doc/' + then + echo "Docs weren't updated, stopping build process." + exit + fi + cd Doc + make venv PYTHON=python3 + script: + - make html SPHINXBUILD="./venv/bin/python3 -m sphinx" SPHINXOPTS="-q" + - make check + - os: linux + language: c + compiler: clang + env: + - TESTING=coverage + before_script: + - | + if ! git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '(\.(rst|yml)$)|(^Doc)/' + then + echo "Only docs were updated, stopping build process." + exit + fi + ./configure + make -s -j4 + # Need a venv that can parse covered code. + ./python -m venv venv + ./venv/bin/python -m pip install -U coverage + script: + # Skip tests that re-run the entire test suite. + - ./venv/bin/python -m coverage run --pylib -m test -uall -x test_multiprocessing_fork -x test_multiprocessing_forkserver -x test_multiprocessing_spawn + after_script: # Probably should be after_success once test suite updated to run under coverage.py. + # Make the `coverage` command available to Codecov w/ a version of Python that can parse all source files. + - source ./venv/bin/activate + - bash <(curl -s https://codecov.io/bash) + - os: linux + language: cpp + compiler: clang + env: + - TESTING="C++ header compatibility" + before_script: + - ./configure + script: + - echo '#include "Python.h"' > test.cc && $CXX -c test.cc -o /dev/null -I ./Include -I . + +# Travis provides only 2 cores, so don't overdue the parallelism and waste memory. +before_script: + - | + if ! git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '(\.(rst|yml)$)|(^Doc)/' + then + echo "Only docs were updated, stopping build process." + exit + fi + ./configure --with-pydebug + make -j4 + +script: + # `-r -w` implicitly provided through `make buildbottest`. + - make buildbottest TESTOPTS="-j4" + +notifications: + email: false + irc: + channels: + # This is set to a secure variable to prevent forks from notifying the + # IRC channel whenever they fail a build. This can be removed when travis + # implements https://github.com/travis-ci/travis-ci/issues/1094. + # The actual value here is: irc.freenode.net#python-dev + - secure: "s7kAkpcom2yUJ8XqyjFI0obJmhAGrn1xmoivdaPdgBIA++X47TBp1x4pgDsbEsoalef7bEwa4l07KdT4qa+DOd/c4QxaWom7fbN3BuLVsZuVfODnl79+gYq/TAbGfyH+yDs18DXrUfPgwD7C5aW32ugsqAOd4iWzfGJQ5OrOZzqzGjYdYQUEkJFXgxDEIb4aHvxNDWGO3Po9uKISrhb5saQ0l776yLo1Ur7M4oxl8RTbCdgX0vf5TzPg52BgvZpOgt3DHOUYPeiJLKNjAE6ibg0U95sEvMfHX77nz4aFY4/3UI6FFaRla34rZ+mYKrn0TdxOhera1QOgPmM6HzdO4K44FpfK1DS0Xxk9U9/uApq+cG0bU3W+cVUHDBe5+90lpRBAXHeHCgT7TI8gec614aiT8lEr3+yH8OBRYGzkjNK8E2LJZ/SxnVxDe7aLF6AWcoWLfS6/ziAIBFQ5Nc4U72CT8fGVSkl8ywPiRlvixKdvTODMSZo0jMqlfZSNaAPTsNRx4wu5Uis4qekwe32Fz4aB6KGpsuuVjBi+H6v0RKxNJNGY3JKDiEH2TK0UE2auJ5GvLW48aUVFcQMB7euCWYXlSWVRHh3WLU8QXF29Dw4JduRZqUpOdRgMHU79UHRq+mkE0jAS/nBcS6CvsmxCpTSrfVYuMOu32yt18QQoTyU=" + on_success: change + on_failure: always + skip_join: true From b121d737fe60e56dac5a44535e02089c6c02613d Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Sun, 19 Feb 2017 14:40:55 +0300 Subject: [PATCH 0018/2287] Tweak PEP 519 documentation in stdlib (#164) * Drop duplicate word 'object' in lzma docs * Fix typo in os docs: fpr -> for (cherry picked from commit d4d48743ac20854de104e08dd66972471684f676) --- Doc/library/lzma.rst | 4 ++-- Doc/library/os.rst | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/lzma.rst b/Doc/library/lzma.rst index 5edb23de83bcff..cce6c23e611e31 100644 --- a/Doc/library/lzma.rst +++ b/Doc/library/lzma.rst @@ -39,7 +39,7 @@ Reading and writing compressed files object`. The *filename* argument can be either an actual file name (given as a - :class:`str`, :class:`bytes` or :term:`path-like object` object), in + :class:`str`, :class:`bytes` or :term:`path-like ` object), in which case the named file is opened, or it can be an existing file object to read from or write to. @@ -76,7 +76,7 @@ Reading and writing compressed files An :class:`LZMAFile` can wrap an already-open :term:`file object`, or operate directly on a named file. The *filename* argument specifies either the file object to wrap, or the name of the file to open (as a :class:`str`, - :class:`bytes` or :term:`path-like object` object). When wrapping an + :class:`bytes` or :term:`path-like ` object). When wrapping an existing file object, the wrapped file will not be closed when the :class:`LZMAFile` is closed. diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 37fa2a2868dac9..974ab2d481e210 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -2859,7 +2859,7 @@ These functions are all available on Linux only. :ref:`not following symlinks `. .. versionchanged:: 3.6 - Accepts a :term:`path-like object` fpr *path* and *attribute*. + Accepts a :term:`path-like object` for *path* and *attribute*. .. function:: listxattr(path=None, *, follow_symlinks=True) From 7970cd483346dfd7723da214fb27399ecc574095 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Mon, 20 Feb 2017 09:46:46 +0900 Subject: [PATCH 0019/2287] bpo-29520: doc: fix deprecation warning from 'defindex' template (GH-178) --- Doc/tools/templates/indexcontent.html | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Doc/tools/templates/indexcontent.html b/Doc/tools/templates/indexcontent.html index 1076c1f51b7d19..d795c0a5586bc8 100644 --- a/Doc/tools/templates/indexcontent.html +++ b/Doc/tools/templates/indexcontent.html @@ -1,5 +1,12 @@ -{% extends "defindex.html" %} -{% block tables %} +{% extends "layout.html" %} +{%- block htmltitle -%} +{{ shorttitle }} +{%- endblock -%} +{% block body %} +

{{ docstitle|e }}

+

+ {% trans %}Welcome! This is the documentation for Python {{ release }}.{% endtrans %} +

{% trans %}Parts of the documentation:{% endtrans %}

From a4afdfcf27c2fa53c60b65867765244361abb1fc Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Sun, 19 Feb 2017 18:58:33 -0800 Subject: [PATCH 0020/2287] Change some mercurial/ hg.python.org references. (#8) (#185) (cherry picked from commit b2ee40ed9c9041dcff9c898aa19aacf9ec60308a) --- Doc/faq/general.rst | 6 +++--- Lib/idlelib/help.html | 2 +- Tools/README | 2 +- Tools/importbench/README | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst index f1e33afdabf8a5..8f6a907a8a2fda 100644 --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -159,7 +159,7 @@ How do I obtain a copy of the Python source? The latest Python source distribution is always available from python.org, at https://www.python.org/downloads/. The latest development sources can be obtained -via anonymous Mercurial access at https://hg.python.org/cpython. +at https://github.com/python/cpython/. The source distribution is a gzipped tar file containing the complete C source, Sphinx-formatted documentation, Python library modules, example programs, and @@ -222,8 +222,8 @@ releases are announced on the comp.lang.python and comp.lang.python.announce newsgroups and on the Python home page at https://www.python.org/; an RSS feed of news is available. -You can also access the development version of Python through Mercurial. See -https://docs.python.org/devguide/faq.html for details. +You can also access the development version of Python through Git. See +`The Python Developer's Guide `_ for details. How do I submit bug reports and patches for Python? diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index ffc03c4112f073..f10cd345e886c8 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -90,7 +90,7 @@

Navigation

25.5. IDLE

-

Source code: Lib/idlelib/

+

Source code: Lib/idlelib/


IDLE is Python’s Integrated Development and Learning Environment.

IDLE has the following features:

diff --git a/Tools/README b/Tools/README index 0d961de23d6cb8..edbf4fb83321ba 100644 --- a/Tools/README +++ b/Tools/README @@ -45,4 +45,4 @@ unittestgui A Tkinter based GUI test runner for unittest, with test discovery. -(*) A generic benchmark suite is maintained separately at http://hg.python.org/benchmarks/ +(*) A generic benchmark suite is maintained separately at https://github.com/python/performance diff --git a/Tools/importbench/README b/Tools/importbench/README index 81a5544a383b4c..6ba386c2b608d5 100644 --- a/Tools/importbench/README +++ b/Tools/importbench/README @@ -3,4 +3,4 @@ Importbench is a set of micro-benchmarks for various import scenarios. It should not be used as an overall benchmark of import performance, but rather an easy way to measure impact of possible code changes. For a real-world benchmark of import, use the normal_startup benchmark from -hg.python.org/benchmarks. +https://github.com/python/performance From 9a4577a4bb23888fed2cf192cf1a4c95ce5c26f8 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Mon, 20 Feb 2017 14:33:02 +0800 Subject: [PATCH 0021/2287] bpo-29347: Fix possibly dereferencing undefined pointers when creating weakref objects (#128) (#186) --- Misc/NEWS | 3 +++ Objects/weakrefobject.c | 2 ++ 2 files changed, 5 insertions(+) diff --git a/Misc/NEWS b/Misc/NEWS index b631fde8e52e0d..0fed99b5e7808f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.6.1 release candidate 1? Core and Builtins ----------------- +- bpo-29347: Fixed possibly dereferencing undefined pointers + when creating weakref objects. + - bpo-29438: Fixed use-after-free problem in key sharing dict. - Issue #29319: Prevent RunMainFromImporter overwriting sys.path[0]. diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c index ab6b23525552b8..9ca386da2563cb 100644 --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -24,6 +24,8 @@ init_weakref(PyWeakReference *self, PyObject *ob, PyObject *callback) { self->hash = -1; self->wr_object = ob; + self->wr_prev = NULL; + self->wr_next = NULL; Py_XINCREF(callback); self->wr_callback = callback; } From ce552e2d5c4ff90218fb41847e8ffb1fd3ba3b2d Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Mon, 20 Feb 2017 22:58:11 +0900 Subject: [PATCH 0022/2287] bpo-24274: fix erroneous comment in dictobject.c (GH-200) lookdict_unicode() and lookdict_unicode_nodummy() may raise exception when key is not unicode. --- Objects/dictobject.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Objects/dictobject.c b/Objects/dictobject.c index b63b78a337225a..a0c1977037b9e6 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -676,7 +676,8 @@ Christian Tismer. lookdict() is general-purpose, and may return DKIX_ERROR if (and only if) a comparison raises an exception. lookdict_unicode() below is specialized to string keys, comparison of which can -never raise an exception; that function can never return DKIX_ERROR. +never raise an exception; that function can never return DKIX_ERROR when key +is string. Otherwise, it falls back to lookdict(). lookdict_unicode_nodummy is further specialized for string keys that cannot be the value. For both, when the key isn't found a DKIX_EMPTY is returned. hashpos returns From d9b3cdd137239a5913de2252c3ce269e35ac63d2 Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Mon, 20 Feb 2017 21:59:30 +0000 Subject: [PATCH 0023/2287] bpo-29602: fix signed zero handling in complex constructor. (#203) (#206) * Fix incorrect handling of signed zeros for complex-related classes. * Add Misc/NEWS entry. (cherry picked from commit 112ec38c15b388fe025ccb85369a584d218b1160) --- Lib/test/test_complex.py | 23 +++++++++++++++++++++++ Misc/NEWS | 4 ++++ Objects/complexobject.c | 6 +++--- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_complex.py b/Lib/test/test_complex.py index c249ca724bf0ce..cee49343e268a2 100644 --- a/Lib/test/test_complex.py +++ b/Lib/test/test_complex.py @@ -387,6 +387,29 @@ def __complex__(self): self.assertAlmostEqual(complex(complex1(1j)), 2j) self.assertRaises(TypeError, complex, complex2(1j)) + @support.requires_IEEE_754 + def test_constructor_special_numbers(self): + class complex2(complex): + pass + for x in 0.0, -0.0, INF, -INF, NAN: + for y in 0.0, -0.0, INF, -INF, NAN: + with self.subTest(x=x, y=y): + z = complex(x, y) + self.assertFloatsAreIdentical(z.real, x) + self.assertFloatsAreIdentical(z.imag, y) + z = complex2(x, y) + self.assertIs(type(z), complex2) + self.assertFloatsAreIdentical(z.real, x) + self.assertFloatsAreIdentical(z.imag, y) + z = complex(complex2(x, y)) + self.assertIs(type(z), complex) + self.assertFloatsAreIdentical(z.real, x) + self.assertFloatsAreIdentical(z.imag, y) + z = complex2(complex(x, y)) + self.assertIs(type(z), complex2) + self.assertFloatsAreIdentical(z.real, x) + self.assertFloatsAreIdentical(z.imag, y) + def test_underscores(self): # check underscores for lit in VALID_UNDERSCORE_LITERALS: diff --git a/Misc/NEWS b/Misc/NEWS index 0fed99b5e7808f..d5bbd835aa21a6 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ What's New in Python 3.6.1 release candidate 1? Core and Builtins ----------------- +- bpo-29602: Fix incorrect handling of signed zeros in complex constructor for + complex subclasses and for inputs having a __complex__ method. Patch + by Serhiy Storchaka. + - bpo-29347: Fixed possibly dereferencing undefined pointers when creating weakref objects. diff --git a/Objects/complexobject.c b/Objects/complexobject.c index 31e12784cc34f9..cfaba688c684f6 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -1025,11 +1025,11 @@ complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } cr.real = PyFloat_AsDouble(tmp); - cr.imag = 0.0; /* Shut up compiler warning */ + cr.imag = 0.0; Py_DECREF(tmp); } if (i == NULL) { - ci.real = 0.0; + ci.real = cr.imag; } else if (PyComplex_Check(i)) { ci = ((PyComplexObject*)i)->cval; @@ -1051,7 +1051,7 @@ complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (ci_is_complex) { cr.real -= ci.imag; } - if (cr_is_complex) { + if (cr_is_complex && i != NULL) { ci.real += cr.imag; } return complex_subtype_from_doubles(type, cr.real, ci.real); From 51a477c0d53b09d5e876c23288ad006ad64c1e97 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Tue, 21 Feb 2017 23:56:26 +0900 Subject: [PATCH 0024/2287] doc: fix compile error on "shoddy" example extension (GH-216) (cherry picked from commit fb8fe72fc593438f6a0b934c6ff2d9c4aa28673d) --- Doc/includes/setup.py | 1 + Doc/includes/shoddy.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/includes/setup.py b/Doc/includes/setup.py index b853d23b170985..a38a39de3e7c86 100644 --- a/Doc/includes/setup.py +++ b/Doc/includes/setup.py @@ -5,4 +5,5 @@ Extension("noddy2", ["noddy2.c"]), Extension("noddy3", ["noddy3.c"]), Extension("noddy4", ["noddy4.c"]), + Extension("shoddy", ["shoddy.c"]), ]) diff --git a/Doc/includes/shoddy.c b/Doc/includes/shoddy.c index 07a272124ceaba..0c6d412b3c4cda 100644 --- a/Doc/includes/shoddy.c +++ b/Doc/includes/shoddy.c @@ -31,7 +31,7 @@ Shoddy_init(Shoddy *self, PyObject *args, PyObject *kwds) static PyTypeObject ShoddyType = { - PyObject_HEAD_INIT(NULL) + PyVarObject_HEAD_INIT(NULL, 0) "shoddy.Shoddy", /* tp_name */ sizeof(Shoddy), /* tp_basicsize */ 0, /* tp_itemsize */ From e48fd93bbb36c6d80aa4eb6af09f58c69d8cf965 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 21 Feb 2017 18:18:27 +0200 Subject: [PATCH 0025/2287] bpo-29532: Altering a kwarg dictionary passed to functools.partial() no longer affects a partial object after creation. (#209) --- Lib/test/test_functools.py | 9 +++++++++ Misc/NEWS | 13 +++++++++++++ Modules/_functoolsmodule.c | 5 ++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index 824549b80342ed..b7d648d0b15a55 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -89,6 +89,15 @@ def func(a=10, b=20): p(b=7) self.assertEqual(d, {'a':3}) + def test_kwargs_copy(self): + # Issue #29532: Altering a kwarg dictionary passed to a constructor + # should not affect a partial object after creation + d = {'a': 3} + p = self.partial(capture, **d) + self.assertEqual(p(), ((), {'a': 3})) + d['a'] = 5 + self.assertEqual(p(), ((), {'a': 3})) + def test_arg_combinations(self): # exercise special code paths for zero args in either partial # object or the caller diff --git a/Misc/NEWS b/Misc/NEWS index d5bbd835aa21a6..83b316c644d72b 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -66,6 +66,19 @@ Extension Modules Library ------- +- bpo-29532: Altering a kwarg dictionary passed to functools.partial() + no longer affects a partial object after creation. + +- bpo-22807: Add uuid.SafeUUID and uuid.UUID.is_safe to relay information from + the platform about whether generated UUIDs are generated with a + multiprocessing safe method. + +- bpo-29576: Improve some deprecations in importlib. Some deprecated methods + now emit DeprecationWarnings and have better descriptive messages. + +- bpo-29534: Fixed different behaviour of Decimal.from_float() + for _decimal and _pydecimal. Thanks Andrew Nester. + - Issue #28556: Various updates to typing module: typing.Counter, typing.ChainMap, improved ABC caching, etc. Original PRs by Jelle Zijlstra, Ivan Levkivskyi, Manuel Krebber, and Łukasz Langa. diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index f785a7260e6a2e..7abc9f464027f7 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -88,10 +88,13 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw) if (kw == NULL) { pto->kw = PyDict_New(); } - else { + else if (Py_REFCNT(kw) == 1) { Py_INCREF(kw); pto->kw = kw; } + else { + pto->kw = PyDict_Copy(kw); + } } else { pto->kw = PyDict_Copy(pkw); From 3ab24bdd47fdd9d45719ad49f93d3878d4442d7e Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Wed, 22 Feb 2017 02:33:24 +0900 Subject: [PATCH 0026/2287] bpo-29607: Fix stack_effect computation for CALL_FUNCTION_EX (GH-219) (cherry picked from commit 3a9ac827c7c87dffc60c4200323948551bcb6662) --- Misc/NEWS | 3 +++ Python/compile.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Misc/NEWS b/Misc/NEWS index 83b316c644d72b..5688883375824e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.6.1 release candidate 1? Core and Builtins ----------------- +- bpo-29607: Fix stack_effect computation for CALL_FUNCTION_EX. + Patch by Matthieu Dartiailh. + - bpo-29602: Fix incorrect handling of signed zeros in complex constructor for complex subclasses and for inputs having a __complex__ method. Patch by Serhiy Storchaka. diff --git a/Python/compile.c b/Python/compile.c index 0e1607585245b9..6255ec7d47f5a2 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1043,7 +1043,7 @@ PyCompile_OpcodeStackEffect(int opcode, int oparg) case CALL_FUNCTION_KW: return -oparg-1; case CALL_FUNCTION_EX: - return - ((oparg & 0x01) != 0) - ((oparg & 0x02) != 0); + return -1 - ((oparg & 0x01) != 0); case MAKE_FUNCTION: return -1 - ((oparg & 0x01) != 0) - ((oparg & 0x02) != 0) - ((oparg & 0x04) != 0) - ((oparg & 0x08) != 0); From 9b49133082ec23b67e84d2589e66d7810018e424 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 21 Feb 2017 10:30:07 -0800 Subject: [PATCH 0027/2287] bpo-29453: Remove reference to undefined dictionary ordering in Tutorial (GH-140) (#208) As of Python 3.6 **kwargs are ordered, thus, remove the paragraph stating that ordering is undefined and change snippet to remove the unecessary sorted call. * Add sentence mentioning guaranteed output order of kwargs (cherry picked from commit 32e8f9bdfd4324f1aa4fbbdf1ed8536f2b00cabb) --- Doc/tutorial/controlflow.rst | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index d43461886e7933..6a9bb4889ff857 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -492,8 +492,7 @@ function like this:: for arg in arguments: print(arg) print("-" * 40) - keys = sorted(keywords.keys()) - for kw in keys: + for kw in keywords: print(kw, ":", keywords[kw]) It could be called like this:: @@ -513,13 +512,13 @@ and of course it would print: It's very runny, sir. It's really very, VERY runny, sir. ---------------------------------------- - client : John Cleese shopkeeper : Michael Palin + client : John Cleese sketch : Cheese Shop Sketch -Note that the list of keyword argument names is created by sorting the result -of the keywords dictionary's ``keys()`` method before printing its contents; -if this is not done, the order in which the arguments are printed is undefined. +Note that the order in which the keyword arguments are printed is guaranteed +to match the order in which they were provided in the function call. + .. _tut-arbitraryargs: From e9c0e5559bbadb164d7c57b5a47b5544746dcb89 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Tue, 21 Feb 2017 22:56:07 +0300 Subject: [PATCH 0028/2287] [3.6] Add .codecov.yml (#210) --- .codecov.yml | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .codecov.yml diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 00000000000000..fcf9df6a7a698e --- /dev/null +++ b/.codecov.yml @@ -0,0 +1,35 @@ +codecov: + notify: + require_ci_to_pass: true +comment: off +ignore: + - "Doc/**/*" + - "Misc/*" + - "Mac/**/*" + - "PC/**/*" + - "PCbuild/**/*" + - "Tools/**/*" + - "Grammar/*" +coverage: + precision: 2 + range: + - 70.0 + - 100.0 + round: down + status: + changes: off + project: off + patch: + default: + target: 100% + only_pulls: true + threshold: 0.05 +parsers: + gcov: + branch_detection: + conditional: true + loop: true + macro: false + method: false + javascript: + enable_partials: false From b067a5eef7fdf69264d3578654996fc3755df4ea Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Wed, 22 Feb 2017 04:55:33 +0300 Subject: [PATCH 0029/2287] bpo-29554: Improve docs for pstat module and profile. (#88) (#227) Clarify that methods take a string which is interpreted as a regex, not a regex object. Also clarify what the old `-1`, `0`, `1` and `2` options were. (cherry picked from commit 8fb1f6e039cbdeb333d83b7a62f0f37af4ce6e02) --- Doc/library/profile.rst | 7 ++++--- Lib/pstats.py | 13 ++++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst index 959d9b98a84691..bd67fe486abf77 100644 --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -444,9 +444,10 @@ Analysis of the profiler data is done using the :class:`~pstats.Stats` class. significant entries. Initially, the list is taken to be the complete set of profiled functions. Each restriction is either an integer (to select a count of lines), or a decimal fraction between 0.0 and 1.0 inclusive (to - select a percentage of lines), or a regular expression (to pattern match - the standard name that is printed. If several restrictions are provided, - then they are applied sequentially. For example:: + select a percentage of lines), or a string that will interpreted as a + regular expression (to pattern match the standard name that is printed). + If several restrictions are provided, then they are applied sequentially. + For example:: print_stats(.1, 'foo:') diff --git a/Lib/pstats.py b/Lib/pstats.py index d861413d4195f7..2c5bf981b85cf8 100644 --- a/Lib/pstats.py +++ b/Lib/pstats.py @@ -48,11 +48,14 @@ class Stats: printed. The sort_stats() method now processes some additional options (i.e., in - addition to the old -1, 0, 1, or 2). It takes an arbitrary number of - quoted strings to select the sort order. For example sort_stats('time', - 'name') sorts on the major key of 'internal function time', and on the - minor key of 'the name of the function'. Look at the two tables in - sort_stats() and get_sort_arg_defs(self) for more examples. + addition to the old -1, 0, 1, or 2 that are respectively interpreted as + 'stdname', 'calls', 'time', and 'cumulative'). It takes an arbitrary number + of quoted strings to select the sort order. + + For example sort_stats('time', 'name') sorts on the major key of 'internal + function time', and on the minor key of 'the name of the function'. Look at + the two tables in sort_stats() and get_sort_arg_defs(self) for more + examples. All methods return self, so you can string together commands like: Stats('foo', 'goo').strip_dirs().sort_stats('calls').\ From 3cc5817cfaf5663645f4ee447eaed603d2ad290a Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Wed, 22 Feb 2017 06:21:17 +0000 Subject: [PATCH 0030/2287] Fixed bpo-29565: Corrected ctypes passing of large structs by value on Windows AMD64. (#168) (#220) Fixed bpo-29565: Corrected ctypes passing of large structs by value. (cherry picked from commit a86339b83fbd0932e0529a3c91935e997a234582) --- Lib/ctypes/test/test_callbacks.py | 11 +++++++++++ Lib/ctypes/test/test_structures.py | 23 +++++++++++++++++++++++ Modules/_ctypes/_ctypes_test.c | 13 +++++++++++++ Modules/_ctypes/libffi_msvc/ffi.c | 10 ++++++++++ 4 files changed, 57 insertions(+) diff --git a/Lib/ctypes/test/test_callbacks.py b/Lib/ctypes/test/test_callbacks.py index 8eac58f0262caf..f622093df61da5 100644 --- a/Lib/ctypes/test/test_callbacks.py +++ b/Lib/ctypes/test/test_callbacks.py @@ -244,6 +244,7 @@ def callback(a, b, c, d, e): def test_callback_large_struct(self): class Check: pass + # This should mirror the structure in Modules/_ctypes/_ctypes_test.c class X(Structure): _fields_ = [ ('first', c_ulong), @@ -255,6 +256,11 @@ def callback(check, s): check.first = s.first check.second = s.second check.third = s.third + # See issue #29565. + # The structure should be passed by value, so + # any changes to it should not be reflected in + # the value passed + s.first = s.second = s.third = 0x0badf00d check = Check() s = X() @@ -275,6 +281,11 @@ def callback(check, s): self.assertEqual(check.first, 0xdeadbeef) self.assertEqual(check.second, 0xcafebabe) self.assertEqual(check.third, 0x0bad1dea) + # See issue #29565. + # Ensure that the original struct is unchanged. + self.assertEqual(s.first, check.first) + self.assertEqual(s.second, check.second) + self.assertEqual(s.third, check.third) ################################################################ diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py index 8f6fe5f25429e5..3eded7749ed95e 100644 --- a/Lib/ctypes/test/test_structures.py +++ b/Lib/ctypes/test/test_structures.py @@ -3,6 +3,7 @@ from ctypes.test import need_symbol from struct import calcsize import _testcapi +import _ctypes_test class SubclassesTest(unittest.TestCase): def test_subclass(self): @@ -391,6 +392,28 @@ class Z(Y): (1, 0, 0, 0, 0, 0)) self.assertRaises(TypeError, lambda: Z(1, 2, 3, 4, 5, 6, 7)) + def test_pass_by_value(self): + # This should mirror the structure in Modules/_ctypes/_ctypes_test.c + class X(Structure): + _fields_ = [ + ('first', c_ulong), + ('second', c_ulong), + ('third', c_ulong), + ] + + s = X() + s.first = 0xdeadbeef + s.second = 0xcafebabe + s.third = 0x0bad1dea + dll = CDLL(_ctypes_test.__file__) + func = dll._testfunc_large_struct_update_value + func.argtypes = (X,) + func.restype = None + func(s) + self.assertEqual(s.first, 0xdeadbeef) + self.assertEqual(s.second, 0xcafebabe) + self.assertEqual(s.third, 0x0bad1dea) + class PointerMemberTestCase(unittest.TestCase): def test(self): diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c index 629ddf66bc4212..59d56d0d218732 100644 --- a/Modules/_ctypes/_ctypes_test.c +++ b/Modules/_ctypes/_ctypes_test.c @@ -44,6 +44,19 @@ _testfunc_cbk_large_struct(Test in, void (*func)(Test)) func(in); } +/* + * See issue 29565. Update a structure passed by value; + * the caller should not see any change. + */ + +EXPORT(void) +_testfunc_large_struct_update_value(Test in) +{ + in.first = 0x0badf00d; + in.second = 0x0badf00d; + in.third = 0x0badf00d; +} + EXPORT(void)testfunc_array(int values[4]) { printf("testfunc_array %d %d %d %d\n", diff --git a/Modules/_ctypes/libffi_msvc/ffi.c b/Modules/_ctypes/libffi_msvc/ffi.c index 1d82929f530220..91a27dce3f2575 100644 --- a/Modules/_ctypes/libffi_msvc/ffi.c +++ b/Modules/_ctypes/libffi_msvc/ffi.c @@ -239,6 +239,16 @@ ffi_call(/*@dependent@*/ ffi_cif *cif, break; #else case FFI_SYSV: + /* If a single argument takes more than 8 bytes, + then a copy is passed by reference. */ + for (unsigned i = 0; i < cif->nargs; i++) { + size_t z = cif->arg_types[i]->size; + if (z > 8) { + void *temp = alloca(z); + memcpy(temp, avalue[i], z); + avalue[i] = temp; + } + } /*@-usedef@*/ return ffi_call_AMD64(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, fn); From 55b82e10dc6b75b30a72fa56beb60eaf54a008d4 Mon Sep 17 00:00:00 2001 From: Arne de Laat Date: Thu, 23 Feb 2017 16:17:11 +0100 Subject: [PATCH 0031/2287] bpo-28911: Clarify the behaviour of assert_called_once_with. (#252) (cherry picked from commit 9d56b34af2efc4e266bf3ae62da5cd2e422a42be) --- Doc/library/unittest.mock.rst | 11 ++++++----- Lib/unittest/mock.py | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index c6d0ec92b6e9ab..a552cbfc70ad2e 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -303,14 +303,14 @@ the *new_callable* argument to :func:`patch`. .. method:: assert_called_once_with(*args, **kwargs) - Assert that the mock was called exactly once and with the specified - arguments. + Assert that the mock was called exactly once and that that call was + with the specified arguments. >>> mock = Mock(return_value=None) >>> mock('foo', bar='baz') >>> mock.assert_called_once_with('foo', bar='baz') - >>> mock('foo', bar='baz') - >>> mock.assert_called_once_with('foo', bar='baz') + >>> mock('other', bar='values') + >>> mock.assert_called_once_with('other', bar='values') Traceback (most recent call last): ... AssertionError: Expected 'mock' to be called once. Called 2 times. @@ -322,7 +322,8 @@ the *new_callable* argument to :func:`patch`. The assert passes if the mock has *ever* been called, unlike :meth:`assert_called_with` and :meth:`assert_called_once_with` that - only pass if the call is the most recent one. + only pass if the call is the most recent one, and in the case of + :meth:`assert_called_once_with` it must also be the only call. >>> mock = Mock(return_value=None) >>> mock(1, 2, arg='thing') diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index b6b38362341f16..5f97728de28c59 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -815,8 +815,8 @@ def _error_message(): def assert_called_once_with(_mock_self, *args, **kwargs): - """assert that the mock was called exactly once and with the specified - arguments.""" + """assert that the mock was called exactly once and that that call was + with the specified arguments.""" self = _mock_self if not self.call_count == 1: msg = ("Expected '%s' to be called once. Called %s times." % From 2197eac6104311472f200645bc844adb46444b10 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Thu, 23 Feb 2017 18:42:30 +0300 Subject: [PATCH 0032/2287] bpo-28814: Undeprecate inadvertently deprecated inspect functions. (#122) (#243) Nick Coghlan said on bpo-28814: > inspect.getargvalues() and inspect.formatargvalues() were deprecated > in Python 3.5 as part of implementing bpo-20438 > This is incorrect, as these are *frame* introspection related functions, > not callable introspection ones. The documentation and implementation > layout is confusing though, as they're interleaved with the callable > introspection operation This commit undeprecates these functions and adds a note to ignore previous deprecation notices. (cherry picked from commit 0899b9809547ec2894dcf88cf4bba732c5d47d0d) --- Doc/library/inspect.rst | 12 ++++-------- Doc/whatsnew/3.5.rst | 11 ++++++----- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index 41a784d982d6c2..3fa44a0c99891c 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -905,10 +905,8 @@ Classes and functions are the names of the ``*`` and ``**`` arguments or ``None``. *locals* is the locals dictionary of the given frame. - .. deprecated:: 3.5 - Use :func:`signature` and - :ref:`Signature Object `, which provide a - better introspecting API for callables. + .. note:: + This function was inadvertently marked as deprecated in Python 3.5. .. function:: formatargspec(args[, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations[, formatarg, formatvarargs, formatvarkw, formatvalue, formatreturns, formatannotations]]) @@ -944,10 +942,8 @@ Classes and functions :func:`getargvalues`. The format\* arguments are the corresponding optional formatting functions that are called to turn names and values into strings. - .. deprecated:: 3.5 - Use :func:`signature` and - :ref:`Signature Object `, which provide a - better introspecting API for callables. + .. note:: + This function was inadvertently marked as deprecated in Python 3.5. .. function:: getmro(cls) diff --git a/Doc/whatsnew/3.5.rst b/Doc/whatsnew/3.5.rst index edb74f043e0b64..a6ba5bbb720ca2 100644 --- a/Doc/whatsnew/3.5.rst +++ b/Doc/whatsnew/3.5.rst @@ -2327,11 +2327,12 @@ The :func:`inspect.getargspec` function is deprecated and scheduled to be removed in Python 3.6. (See :issue:`20438` for details.) The :mod:`inspect` :func:`~inspect.getfullargspec`, -:func:`~inspect.getargvalues`, :func:`~inspect.getcallargs`, -:func:`~inspect.getargvalues`, :func:`~inspect.formatargspec`, and -:func:`~inspect.formatargvalues` functions are deprecated in favor of -the :func:`inspect.signature` API. -(Contributed by Yury Selivanov in :issue:`20438`.) +:func:`~inspect.getcallargs`, and :func:`~inspect.formatargspec` functions are +deprecated in favor of the :func:`inspect.signature` API. (Contributed by Yury +Selivanov in :issue:`20438`.) + +:func:`~inspect.getargvalues` and :func:`~inspect.formatargvalues` functions +were inadvertently marked as deprecated with the release of Python 3.5.0. Use of :const:`re.LOCALE` flag with str patterns or :const:`re.ASCII` is now deprecated. (Contributed by Serhiy Storchaka in :issue:`22407`.) From f2beceb7e54fadc507137f86cbe9d74f7e5b8f7c Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Thu, 23 Feb 2017 15:03:20 -0800 Subject: [PATCH 0033/2287] bpo-29624: Adds purge step and layout test after uploading files. (#258) (#264) --- Tools/msi/uploadrelease.bat | 31 ++++++++++++++++++++++--------- Tools/msi/uploadrelease.proj | 32 +++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/Tools/msi/uploadrelease.bat b/Tools/msi/uploadrelease.bat index 4e319ce4c98ccb..670836be8c1c8b 100644 --- a/Tools/msi/uploadrelease.bat +++ b/Tools/msi/uploadrelease.bat @@ -9,6 +9,8 @@ set USER= set TARGET= set DRYRUN=false set NOGPG= +set PURGE_OPTION=/p:Purge=true +set NOTEST= :CheckOpts if "%1" EQU "-h" goto Help @@ -19,7 +21,11 @@ if "%1" EQU "--user" (set USER=%~2) && shift && shift && goto CheckOpts if "%1" EQU "-t" (set TARGET=%~2) && shift && shift && goto CheckOpts if "%1" EQU "--target" (set TARGET=%~2) && shift && shift && goto CheckOpts if "%1" EQU "--dry-run" (set DRYRUN=true) && shift && goto CheckOpts -if "%1" EQU "--no-gpg" (set NOGPG=true) && shift && goto CheckOpts +if "%1" EQU "--skip-gpg" (set NOGPG=true) && shift && goto CheckOpts +if "%1" EQU "--skip-purge" (set PURGE_OPTION=) && shift && godo CheckOpts +if "%1" EQU "--skip-test" (set NOTEST=true) && shift && godo CheckOpts +if "%1" EQU "-T" (set NOTEST=true) && shift && godo CheckOpts +if "%1" NEQ "" echo Unexpected argument "%1" & exit /B 1 if not defined PLINK where plink > "%TEMP%\plink.loc" 2> nul && set /P PLINK= < "%TEMP%\plink.loc" & del "%TEMP%\plink.loc" if not defined PLINK where /R "%ProgramFiles(x86)%\PuTTY" plink > "%TEMP%\plink.loc" 2> nul && set /P PLINK= < "%TEMP%\plink.loc" & del "%TEMP%\plink.loc" @@ -35,7 +41,7 @@ echo Found pscp.exe at %PSCP% if defined NOGPG ( set GPG= - echo Skipping GPG signature generation because of --no-gpg + echo Skipping GPG signature generation because of --skip-gpg ) else ( if not defined GPG where gpg2 > "%TEMP%\gpg.loc" 2> nul && set /P GPG= < "%TEMP%\gpg.loc" & del "%TEMP%\gpg.loc" if not defined GPG where /R "%PCBUILD%..\externals\windows-installer" gpg2 > "%TEMP%\gpg.loc" 2> nul && set /P GPG= < "%TEMP%\gpg.loc" & del "%TEMP%\gpg.loc" @@ -45,8 +51,12 @@ if defined NOGPG ( call "%PCBUILD%env.bat" > nul 2> nul pushd "%D%" -msbuild /v:m /nologo uploadrelease.proj /t:Upload /p:Platform=x86 -msbuild /v:m /nologo uploadrelease.proj /t:Upload /p:Platform=x64 /p:IncludeDoc=false +msbuild /v:m /nologo uploadrelease.proj /t:Upload /p:Platform=x86 %PURGE_OPTION% +msbuild /v:m /nologo uploadrelease.proj /t:Upload /p:Platform=x64 /p:IncludeDoc=false %PURGE_OPTION% +if not defined NOTEST ( + msbuild /v:m /nologo uploadrelease.proj /t:Test /p:Platform=x86 + msbuild /v:m /nologo uploadrelease.proj /t:Test /p:Platform=x64 +) msbuild /v:m /nologo uploadrelease.proj /t:ShowHashes /p:Platform=x86 msbuild /v:m /nologo uploadrelease.proj /t:ShowHashes /p:Platform=x64 /p:IncludeDoc=false popd @@ -55,9 +65,12 @@ exit /B 0 :Help echo uploadrelease.bat --host HOST --user USERNAME [--target TARGET] [--dry-run] [-h] echo. -echo --host (-o) Specify the upload host (required) -echo --user (-u) Specify the user on the host (required) -echo --target (-t) Specify the target directory on the host -echo --dry-run Display commands and filenames without executing them -echo -h Display this help information +echo --host (-o) Specify the upload host (required) +echo --user (-u) Specify the user on the host (required) +echo --target (-t) Specify the target directory on the host +echo --dry-run Display commands and filenames without executing them +echo --skip-gpg Does not generate GPG signatures before uploading +echo --skip-purge Does not perform CDN purge after uploading +echo --skip-test (-T) Does not perform post-upload tests +echo -h Display this help information echo. diff --git a/Tools/msi/uploadrelease.proj b/Tools/msi/uploadrelease.proj index 0d472dea5428a0..305e84fc2d4b28 100644 --- a/Tools/msi/uploadrelease.proj +++ b/Tools/msi/uploadrelease.proj @@ -9,6 +9,7 @@ /srv/www.python.org/ftp/python true false + false @@ -64,7 +65,36 @@ echo. echo." /> - + + + + + + + + + + $(TEMP)\%(Filename)_source + $(TEMP)\%(Filename)_source\%(Filename)%(Extension) + $(TEMP)\%(Filename)_layout + $(OutputPath)\%(Filename)_layoutlog + $(OutputPath)\%(Filename)_layoutlog\%(Filename).log + + + + + + + + + + + + + + + From 0a1b656d8ce3da14f8acf947477b8e998e68ef3b Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Fri, 24 Feb 2017 15:44:34 -0500 Subject: [PATCH 0034/2287] bpo-25008: Deprecate smtpd and point to aiosmtpd (#274) (#278) --- Doc/library/smtpd.rst | 6 ++++++ Misc/NEWS | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Doc/library/smtpd.rst b/Doc/library/smtpd.rst index e383201aab1461..85ee8a75cf77a9 100644 --- a/Doc/library/smtpd.rst +++ b/Doc/library/smtpd.rst @@ -13,6 +13,12 @@ This module offers several classes to implement SMTP (email) servers. +.. seealso:: + + The `aiosmtpd `_ package is a recommended + replacement for this module. It is based on :mod:`asyncio` and provides a + more straightforward API. :mod:`smtpd` should be considered deprecated. + Several server implementations are present; one is a generic do-nothing implementation, which can be overridden, while the other two offer specific mail-sending strategies. diff --git a/Misc/NEWS b/Misc/NEWS index 5688883375824e..d885ca900217ea 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,7 +10,7 @@ What's New in Python 3.6.1 release candidate 1? Core and Builtins ----------------- -- bpo-29607: Fix stack_effect computation for CALL_FUNCTION_EX. +- bpo-29607: Fix stack_effect computation for CALL_FUNCTION_EX. Patch by Matthieu Dartiailh. - bpo-29602: Fix incorrect handling of signed zeros in complex constructor for @@ -217,6 +217,9 @@ C API Documentation ------------- +- bpo-25008: Document smtpd.py as effectively deprecated and add a pointer to + aiosmtpd, a third-party asyncio-based replacement. + - Issue #26355: Add canonical header link on each page to corresponding major version of the documentation. Patch by Matthias Bussonnier. From f28db60179e59633a99fab27646d22d0bd5976a0 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 24 Feb 2017 16:39:30 -0800 Subject: [PATCH 0035/2287] [3.6] Fix small typos in expressions.rst (GH-276) (GH-281) (cherry picked from commit 132ac381fe7eb593e3d7c63926f90285bba13cdc) --- Doc/reference/expressions.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 3a4b80557caf67..f4a82699b0be12 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -190,7 +190,7 @@ Since Python 3.6, in an :keyword:`async def` function, an :keyword:`async for` clause may be used to iterate over a :term:`asynchronous iterator`. A comprehension in an :keyword:`async def` function may consist of either a :keyword:`for` or :keyword:`async for` clause following the leading -expression, may contan additonal :keyword:`for` or :keyword:`async for` +expression, may contain additional :keyword:`for` or :keyword:`async for` clauses, and may also use :keyword:`await` expressions. If a comprehension contains either :keyword:`async for` clauses or :keyword:`await` expressions it is called an @@ -1317,7 +1317,7 @@ built-in types. * Sequences (instances of :class:`tuple`, :class:`list`, or :class:`range`) can be compared only within each of their types, with the restriction that ranges do not support order comparison. Equality comparison across these types - results in unequality, and ordering comparison across these types raises + results in inequality, and ordering comparison across these types raises :exc:`TypeError`. Sequences compare lexicographically using comparison of corresponding From bea9d2f6488f01794098d9fd4710b98df1bd9472 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 24 Feb 2017 16:40:50 -0800 Subject: [PATCH 0036/2287] [3.6] bpo-28556: Update to typing: treat subscripted generics as proxies (GH-265) (GH-268) (cherry picked from commit abb3b8ad94d699c8560d94ee9bac9c917b382abe) (cherry picked from commit 365cb5bb9069273e6970c9d5d17ee2fe5003e7ac) --- Lib/test/test_typing.py | 35 +++++++++++++++++++++++++++++++++++ Lib/typing.py | 10 ++++++++++ 2 files changed, 45 insertions(+) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 64d8276658ee7f..f0070ec975791a 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -674,6 +674,41 @@ class C(B[int]): c.bar = 'abc' self.assertEqual(c.__dict__, {'bar': 'abc'}) + def test_subscripted_generics_as_proxies(self): + T = TypeVar('T') + class C(Generic[T]): + x = 'def' + self.assertEqual(C[int].x, 'def') + self.assertEqual(C[C[int]].x, 'def') + C[C[int]].x = 'changed' + self.assertEqual(C.x, 'changed') + self.assertEqual(C[str].x, 'changed') + C[List[str]].z = 'new' + self.assertEqual(C.z, 'new') + self.assertEqual(C[Tuple[int]].z, 'new') + + self.assertEqual(C().x, 'changed') + self.assertEqual(C[Tuple[str]]().z, 'new') + + class D(C[T]): + pass + self.assertEqual(D[int].x, 'changed') + self.assertEqual(D.z, 'new') + D.z = 'from derived z' + D[int].x = 'from derived x' + self.assertEqual(C.x, 'changed') + self.assertEqual(C[int].z, 'new') + self.assertEqual(D.x, 'from derived x') + self.assertEqual(D[str].z, 'from derived z') + + def test_abc_registry_kept(self): + T = TypeVar('T') + class C(Generic[T]): ... + C.register(int) + self.assertIsInstance(1, C) + C[int] + self.assertIsInstance(1, C) + def test_false_subclasses(self): class MyMapping(MutableMapping[str, str]): pass self.assertNotIsInstance({}, MyMapping) diff --git a/Lib/typing.py b/Lib/typing.py index efe358faf20988..9a0f49099a3114 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1158,6 +1158,16 @@ def __copy__(self): self.__parameters__, self.__args__, self.__origin__, self.__extra__, self.__orig_bases__) + def __setattr__(self, attr, value): + # We consider all the subscripted genrics as proxies for original class + if ( + attr.startswith('__') and attr.endswith('__') or + attr.startswith('_abc_') + ): + super(GenericMeta, self).__setattr__(attr, value) + else: + super(GenericMeta, _gorg(self)).__setattr__(attr, value) + # Prevent checks for Generic to crash when defining Generic. Generic = None From 814213bdf1b95a5d863311b61c671010291f1197 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 25 Feb 2017 11:56:48 -0800 Subject: [PATCH 0037/2287] [3.6] Backport README.rst changes (GH-294) (cherry picked from commit b3f1f59cf451d4a25b204e7a24f7be4c95e40be8) (cherry picked from commit 1b3d88eb33085e90af729c4c2f78b5ba1b942b1e) (cherry picked from commit c0866855d54bbbe7bcac299c4af45389efacce0b) (cherry picked from commit e32ec9334b35f897ace8a05128838f92c5e0b2fb) (cherry picked from commit 6329aea78e3627d250009aa5aaaf47cd11587f4d) --- Doc/Makefile | 2 +- Doc/{README.txt => README.rst} | 21 +++++++++++---------- Doc/conf.py | 2 +- Doc/make.bat | 2 +- README.rst | 30 +++++++++++++++++++++--------- 5 files changed, 35 insertions(+), 22 deletions(-) rename Doc/{README.txt => README.rst} (83%) diff --git a/Doc/Makefile b/Doc/Makefile index eb62df5b87cebe..94697f95671894 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -153,7 +153,7 @@ dist: cp -pPR build/epub/Python.epub dist/python-$(DISTVERSION)-docs.epub check: - $(PYTHON) tools/rstlint.py -i tools -i venv + $(PYTHON) tools/rstlint.py -i tools -i venv -i README.rst serve: ../Tools/scripts/serve.py build/html diff --git a/Doc/README.txt b/Doc/README.rst similarity index 83% rename from Doc/README.txt rename to Doc/README.rst index 4f8e9f8f1417fb..dcd3d6e80ff3c4 100644 --- a/Doc/README.txt +++ b/Doc/README.rst @@ -2,20 +2,21 @@ Python Documentation README ~~~~~~~~~~~~~~~~~~~~~~~~~~~ This directory contains the reStructuredText (reST) sources to the Python -documentation. You don't need to build them yourself, prebuilt versions are -available at . +documentation. You don't need to build them yourself, `prebuilt versions are +available `_. Documentation on authoring Python documentation, including information about -both style and markup, is available in the "Documenting Python" chapter of the -developers guide . +both style and markup, is available in the "`Documenting Python +`_" chapter of the +developers guide. Building the docs ================= -You need to have Sphinx installed; it is the toolset +You need to have `Sphinx `_ installed; it is the toolset used to build the docs. It is not included in this tree, but maintained -separately and available from PyPI . +separately and `available from PyPI `_. Using make @@ -108,11 +109,11 @@ see the make targets above). Contributing ============ -Bugs in the content should be reported to the Python bug tracker at -https://bugs.python.org. +Bugs in the content should be reported to the +`Python bug tracker `_. -Bugs in the toolset should be reported in the Sphinx bug tracker at -https://www.bitbucket.org/birkenfeld/sphinx/issues/. +Bugs in the toolset should be reported in the +`Sphinx bug tracker `_. You can also send a mail to the Python Documentation Team at docs@python.org, and we will process your request as soon as possible. diff --git a/Doc/conf.py b/Doc/conf.py index b3f26d5a692163..18aebb68a8d8df 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -37,7 +37,7 @@ needs_sphinx = '1.2' # Ignore any .rst files in the venv/ directory. -exclude_patterns = ['venv/*'] +exclude_patterns = ['venv/*', 'README.rst'] # Options for HTML output diff --git a/Doc/make.bat b/Doc/make.bat index d0b59618261011..b1a3738f309d3b 100644 --- a/Doc/make.bat +++ b/Doc/make.bat @@ -74,7 +74,7 @@ echo. Provided by this script: echo. clean, check, serve, htmlview echo. echo.All arguments past the first one are passed through to sphinx-build as -echo.filenames to build or are ignored. See README.txt in this directory or +echo.filenames to build or are ignored. See README.rst in this directory or echo.the documentation for your version of Sphinx for more exhaustive lists echo.of available targets and descriptions of each. echo. diff --git a/README.rst b/README.rst index d02ae64b7fc660..242572c5e361db 100644 --- a/README.rst +++ b/README.rst @@ -15,6 +15,22 @@ reserved. See the end of this file for further copyright and license information. +General Information +------------------- + +- Website: https://www.python.org +- Source code: https://github.com/python/cpython +- Issue tracker: https://bugs.python.org +- Documentation: https://docs.python.org +- Developer's Guide: https://docs.python.org/devguide/ + +Contributing to CPython +----------------------- + +For more complete instructions on contributing to CPython development, +see the `Developer Guide`_. + +.. _Developer Guide: https://docs.python.org/devguide/ Using Python ------------ @@ -28,7 +44,7 @@ Installable Python kits, and information about using Python, are available at Build Instructions ------------------ -On Unix, Linux, BSD, OSX, and Cygwin:: +On Unix, Linux, BSD, macOS, and Cygwin:: ./configure make @@ -38,10 +54,10 @@ On Unix, Linux, BSD, OSX, and Cygwin:: This will install Python as python3. You can pass many options to the configure script; run ``./configure --help`` -to find out more. On OSX and Cygwin, the executable is called ``python.exe``; +to find out more. On macOS and Cygwin, the executable is called ``python.exe``; elsewhere it's just ``python``. -On Mac OS X, if you have configured Python with ``--enable-framework``, you +On macOS, if you have configured Python with ``--enable-framework``, you should use ``make frameworkinstall`` to do the installation. Note that this installs the Python executable in a place that is not normally on your PATH, you may want to set up a symlink in ``/usr/local/bin``. @@ -126,12 +142,8 @@ is downloadable in HTML, PDF, and reStructuredText formats; the latter version is primarily for documentation authors, translators, and people with special formatting requirements. -If you would like to contribute to the development of Python, relevant -documentation is available in the `Python Developer's Guide -`_. - -For information about building Python's documentation, refer to `Doc/README.txt -`_. +For information about building Python's documentation, refer to `Doc/README.rst +`_. Converting From Python 2.x to 3.x From 1a8dd944d4016593e78a7a6c3c635adee783abfd Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 25 Feb 2017 22:34:06 -0800 Subject: [PATCH 0038/2287] [3.6] bpo-28929: Add to Misc/NEWS (GH-284) mention bpo-28929 in the Documentation section of What's New in Python 3.6.1 release candidate 1 --- Misc/NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Misc/NEWS b/Misc/NEWS index d885ca900217ea..0f5c27902ba423 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -217,6 +217,8 @@ C API Documentation ------------- +- bpo-28929: Link the documentation to its source file on GitHub. + - bpo-25008: Document smtpd.py as effectively deprecated and add a pointer to aiosmtpd, a third-party asyncio-based replacement. From b00232842c5dd0d41054a02a7800fc5f82a92beb Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 25 Feb 2017 22:34:51 -0800 Subject: [PATCH 0039/2287] Fix small typos in introduction and datastructures of tutorial (GH-272) (GH-297) (cherry picked from commit 53c1892dc3de1de612b1cf95dc7bf09f82c1babf) --- Doc/tutorial/datastructures.rst | 8 ++++---- Doc/tutorial/introduction.rst | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst index 953a68b44af7bb..6140ece046b975 100644 --- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -22,11 +22,11 @@ objects: Add an item to the end of the list. Equivalent to ``a[len(a):] = [x]``. -.. method:: list.extend(L) +.. method:: list.extend(iterable) :noindex: - Extend the list by appending all the items in the given list. Equivalent to - ``a[len(a):] = L``. + Extend the list by appending all the items from the iterable. Equivalent to + ``a[len(a):] = iterable``. .. method:: list.insert(i, x) @@ -68,7 +68,7 @@ objects: The optional arguments *start* and *end* are interpreted as in the slice notation and are used to limit the search to a particular subsequence of - *x*. The returned index is computed relative to the beginning of the full + the list. The returned index is computed relative to the beginning of the full sequence rather than the *start* argument. diff --git a/Doc/tutorial/introduction.rst b/Doc/tutorial/introduction.rst index 7e8ee3e5ea19bc..52120a0b16e75f 100644 --- a/Doc/tutorial/introduction.rst +++ b/Doc/tutorial/introduction.rst @@ -359,7 +359,7 @@ The built-in function :func:`len` returns the length of a string:: Information about string formatting with :meth:`str.format`. :ref:`old-string-formatting` - The old formatting operations invoked when strings and Unicode strings are + The old formatting operations invoked when strings are the left operand of the ``%`` operator are described in more detail here. From 91c499f8f94b89c08686ac9e7c81ea1d89221cbc Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Sun, 26 Feb 2017 00:00:09 -0800 Subject: [PATCH 0040/2287] mark various test data binary (#233) (#304) --- .gitattributes | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000000000..55a3f49922bf19 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,10 @@ +Misc/NEWS merge=union + +*.pck binary +Lib/test/cjkencodings/* binary +Lib/test/decimaltestdata/*.decTest binary +Lib/test/sndhdrdata/sndhdr.* binary +Lib/test/test_email/data/msg_26.txt binary +Lib/test/xmltestdata/* binary +Lib/venv/scripts/nt/* binary +Lib/test/coding20731.py binary From fae59e1aa87ee9598d032e0bd697969a5784025f Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Sun, 26 Feb 2017 16:05:30 +0300 Subject: [PATCH 0041/2287] bpo-28961: Address my comments from earlier code review (#306) (cherry picked from commit dea1536fd3a8424d537794cd53715df0989cbbe1) --- Lib/unittest/test/testmock/testhelpers.py | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/Lib/unittest/test/testmock/testhelpers.py b/Lib/unittest/test/testmock/testhelpers.py index d5f9e7c1d69204..d2202a7b4132e9 100644 --- a/Lib/unittest/test/testmock/testhelpers.py +++ b/Lib/unittest/test/testmock/testhelpers.py @@ -307,18 +307,9 @@ def test_two_args_call(self): self.assertEqual(args, other_args) def test_call_with_name(self): - self.assertEqual( - 'foo', - _Call((), 'foo')[0], - ) - self.assertEqual( - '', - _Call((('bar', 'barz'), ), )[0] - ) - self.assertEqual( - '', - _Call((('bar', 'barz'), {'hello': 'world'}), )[0] - ) + self.assertEqual(_Call((), 'foo')[0], 'foo') + self.assertEqual(_Call((('bar', 'barz'),),)[0], '') + self.assertEqual(_Call((('bar', 'barz'), {'hello': 'world'}),)[0], '') class SpecSignatureTest(unittest.TestCase): From 5c7b8f423ab1de6221351036ac4e139861a2f4a6 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Sun, 26 Feb 2017 16:07:12 +0300 Subject: [PATCH 0042/2287] Backport recent .travis.yml changes (#308) Backported changes from master: * b52260d8bf392aa04c48b8c2467a4c034184de86 * 984eef7d6d78e1213d6ea99897343a5059a07c59 * 532519770dea5d353f0b0d718c8881a15c7542df * 91b0e7d0ca7c59df28f6a6fc1e8eb86a3925b76c --- .travis.yml | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index dc3a00d1f4b5a3..27b63c6c08b376 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,11 @@ group: beta # To cache doc-building dependencies. cache: pip +branches: + only: + - master + - /^\d\.\d$/ + os: - linux # macOS builds are disabled as the machines are under-provisioned on Travis, @@ -20,6 +25,7 @@ env: - TESTING=cpython matrix: + fast_finish: true allow_failures: - env: - TESTING=coverage @@ -30,17 +36,10 @@ matrix: env: - TESTING=docs before_script: - - | - if git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '^Doc/' - then - echo "Docs weren't updated, stopping build process." - exit - fi - cd Doc - make venv PYTHON=python3 + - cd Doc + - make venv script: - - make html SPHINXBUILD="./venv/bin/python3 -m sphinx" SPHINXOPTS="-q" - - make check + - make check suspicious html PYTHON="./venv/bin/python" SPHINXBUILD="./venv/bin/python -m sphinx" SPHINXOPTS="-q" - os: linux language: c compiler: clang From 7333d1760e12cf27bcf63265f72521892285c10a Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 26 Feb 2017 07:33:54 -0800 Subject: [PATCH 0043/2287] bpo-29648: import.rst: Add reference to create_module() (GH-290) (GH-314) (cherry picked from commit 46ce7599af82a929506baeaaee5c149970440c4c) --- Doc/reference/import.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst index 5e2c1c8b0758d8..b603d1f978a7a6 100644 --- a/Doc/reference/import.rst +++ b/Doc/reference/import.rst @@ -431,7 +431,7 @@ on the module object. If the method returns ``None``, the import machinery will create the new module itself. .. versionadded:: 3.4 - The create_module() method of loaders. + The :meth:`~importlib.abc.Loader.create_module` method of loaders. .. versionchanged:: 3.4 The :meth:`~importlib.abc.Loader.load_module` method was replaced by From 1457984c003b1e461f8aab93bfc37fd8e42312d5 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 26 Feb 2017 07:44:16 -0800 Subject: [PATCH 0044/2287] bpo-22594: Add a link to the regex module in re documentation (GH-241) (GH-316) (cherry picked from commit ed6795e46f7653e23b862efad240a93453e7df97) --- Doc/library/re.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Doc/library/re.rst b/Doc/library/re.rst index fe5ebcc67c840b..9cced512706554 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -42,6 +42,12 @@ module-level functions and methods on that don't require you to compile a regex object first, but miss some fine-tuning parameters. +.. seealso:: + + The third-party `regex `_ module, + which has an API compatible with the standard library :mod:`re` module, + but offers additional functionality and a more thorough Unicode support. + .. _re-syntax: From 893e86e9d3c0caeb878ccb1120c7259e022f3b68 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Sun, 26 Feb 2017 19:04:00 +0300 Subject: [PATCH 0045/2287] bpo-29121: Remove outdated documentation about transactions (#313) (#319) Patch by Aviv Palivoda. (cherry picked from commit fe70d924bb6106d4c21eb414f4a1ba1324e8f46a) --- Doc/library/sqlite3.rst | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index 5635577da0f946..d1f7a6f120620b 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -927,14 +927,6 @@ By default, the :mod:`sqlite3` module opens transactions implicitly before a Data Modification Language (DML) statement (i.e. ``INSERT``/``UPDATE``/``DELETE``/``REPLACE``). -So if you are within a transaction and issue a command like ``CREATE TABLE -...``, ``VACUUM``, ``PRAGMA``, the :mod:`sqlite3` module will commit implicitly -before executing that command. There are two reasons for doing that. The first -is that some of these commands don't work within transactions. The other reason -is that sqlite3 needs to keep track of the transaction state (if a transaction -is active or not). The current transaction state is exposed through the -:attr:`Connection.in_transaction` attribute of the connection object. - You can control which kind of ``BEGIN`` statements sqlite3 implicitly executes (or none at all) via the *isolation_level* parameter to the :func:`connect` call, or via the :attr:`isolation_level` property of connections. @@ -945,6 +937,9 @@ Otherwise leave it at its default, which will result in a plain "BEGIN" statement, or set it to one of SQLite's supported isolation levels: "DEFERRED", "IMMEDIATE" or "EXCLUSIVE". +The current transaction state is exposed through the +:attr:`Connection.in_transaction` attribute of the connection object. + .. versionchanged:: 3.6 :mod:`sqlite3` used to implicitly commit an open transaction before DDL statements. This is no longer the case. From 76995cab69d5ef83d31d8a5754cbad11be4038cb Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Sun, 26 Feb 2017 19:09:10 +0300 Subject: [PATCH 0046/2287] bpo-28518: Start a transaction implicitly before a DML statement (#245) (#318) Patch by Aviv Palivoda. (cherry picked from commit 4a926caf8e5fd8af771b2c34bfb6e91c732331fe) --- Lib/sqlite3/test/transactions.py | 9 +++++++++ Misc/NEWS | 3 +++ Modules/_sqlite/cursor.c | 9 ++++----- Modules/_sqlite/statement.c | 12 +++++++----- Modules/_sqlite/statement.h | 2 +- 5 files changed, 24 insertions(+), 11 deletions(-) diff --git a/Lib/sqlite3/test/transactions.py b/Lib/sqlite3/test/transactions.py index 45f1b04c69648f..b8a13de55bc720 100644 --- a/Lib/sqlite3/test/transactions.py +++ b/Lib/sqlite3/test/transactions.py @@ -179,6 +179,15 @@ def CheckDdlDoesNotAutostartTransaction(self): result = self.con.execute("select * from test").fetchall() self.assertEqual(result, []) + def CheckImmediateTransactionalDDL(self): + # You can achieve transactional DDL by issuing a BEGIN + # statement manually. + self.con.execute("begin immediate") + self.con.execute("create table test(i)") + self.con.rollback() + with self.assertRaises(sqlite.OperationalError): + self.con.execute("select * from test") + def CheckTransactionalDDL(self): # You can achieve transactional DDL by issuing a BEGIN # statement manually. diff --git a/Misc/NEWS b/Misc/NEWS index 0f5c27902ba423..a48debdc20ecff 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -69,6 +69,9 @@ Extension Modules Library ------- +- bpo-28518: Start a transaction implicitly before a DML statement. + Patch by Aviv Palivoda. + - bpo-29532: Altering a kwarg dictionary passed to functools.partial() no longer affects a partial object after creation. diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 39f7a6508c2aef..8341fb8480172c 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -511,10 +511,9 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* pysqlite_statement_reset(self->statement); pysqlite_statement_mark_dirty(self->statement); - /* For backwards compatibility reasons, do not start a transaction if a - DDL statement is encountered. If anybody wants transactional DDL, - they can issue a BEGIN statement manually. */ - if (self->connection->begin_statement && !sqlite3_stmt_readonly(self->statement->st) && !self->statement->is_ddl) { + /* We start a transaction implicitly before a DML statement. + SELECT is the only exception. See #9924. */ + if (self->connection->begin_statement && self->statement->is_dml) { if (sqlite3_get_autocommit(self->connection->db)) { result = _pysqlite_connection_begin(self->connection); if (!result) { @@ -609,7 +608,7 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* } } - if (!sqlite3_stmt_readonly(self->statement->st)) { + if (self->statement->is_dml) { self->rowcount += (long)sqlite3_changes(self->connection->db); } else { self->rowcount= -1L; diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index 0df661b9c7ad31..087375be9b63d8 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -73,8 +73,9 @@ int pysqlite_statement_create(pysqlite_Statement* self, pysqlite_Connection* con Py_INCREF(sql); self->sql = sql; - /* determine if the statement is a DDL statement */ - self->is_ddl = 0; + /* Determine if the statement is a DML statement. + SELECT is the only exception. See #9924. */ + self->is_dml = 0; for (p = sql_cstr; *p != 0; p++) { switch (*p) { case ' ': @@ -84,9 +85,10 @@ int pysqlite_statement_create(pysqlite_Statement* self, pysqlite_Connection* con continue; } - self->is_ddl = (PyOS_strnicmp(p, "create ", 7) == 0) - || (PyOS_strnicmp(p, "drop ", 5) == 0) - || (PyOS_strnicmp(p, "reindex ", 8) == 0); + self->is_dml = (PyOS_strnicmp(p, "insert ", 7) == 0) + || (PyOS_strnicmp(p, "update ", 7) == 0) + || (PyOS_strnicmp(p, "delete ", 7) == 0) + || (PyOS_strnicmp(p, "replace ", 8) == 0); break; } diff --git a/Modules/_sqlite/statement.h b/Modules/_sqlite/statement.h index 6eef16857f7b85..8db10f6649ce80 100644 --- a/Modules/_sqlite/statement.h +++ b/Modules/_sqlite/statement.h @@ -38,7 +38,7 @@ typedef struct sqlite3_stmt* st; PyObject* sql; int in_use; - int is_ddl; + int is_dml; PyObject* in_weakreflist; /* List of weak references */ } pysqlite_Statement; From deea29e61e61f0e216bff3f0ca008f5ee231793f Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 26 Feb 2017 08:55:23 -0800 Subject: [PATCH 0047/2287] bpo-26184: import.rst: Improve versionchanged note (GH-277) (#320) (cherry picked from commit 6b4a5f45e2df524174a97832571c82c76a3d424a) --- Doc/reference/import.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst index b603d1f978a7a6..484457a8a5bb5c 100644 --- a/Doc/reference/import.rst +++ b/Doc/reference/import.rst @@ -464,8 +464,11 @@ import machinery will create the new module itself. .. versionchanged:: 3.5 A :exc:`DeprecationWarning` is raised when ``exec_module()`` is defined but - ``create_module()`` is not. Starting in Python 3.6 it will be an error to not - define ``create_module()`` on a loader attached to a ModuleSpec. + ``create_module()`` is not. + +.. versionchanged:: 3.6 + An :exc:`ImportError` is raised when ``exec_module()`` is defined but + ``create_module`` is not. Submodules ---------- From 6b81003bdbd9375886bae54f876650bcdccfe6c7 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Sun, 26 Feb 2017 20:38:31 +0300 Subject: [PATCH 0048/2287] bpo-28624: Add a test that checks that cwd parameter of Popen() accepts PathLike objects (#157) (#323) (cherry picked from commit d5c11f7ace48701bb950c6345deee88c35c66e26) --- Doc/library/subprocess.rst | 10 +++++++--- Lib/test/test_subprocess.py | 10 ++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index ad2abe82453622..548e4a68cbf1d1 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -466,9 +466,13 @@ functions. The *pass_fds* parameter was added. If *cwd* is not ``None``, the function changes the working directory to - *cwd* before executing the child. In particular, the function looks for - *executable* (or for the first item in *args*) relative to *cwd* if the - executable path is a relative path. + *cwd* before executing the child. *cwd* can be a :class:`str` and + :term:`path-like ` object. In particular, the function + looks for *executable* (or for the first item in *args*) relative to *cwd* + if the executable path is a relative path. + + .. versionchanged:: 3.6 + *cwd* parameter accepts a :term:`path-like object`. If *restore_signals* is true (the default) all signals that Python has set to SIG_IGN are restored to SIG_DFL in the child process before the exec. diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index e63f9f254cd2b2..3c871dde5c532f 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -347,6 +347,16 @@ def test_cwd(self): temp_dir = self._normalize_cwd(temp_dir) self._assert_cwd(temp_dir, sys.executable, cwd=temp_dir) + def test_cwd_with_pathlike(self): + temp_dir = tempfile.gettempdir() + temp_dir = self._normalize_cwd(temp_dir) + + class _PathLikeObj: + def __fspath__(self): + return temp_dir + + self._assert_cwd(temp_dir, sys.executable, cwd=_PathLikeObj()) + @unittest.skipIf(mswindows, "pending resolution of issue #15533") def test_cwd_with_relative_arg(self): # Check that Popen looks for args[0] relative to cwd if args[0] diff --git a/Misc/ACKS b/Misc/ACKS index 1d6e773b553c52..c3b29a42a34f75 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -269,6 +269,7 @@ Albert Chin-A-Young Adal Chiriliuc Matt Chisholm Lita Cho +Sayan Chowdhury Anders Chrigström Tom Christiansen Renee Chu diff --git a/Misc/NEWS b/Misc/NEWS index a48debdc20ecff..dfafe7b081adae 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -69,6 +69,9 @@ Extension Modules Library ------- +- bpo-28624: Add a test that checks that cwd parameter of Popen() accepts + PathLike objects. Patch by Sayan Chowdhury. + - bpo-28518: Start a transaction implicitly before a DML statement. Patch by Aviv Palivoda. From c9131b61fa060a51ec181053cade9f0a7ee91e4f Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Mon, 27 Feb 2017 04:09:32 +0900 Subject: [PATCH 0049/2287] [3.6] bpo-29110: Fix file object leak in `aifc.open` (#310) (cherry picked from commit 03f68b60e17b57f6f13729ff73245dbb37b30a4c) (GH-162) (cherry picked from commit 5dc33eea538361f8a218255f83db2e9298dd8c53) (GH-293) --- Lib/aifc.py | 37 +++++++++++++++++++++++++------------ Lib/test/test_aifc.py | 18 +++++++++++++++++- Misc/NEWS | 3 +++ 3 files changed, 45 insertions(+), 13 deletions(-) diff --git a/Lib/aifc.py b/Lib/aifc.py index 692d0bfd272bf0..13ad7dc5ca3d62 100644 --- a/Lib/aifc.py +++ b/Lib/aifc.py @@ -303,6 +303,8 @@ class Aifc_read: # _ssnd_chunk -- instantiation of a chunk class for the SSND chunk # _framesize -- size of one frame in the file + _file = None # Set here since __del__ checks it + def initfp(self, file): self._version = 0 self._convert = None @@ -344,9 +346,15 @@ def initfp(self, file): def __init__(self, f): if isinstance(f, str): - f = builtins.open(f, 'rb') - # else, assume it is an open file object already - self.initfp(f) + file_object = builtins.open(f, 'rb') + try: + self.initfp(file_object) + except: + file_object.close() + raise + else: + # assume it is an open file object already + self.initfp(f) def __enter__(self): return self @@ -541,18 +549,23 @@ class Aifc_write: # _datalength -- the size of the audio samples written to the header # _datawritten -- the size of the audio samples actually written + _file = None # Set here since __del__ checks it + def __init__(self, f): if isinstance(f, str): - filename = f - f = builtins.open(f, 'wb') - else: - # else, assume it is an open file object already - filename = '???' - self.initfp(f) - if filename[-5:] == '.aiff': - self._aifc = 0 + file_object = builtins.open(f, 'wb') + try: + self.initfp(file_object) + except: + file_object.close() + raise + + # treat .aiff file extensions as non-compressed audio + if f.endswith('.aiff'): + self._aifc = 0 else: - self._aifc = 1 + # assume it is an open file object already + self.initfp(f) def initfp(self, file): self._file = file diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py index 1bd1f89c8aa609..a731a5136ba5fd 100644 --- a/Lib/test/test_aifc.py +++ b/Lib/test/test_aifc.py @@ -1,5 +1,6 @@ -from test.support import findfile, TESTFN, unlink +from test.support import check_no_resource_warning, findfile, TESTFN, unlink import unittest +from unittest import mock from test import audiotests from audioop import byteswap import io @@ -149,6 +150,21 @@ def test_skipunknown(self): #This file contains chunk types aifc doesn't recognize. self.f = aifc.open(findfile('Sine-1000Hz-300ms.aif')) + def test_close_opened_files_on_error(self): + non_aifc_file = findfile('pluck-pcm8.wav', subdir='audiodata') + with check_no_resource_warning(self): + with self.assertRaises(aifc.Error): + # Try opening a non-AIFC file, with the expectation that + # `aifc.open` will fail (without raising a ResourceWarning) + self.f = aifc.open(non_aifc_file, 'rb') + + # Aifc_write.initfp() won't raise in normal case. But some errors + # (e.g. MemoryError, KeyboardInterrupt, etc..) can happen. + with mock.patch.object(aifc.Aifc_write, 'initfp', + side_effect=RuntimeError): + with self.assertRaises(RuntimeError): + self.fout = aifc.open(TESTFN, 'wb') + def test_params_added(self): f = self.f = aifc.open(TESTFN, 'wb') f.aiff() diff --git a/Misc/NEWS b/Misc/NEWS index dfafe7b081adae..5fad3c82c1a3a0 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -78,6 +78,9 @@ Library - bpo-29532: Altering a kwarg dictionary passed to functools.partial() no longer affects a partial object after creation. +- bpo-29110: Fix file object leak in aifc.open() when file is given as a + filesystem path and is not in valid AIFF format. Patch by Anthony Zhang. + - bpo-22807: Add uuid.SafeUUID and uuid.UUID.is_safe to relay information from the platform about whether generated UUIDs are generated with a multiprocessing safe method. From 7e4897a2fb91e49f131a42ed6de88b5185f7dea8 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 26 Feb 2017 13:30:44 -0800 Subject: [PATCH 0050/2287] bpo-26184: import.rst: Improve versionchanged note (GH-325) (GH-326) (cherry picked from commit 1f5639c77f736c18fb5a85b4a1850121e25c788e) --- Doc/reference/import.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst index 484457a8a5bb5c..4dbd9d88c301a0 100644 --- a/Doc/reference/import.rst +++ b/Doc/reference/import.rst @@ -468,7 +468,7 @@ import machinery will create the new module itself. .. versionchanged:: 3.6 An :exc:`ImportError` is raised when ``exec_module()`` is defined but - ``create_module`` is not. + ``create_module()`` is not. Submodules ---------- From 4b6c41768a15fc85e3069603ef89344bd97f79af Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Mon, 27 Feb 2017 11:45:42 +0800 Subject: [PATCH 0051/2287] bpo-29376: Fix assertion error in threading._DummyThread.is_alive() (GH-330) --- Lib/test/test_threading.py | 3 +++ Lib/threading.py | 4 ++++ Misc/NEWS | 2 ++ 3 files changed, 9 insertions(+) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 2c2914fd6d8969..6b6c4d220a3bd0 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -170,6 +170,9 @@ def f(mutex): mutex.acquire() self.assertIn(tid, threading._active) self.assertIsInstance(threading._active[tid], threading._DummyThread) + #Issue 29376 + self.assertTrue(threading._active[tid].is_alive()) + self.assertRegex(repr(threading._active[tid]), '_DummyThread') del threading._active[tid] # PyThreadState_SetAsyncExc() is a CPython-only gimmick, not (currently) diff --git a/Lib/threading.py b/Lib/threading.py index 4829ff426e0bfd..95978d310a2f3a 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -1217,6 +1217,10 @@ def __init__(self): def _stop(self): pass + def is_alive(self): + assert not self._is_stopped and self._started.is_set() + return True + def join(self, timeout=None): assert False, "cannot join a dummy thread" diff --git a/Misc/NEWS b/Misc/NEWS index 5fad3c82c1a3a0..c47657fb28357f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -69,6 +69,8 @@ Extension Modules Library ------- +- bpo-29376: Fix assertion error in threading._DummyThread.is_alive(). + - bpo-28624: Add a test that checks that cwd parameter of Popen() accepts PathLike objects. Patch by Sayan Chowdhury. From 8aa1ad892ff3cf4d8881cdae0e95be1a5bad175e Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Mon, 27 Feb 2017 13:55:07 +0800 Subject: [PATCH 0052/2287] bpo-29662: fix wrong indentation in timeit.Timer's doc (GH-333) --- Doc/library/timeit.rst | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Doc/library/timeit.rst b/Doc/library/timeit.rst index 3b772765aca260..5793c54ae8d1a3 100644 --- a/Doc/library/timeit.rst +++ b/Doc/library/timeit.rst @@ -134,21 +134,21 @@ The module defines three convenience functions and a public class: timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit() - .. method:: Timer.autorange(callback=None) + .. method:: Timer.autorange(callback=None) - Automatically determine how many times to call :meth:`.timeit`. + Automatically determine how many times to call :meth:`.timeit`. - This is a convenience function that calls :meth:`.timeit` repeatedly - so that the total time >= 0.2 second, returning the eventual - (number of loops, time taken for that number of loops). It calls - :meth:`.timeit` with *number* set to successive powers of ten (10, - 100, 1000, ...) up to a maximum of one billion, until the time taken - is at least 0.2 second, or the maximum is reached. + This is a convenience function that calls :meth:`.timeit` repeatedly + so that the total time >= 0.2 second, returning the eventual + (number of loops, time taken for that number of loops). It calls + :meth:`.timeit` with *number* set to successive powers of ten (10, + 100, 1000, ...) up to a maximum of one billion, until the time taken + is at least 0.2 second, or the maximum is reached. - If *callback* is given and is not ``None``, it will be called after - each trial with two arguments: ``callback(number, time_taken)``. + If *callback* is given and is not ``None``, it will be called after + each trial with two arguments: ``callback(number, time_taken)``. - .. versionadded:: 3.6 + .. versionadded:: 3.6 .. method:: Timer.repeat(repeat=3, number=1000000) From bc10e6bd7b6b4a738ce327e31550048d3dd8d8bd Mon Sep 17 00:00:00 2001 From: Mariatta Date: Mon, 27 Feb 2017 06:02:21 -0800 Subject: [PATCH 0053/2287] Asyncio documentation: remove `self` from method signatures (GH-334) (GH-337) (cherry picked from commit 091b84f23a2ff57e8320ebf6fdf889af39096ab9) --- Doc/library/asyncio-protocol.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/asyncio-protocol.rst b/Doc/library/asyncio-protocol.rst index 3fbf51058673d9..482ffbbed35b1e 100644 --- a/Doc/library/asyncio-protocol.rst +++ b/Doc/library/asyncio-protocol.rst @@ -36,7 +36,7 @@ BaseTransport Base class for transports. - .. method:: close(self) + .. method:: close() Close the transport. If the transport has a buffer for outgoing data, buffered data will be flushed asynchronously. No more data @@ -44,7 +44,7 @@ BaseTransport protocol's :meth:`connection_lost` method will be called with :const:`None` as its argument. - .. method:: is_closing(self) + .. method:: is_closing() Return ``True`` if the transport is closing or is closed. @@ -251,7 +251,7 @@ BaseSubprocessTransport if it hasn't returned, similarly to the :attr:`subprocess.Popen.returncode` attribute. - .. method:: kill(self) + .. method:: kill() Kill the subprocess, as in :meth:`subprocess.Popen.kill`. From 046041e23b3c7e0b4a08705e2792ef3e28d03384 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Mon, 27 Feb 2017 17:26:10 +0300 Subject: [PATCH 0054/2287] Delete accidentally merged entries from Misc/NEWS (#338) --- Misc/NEWS | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index c47657fb28357f..7ec6b1291a3d2d 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -83,16 +83,6 @@ Library - bpo-29110: Fix file object leak in aifc.open() when file is given as a filesystem path and is not in valid AIFF format. Patch by Anthony Zhang. -- bpo-22807: Add uuid.SafeUUID and uuid.UUID.is_safe to relay information from - the platform about whether generated UUIDs are generated with a - multiprocessing safe method. - -- bpo-29576: Improve some deprecations in importlib. Some deprecated methods - now emit DeprecationWarnings and have better descriptive messages. - -- bpo-29534: Fixed different behaviour of Decimal.from_float() - for _decimal and _pydecimal. Thanks Andrew Nester. - - Issue #28556: Various updates to typing module: typing.Counter, typing.ChainMap, improved ABC caching, etc. Original PRs by Jelle Zijlstra, Ivan Levkivskyi, Manuel Krebber, and Łukasz Langa. From 53039ad3814a8918c5311f37bd654428b9843fcc Mon Sep 17 00:00:00 2001 From: Martijn Pieters Date: Mon, 27 Feb 2017 16:08:01 +0000 Subject: [PATCH 0055/2287] bpo-28598: Support __rmod__ for RHS subclasses of str in % string formatting operations (#95) --- Lib/test/test_unicode.py | 9 +++++++++ Misc/NEWS | 3 +++ Python/ceval.c | 12 +++++++++--- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 86ebd45e7b031d..2844bc5540c38b 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -1448,6 +1448,15 @@ def test_formatting_huge_precision(self): with self.assertRaises(ValueError): result = format_string % 2.34 + def test_issue28598_strsubclass_rhs(self): + # A subclass of str with an __rmod__ method should be able to hook + # into the % operator + class SubclassedStr(str): + def __rmod__(self, other): + return 'Success, self.__rmod__({!r}) was called'.format(other) + self.assertEqual('lhs %% %r' % SubclassedStr('rhs'), + "Success, self.__rmod__('lhs %% %r') was called") + @support.cpython_only def test_formatting_huge_precision_c_limits(self): from _testcapi import INT_MAX diff --git a/Misc/NEWS b/Misc/NEWS index 7ec6b1291a3d2d..fe420b62f231dd 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.6.1 release candidate 1? Core and Builtins ----------------- +- Issue #28598: Support __rmod__ for subclasses of str being called before + str.__mod__. Patch by Martijn Pieters. + - bpo-29607: Fix stack_effect computation for CALL_FUNCTION_EX. Patch by Matthieu Dartiailh. diff --git a/Python/ceval.c b/Python/ceval.c index d5172b9631f43d..c9e9c327f31401 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1409,9 +1409,15 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) TARGET(BINARY_MODULO) { PyObject *divisor = POP(); PyObject *dividend = TOP(); - PyObject *res = PyUnicode_CheckExact(dividend) ? - PyUnicode_Format(dividend, divisor) : - PyNumber_Remainder(dividend, divisor); + PyObject *res; + if (PyUnicode_CheckExact(dividend) && ( + !PyUnicode_Check(divisor) || PyUnicode_CheckExact(divisor))) { + // fast path; string formatting, but not if the RHS is a str subclass + // (see issue28598) + res = PyUnicode_Format(dividend, divisor); + } else { + res = PyNumber_Remainder(dividend, divisor); + } Py_DECREF(divisor); Py_DECREF(dividend); SET_TOP(res); From bb59d89ceeb1abfb4d73c7fc60b534e4464adf35 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Mon, 27 Feb 2017 19:14:11 +0300 Subject: [PATCH 0056/2287] bpo-27788 : synchronise platform.py version number (#246) (#341) Was bumped in the docstring by b9f4feab1b9c9ffa8ea29af3d82bc536f9f3005a but not in `__version__` (cherry picked from commit 6059ce45aa96f52fa0150e68ea655fbfdc25609a) --- Lib/platform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/platform.py b/Lib/platform.py index e48ad0b6e7bdea..062347537531ba 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -110,7 +110,7 @@ """ -__version__ = '1.0.7' +__version__ = '1.0.8' import collections import sys, os, re, subprocess From 7accf2033d03025cc5324f8b9d22582bca3623e9 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Mon, 27 Feb 2017 20:41:21 +0300 Subject: [PATCH 0057/2287] bpo-29655: Fixed possible reference leaks in `import *`. (#301) (#348) Patch by Matthias Bussonnier. (cherry picked from commit 160edb43571311a3785785c1dfa784afc52d87be) --- Python/ceval.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Python/ceval.c b/Python/ceval.c index c9e9c327f31401..83667353af232c 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2857,13 +2857,16 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) TARGET(IMPORT_STAR) { PyObject *from = POP(), *locals; int err; - if (PyFrame_FastToLocalsWithError(f) < 0) + if (PyFrame_FastToLocalsWithError(f) < 0) { + Py_DECREF(from); goto error; + } locals = f->f_locals; if (locals == NULL) { PyErr_SetString(PyExc_SystemError, "no locals found during 'import *'"); + Py_DECREF(from); goto error; } err = import_all_from(locals, from); From c4a786b8ad2a625594551ab3bc991a6831ba7688 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Tue, 28 Feb 2017 11:28:44 +0800 Subject: [PATCH 0058/2287] bpo-29661: fix contradiction in timeit.Timer.autorange's docstring (GH-331) (GH-353) --- Lib/timeit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 Lib/timeit.py diff --git a/Lib/timeit.py b/Lib/timeit.py old mode 100644 new mode 100755 index 2770efa35a0160..8eea766b4c344b --- a/Lib/timeit.py +++ b/Lib/timeit.py @@ -208,7 +208,7 @@ def repeat(self, repeat=default_repeat, number=default_number): return r def autorange(self, callback=None): - """Return the number of loops so that total time >= 0.2. + """Return the number of loops and time taken so that total time >= 0.2. Calls the timeit method with *number* set to successive powers of ten (10, 100, 1000, ...) up to a maximum of one billion, until From d413aa7893fd8ac64693c22deb2c1eee1840dbd7 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Tue, 28 Feb 2017 23:19:58 -0500 Subject: [PATCH 0059/2287] Disable mention-bot for maintenance branches (GH-365) --- .mention-bot | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .mention-bot diff --git a/.mention-bot b/.mention-bot new file mode 100644 index 00000000000000..cb53b993fb1e8a --- /dev/null +++ b/.mention-bot @@ -0,0 +1,3 @@ +{ + "findPotentialReviewers": false +} From 8458b2b4ef06805d65c9e253433727e60820992e Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 28 Feb 2017 21:07:32 -0800 Subject: [PATCH 0060/2287] correct documentation for enum.html (GH-358) (GH-367) (cherry picked from commit 626584284e74a68fff8157f9afe77b3088ff7be9) --- Doc/library/enum.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 5cd6472f3e2f45..6548adf789da17 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -24,8 +24,8 @@ Module Contents --------------- This module defines four enumeration classes that can be used to define unique -sets of names and values: :class:`Enum`, :class:`IntEnum`, and -:class:`IntFlags`. It also defines one decorator, :func:`unique`, and one +sets of names and values: :class:`Enum`, :class:`IntEnum`, :class:`Flag`, and +:class:`IntFlag`. It also defines one decorator, :func:`unique`, and one helper, :class:`auto`. .. class:: Enum From 1b93ed4f3ea5a4ac9786f15870e9b2812ba87cb1 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 28 Feb 2017 21:08:13 -0800 Subject: [PATCH 0061/2287] Fixed a handful of typos (GH-343) (GH-364) (cherry picked from commit 1cf2a809b1eb4f9fc8ac3ccc97424586892d1e1a) --- Doc/library/email.compat32-message.rst | 4 ++-- Doc/library/email.message.rst | 2 +- Doc/library/idle.rst | 2 +- Doc/library/ssl.rst | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Doc/library/email.compat32-message.rst b/Doc/library/email.compat32-message.rst index 2c65079ebdc3f1..afb5df5d428929 100644 --- a/Doc/library/email.compat32-message.rst +++ b/Doc/library/email.compat32-message.rst @@ -37,7 +37,7 @@ generating a serialized version of the mssage, and for recursively walking over the object tree. Note that duplicate headers are supported but special methods must be used to access them. -The :class:`Message` psuedo-dictionary is indexed by the header names, which +The :class:`Message` pseudo-dictionary is indexed by the header names, which must be ASCII values. The values of the dictionary are strings that are supposed to contain only ASCII characters; there is some special handling for non-ASCII input, but it doesn't always produce the correct results. Headers @@ -181,7 +181,7 @@ Here are the methods of the :class:`Message` class: This is a legacy method. On the :class:`~email.emailmessage.EmailMessage` class its functionality is replaced by :meth:`~email.message.EmailMessage.set_content` and the - realted ``make`` and ``add`` methods. + related ``make`` and ``add`` methods. .. method:: get_payload(i=None, decode=False) diff --git a/Doc/library/email.message.rst b/Doc/library/email.message.rst index 32852e706986b4..d36e769f763cd8 100644 --- a/Doc/library/email.message.rst +++ b/Doc/library/email.message.rst @@ -364,7 +364,7 @@ message objects. *header* specifies an alternative header to :mailheader:`Content-Type`. If the value contains non-ASCII characters, the charset and language may - be explicity specified using the optional *charset* and *language* + be explicitly specified using the optional *charset* and *language* parameters. Optional *language* specifies the :rfc:`2231` language, defaulting to the empty string. Both *charset* and *language* should be strings. The default is to use the ``utf8`` *charset* and ``None`` for diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index a629bc50dbc749..07c2a25d6a012c 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -446,7 +446,7 @@ longer or disable the extension. Calltips ^^^^^^^^ -A calltip is shown when one types :kbd:`(` after the name of an *acccessible* +A calltip is shown when one types :kbd:`(` after the name of an *accessible* function. A name expression may include dots and subscripts. A calltip remains until it is clicked, the cursor is moved out of the argument area, or :kbd:`)` is typed. When the cursor is in the argument part of a definition, diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index 07b97715a985b5..7b76b2a0064bf8 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -616,7 +616,7 @@ Constants .. data:: PROTOCOL_TLS_CLIENT - Auto-negotiate the the highest protocol version like :data:`PROTOCOL_SSLv23`, + Auto-negotiate the highest protocol version like :data:`PROTOCOL_SSLv23`, but only support client-side :class:`SSLSocket` connections. The protocol enables :data:`CERT_REQUIRED` and :attr:`~SSLContext.check_hostname` by default. @@ -625,7 +625,7 @@ Constants .. data:: PROTOCOL_TLS_SERVER - Auto-negotiate the the highest protocol version like :data:`PROTOCOL_SSLv23`, + Auto-negotiate the highest protocol version like :data:`PROTOCOL_SSLv23`, but only support server-side :class:`SSLSocket` connections. .. versionadded:: 3.6 @@ -948,7 +948,7 @@ SSL Sockets :ref:`notes on non-blocking sockets `. Usually, :class:`SSLSocket` are not created directly, but using the - the :meth:`SSLContext.wrap_socket` method. + :meth:`SSLContext.wrap_socket` method. .. versionchanged:: 3.5 The :meth:`sendfile` method was added. From 023532e558bb0c5bf60195aebbafe63a0bebd85e Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Wed, 1 Mar 2017 21:14:43 +0900 Subject: [PATCH 0062/2287] bpo-29684: Fix minor regression of PyEval_CallObjectWithKeywords. (GH-378) --- Misc/NEWS | 4 ++++ Python/ceval.c | 13 +++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index fe420b62f231dd..33559a7abb8ce1 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ What's New in Python 3.6.1 release candidate 1? Core and Builtins ----------------- +- bpo-29684: Fix minor regression of PyEval_CallObjectWithKeywords. + It should raise TypeError when kwargs is not a dict. But it might + cause segv when args=NULL and kwargs is not a dict. + - Issue #28598: Support __rmod__ for subclasses of str being called before str.__mod__. Patch by Martijn Pieters. diff --git a/Python/ceval.c b/Python/ceval.c index 83667353af232c..02bc67ef71090a 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4699,11 +4699,7 @@ PyEval_CallObjectWithKeywords(PyObject *func, PyObject *args, PyObject *kwargs) assert(!PyErr_Occurred()); #endif - if (args == NULL) { - return _PyObject_FastCallDict(func, NULL, 0, kwargs); - } - - if (!PyTuple_Check(args)) { + if (args != NULL && !PyTuple_Check(args)) { PyErr_SetString(PyExc_TypeError, "argument list must be a tuple"); return NULL; @@ -4715,7 +4711,12 @@ PyEval_CallObjectWithKeywords(PyObject *func, PyObject *args, PyObject *kwargs) return NULL; } - return PyObject_Call(func, args, kwargs); + if (args == NULL) { + return _PyObject_FastCallDict(func, NULL, 0, kwargs); + } + else { + return PyObject_Call(func, args, kwargs); + } } const char * From b05d48e021bc9c0700939978ab1ba300e0407a0e Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 1 Mar 2017 07:35:23 -0800 Subject: [PATCH 0063/2287] email.compat32-message.rst: Fix typo in the word `message` (GH-379) (GH-380) (cherry picked from commit da62373b0d32c14a4137512ef6f13c24fbcaa2c1) --- Doc/library/email.compat32-message.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/email.compat32-message.rst b/Doc/library/email.compat32-message.rst index afb5df5d428929..b0707646e64ac6 100644 --- a/Doc/library/email.compat32-message.rst +++ b/Doc/library/email.compat32-message.rst @@ -33,9 +33,9 @@ having a MIME type such as :mimetype:`multipart/\*` or The conceptual model provided by a :class:`Message` object is that of an ordered dictionary of headers with additional methods for accessing both specialized information from the headers, for accessing the payload, for -generating a serialized version of the mssage, and for recursively walking over -the object tree. Note that duplicate headers are supported but special methods -must be used to access them. +generating a serialized version of the message, and for recursively walking +over the object tree. Note that duplicate headers are supported but special +methods must be used to access them. The :class:`Message` pseudo-dictionary is indexed by the header names, which must be ASCII values. The values of the dictionary are strings that are From 784ba7c8ad53638c94270011d55d2536ff0cd2dd Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 2 Mar 2017 12:32:13 -0500 Subject: [PATCH 0064/2287] bpo-29697: Don't use OpenSSL <1.0.2 fallback on 1.1+ (#397) --- Modules/_ssl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/_ssl.c b/Modules/_ssl.c index b1988570604db1..c0a7b8e1052c33 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -2729,12 +2729,12 @@ _ssl__SSLContext_impl(PyTypeObject *type, int proto_version) #endif -#ifndef OPENSSL_NO_ECDH +#if !defined(OPENSSL_NO_ECDH) && !defined(OPENSSL_VERSION_1_1) /* Allow automatic ECDH curve selection (on OpenSSL 1.0.2+), or use prime256v1 by default. This is Apache mod_ssl's initialization policy, so we should be safe. OpenSSL 1.1 has it enabled by default. */ -#if defined(SSL_CTX_set_ecdh_auto) && !defined(OPENSSL_VERSION_1_1) +#if defined(SSL_CTX_set_ecdh_auto) SSL_CTX_set_ecdh_auto(self->ctx, 1); #else { From 65bd0bdf3d285e3917d66c600c95cb0842e3b3be Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Thu, 2 Mar 2017 12:37:50 -0500 Subject: [PATCH 0065/2287] In SSL module version examples, don't use a legacy version. (#381) (#400) --- Doc/library/ssl.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index 7b76b2a0064bf8..bbb13745b203e6 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -846,7 +846,7 @@ Constants The version string of the OpenSSL library loaded by the interpreter:: >>> ssl.OPENSSL_VERSION - 'OpenSSL 0.9.8k 25 Mar 2009' + 'OpenSSL 1.0.2k 26 Jan 2017' .. versionadded:: 3.2 @@ -856,7 +856,7 @@ Constants OpenSSL library:: >>> ssl.OPENSSL_VERSION_INFO - (0, 9, 8, 11, 15) + (1, 0, 2, 11, 15) .. versionadded:: 3.2 @@ -865,9 +865,9 @@ Constants The raw version number of the OpenSSL library, as a single integer:: >>> ssl.OPENSSL_VERSION_NUMBER - 9470143 + 268443839 >>> hex(ssl.OPENSSL_VERSION_NUMBER) - '0x9080bf' + '0x100020bf' .. versionadded:: 3.2 From a6e84933d204f807e0e81b6a2237193b2e8ab89a Mon Sep 17 00:00:00 2001 From: Brian Coleman Date: Thu, 2 Mar 2017 22:21:53 +0000 Subject: [PATCH 0066/2287] bpo-29683 - Fixes to _PyCode_SetExtra when co_extra->ce->extras is (#402) allocated. On PyMem_Realloc failure, _PyCode_SetExtra should free co_extra if co_extra->ce_extras could not be allocated. On PyMem_Realloc success, _PyCode_SetExtra should set all unused slots in co_extra->ce_extras to NULL. --- Misc/NEWS | 3 +++ Objects/codeobject.c | 24 ++++++++++++++---------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 33559a7abb8ce1..a57c476a0b5be1 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.6.1 release candidate 1? Core and Builtins ----------------- +- bpo-29683: Fixes to memory allocation in _PyCode_SetExtra. Patch by + Brian Coleman. + - bpo-29684: Fix minor regression of PyEval_CallObjectWithKeywords. It should raise TypeError when kwargs is not a dict. But it might cause segv when args=NULL and kwargs is not a dict. diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 0d8a675f9fbfc6..df8b9538fe9ed5 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -856,16 +856,15 @@ _PyCode_SetExtra(PyObject *code, Py_ssize_t index, void *extra) _PyCodeObjectExtra *co_extra = (_PyCodeObjectExtra *) o->co_extra; if (co_extra == NULL) { - o->co_extra = (_PyCodeObjectExtra*) PyMem_Malloc( - sizeof(_PyCodeObjectExtra)); - if (o->co_extra == NULL) { + co_extra = PyMem_Malloc(sizeof(_PyCodeObjectExtra)); + if (co_extra == NULL) { return -1; } - co_extra = (_PyCodeObjectExtra *) o->co_extra; co_extra->ce_extras = PyMem_Malloc( tstate->co_extra_user_count * sizeof(void*)); if (co_extra->ce_extras == NULL) { + PyMem_Free(co_extra); return -1; } @@ -874,20 +873,25 @@ _PyCode_SetExtra(PyObject *code, Py_ssize_t index, void *extra) for (Py_ssize_t i = 0; i < co_extra->ce_size; i++) { co_extra->ce_extras[i] = NULL; } + + o->co_extra = co_extra; } else if (co_extra->ce_size <= index) { - co_extra->ce_extras = PyMem_Realloc( + void** ce_extras = PyMem_Realloc( co_extra->ce_extras, tstate->co_extra_user_count * sizeof(void*)); - if (co_extra->ce_extras == NULL) { + if (ce_extras == NULL) { return -1; } - co_extra->ce_size = tstate->co_extra_user_count; - - for (Py_ssize_t i = co_extra->ce_size; i < co_extra->ce_size; i++) { - co_extra->ce_extras[i] = NULL; + for (Py_ssize_t i = co_extra->ce_size; + i < tstate->co_extra_user_count; + i++) { + ce_extras[i] = NULL; } + + co_extra->ce_extras = ce_extras; + co_extra->ce_size = tstate->co_extra_user_count; } co_extra->ce_extras[index] = extra; From 01e5230ef0b28658cf7311be199363eda98808bd Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Thu, 2 Mar 2017 22:06:15 -0500 Subject: [PATCH 0067/2287] bpo-29703: asyncio: Fix creating new event loops in child processes. (#404) (#410) --- Lib/asyncio/events.py | 8 +++++++- Lib/asyncio/test_utils.py | 5 ++++- Lib/test/test_asyncio/test_events.py | 22 ++++++++++++++++++++++ Misc/NEWS | 3 +++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py index 28a45fc3cc5aee..7b30b4c84ad9a7 100644 --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -11,6 +11,7 @@ import functools import inspect +import os import reprlib import socket import subprocess @@ -611,6 +612,9 @@ def new_event_loop(self): # A TLS for the running event loop, used by _get_running_loop. class _RunningLoop(threading.local): _loop = None + _pid = None + + _running_loop = _RunningLoop() @@ -620,7 +624,8 @@ def _get_running_loop(): This is a low-level function intended to be used by event loops. This function is thread-specific. """ - return _running_loop._loop + if _running_loop._pid == os.getpid(): + return _running_loop._loop def _set_running_loop(loop): @@ -629,6 +634,7 @@ def _set_running_loop(loop): This is a low-level function intended to be used by event loops. This function is thread-specific. """ + _running_loop._pid = os.getpid() _running_loop._loop = loop diff --git a/Lib/asyncio/test_utils.py b/Lib/asyncio/test_utils.py index 99e3839f456858..b12d5db2a9755d 100644 --- a/Lib/asyncio/test_utils.py +++ b/Lib/asyncio/test_utils.py @@ -449,12 +449,15 @@ def new_test_loop(self, gen=None): self.set_event_loop(loop) return loop + def unpatch_get_running_loop(self): + events._get_running_loop = self._get_running_loop + def setUp(self): self._get_running_loop = events._get_running_loop events._get_running_loop = lambda: None def tearDown(self): - events._get_running_loop = self._get_running_loop + self.unpatch_get_running_loop() events.set_event_loop(None) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index 28d92a9f4e3eac..802763bd11ff61 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -1,6 +1,7 @@ """Tests for events.py.""" import collections.abc +import concurrent.futures import functools import gc import io @@ -57,6 +58,15 @@ def osx_tiger(): return version < (10, 5) +def _test_get_event_loop_new_process__sub_proc(): + async def doit(): + return 'hello' + + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + return loop.run_until_complete(doit()) + + ONLYCERT = data_file('ssl_cert.pem') ONLYKEY = data_file('ssl_key.pem') SIGNED_CERTFILE = data_file('keycert3.pem') @@ -2181,6 +2191,18 @@ def tearDown(self): asyncio.set_child_watcher(None) super().tearDown() + def test_get_event_loop_new_process(self): + async def main(): + pool = concurrent.futures.ProcessPoolExecutor() + return await self.loop.run_in_executor( + pool, _test_get_event_loop_new_process__sub_proc) + + self.unpatch_get_running_loop() + + self.assertEqual( + self.loop.run_until_complete(main()), + 'hello') + if hasattr(selectors, 'KqueueSelector'): class KqueueEventLoopTests(UnixEventLoopTestsMixin, SubprocessTestsMixin, diff --git a/Misc/NEWS b/Misc/NEWS index a57c476a0b5be1..8391c6a795a2c7 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -79,6 +79,9 @@ Extension Modules Library ------- +- bpo-29703: Fix asyncio to support instantiation of new event loops + in child processes. + - bpo-29376: Fix assertion error in threading._DummyThread.is_alive(). - bpo-28624: Add a test that checks that cwd parameter of Popen() accepts From dea5101ae101aefed14de98e6bb1658f4cae8712 Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Thu, 2 Mar 2017 22:20:00 -0500 Subject: [PATCH 0068/2287] bpo-28893: Set __cause__ for errors in async iteration protocol (#407) --- Lib/test/test_coroutines.py | 38 +++++++++++++++++++++++++++++++++++++ Misc/NEWS | 3 +++ Python/ceval.c | 6 +++--- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index 78439a2acae2d8..b4c7b5be6e208c 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -1680,6 +1680,44 @@ async def foo(): warnings.simplefilter("error") run_async(foo()) + def test_for_11(self): + class F: + def __aiter__(self): + return self + def __anext__(self): + return self + def __await__(self): + 1 / 0 + + async def main(): + async for _ in F(): + pass + + with self.assertRaisesRegex(TypeError, + 'an invalid object from __anext__') as c: + main().send(None) + + err = c.exception + self.assertIsInstance(err.__cause__, ZeroDivisionError) + + def test_for_12(self): + class F: + def __aiter__(self): + return self + def __await__(self): + 1 / 0 + + async def main(): + async for _ in F(): + pass + + with self.assertRaisesRegex(TypeError, + 'an invalid object from __aiter__') as c: + main().send(None) + + err = c.exception + self.assertIsInstance(err.__cause__, ZeroDivisionError) + def test_for_tuple(self): class Done(Exception): pass diff --git a/Misc/NEWS b/Misc/NEWS index 8391c6a795a2c7..7e355e1b91c041 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.6.1 release candidate 1? Core and Builtins ----------------- +- bpo-28893: Set correct __cause__ for errors about invalid awaitables + returned from __aiter__ and __anext__. + - bpo-29683: Fixes to memory allocation in _PyCode_SetExtra. Patch by Brian Coleman. diff --git a/Python/ceval.c b/Python/ceval.c index 02bc67ef71090a..9cac771abdf65b 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1904,13 +1904,13 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) awaitable = _PyCoro_GetAwaitableIter(iter); if (awaitable == NULL) { - SET_TOP(NULL); - PyErr_Format( + _PyErr_FormatFromCause( PyExc_TypeError, "'async for' received an invalid object " "from __aiter__: %.100s", Py_TYPE(iter)->tp_name); + SET_TOP(NULL); Py_DECREF(iter); goto error; } else { @@ -1969,7 +1969,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) awaitable = _PyCoro_GetAwaitableIter(next_iter); if (awaitable == NULL) { - PyErr_Format( + _PyErr_FormatFromCause( PyExc_TypeError, "'async for' received an invalid object " "from __anext__: %.100s", From 13802a3b11eb5202b16e464cbfb85c144f8581ce Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Thu, 2 Mar 2017 22:16:33 -0500 Subject: [PATCH 0069/2287] bpo-29271: Fix Task.current_task and Task.all_tasks to accept None. (#406) --- Lib/test/test_asyncio/test_tasks.py | 17 +++++++++++++++++ Misc/NEWS | 3 +++ Modules/_asynciomodule.c | 16 ++++++++-------- Modules/clinic/_asynciomodule.c.h | 6 +++--- 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index a18d49ae374112..4f05319457985a 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -1462,6 +1462,14 @@ def test_current_task(self): def coro(loop): self.assertTrue(Task.current_task(loop=loop) is task) + # See http://bugs.python.org/issue29271 for details: + asyncio.set_event_loop(loop) + try: + self.assertIs(Task.current_task(None), task) + self.assertIs(Task.current_task(), task) + finally: + asyncio.set_event_loop(None) + task = self.new_task(self.loop, coro(self.loop)) self.loop.run_until_complete(task) self.assertIsNone(Task.current_task(loop=self.loop)) @@ -1806,8 +1814,17 @@ def kill_me(loop): # schedule the task coro = kill_me(self.loop) task = asyncio.ensure_future(coro, loop=self.loop) + self.assertEqual(Task.all_tasks(loop=self.loop), {task}) + # See http://bugs.python.org/issue29271 for details: + asyncio.set_event_loop(self.loop) + try: + self.assertEqual(Task.all_tasks(), {task}) + self.assertEqual(Task.all_tasks(None), {task}) + finally: + asyncio.set_event_loop(None) + # execute the task so it waits for future self.loop._run_once() self.assertEqual(len(self.loop._ready), 0) diff --git a/Misc/NEWS b/Misc/NEWS index 7e355e1b91c041..ab5c602c454e93 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -82,6 +82,9 @@ Extension Modules Library ------- +- bpo-29271: Fix Task.current_task and Task.all_tasks implemented in C + to accept None argument as their pure Python implementation. + - bpo-29703: Fix asyncio to support instantiation of new event loops in child processes. diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index fff90468a5927c..d0e43ae47d9ec8 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -1413,7 +1413,7 @@ TaskObj_get_fut_waiter(TaskObj *task) @classmethod _asyncio.Task.current_task - loop: 'O' = NULL + loop: 'O' = None Return the currently running task in an event loop or None. @@ -1424,12 +1424,12 @@ None is returned when called not in the context of a Task. static PyObject * _asyncio_Task_current_task_impl(PyTypeObject *type, PyObject *loop) -/*[clinic end generated code: output=99fbe7332c516e03 input=cd784537f02cf833]*/ +/*[clinic end generated code: output=99fbe7332c516e03 input=a0d6cdf2e3b243e1]*/ { PyObject *res; - if (loop == NULL) { - loop = PyObject_CallObject(asyncio_get_event_loop, NULL); + if (loop == Py_None) { + loop = _PyObject_CallNoArg(asyncio_get_event_loop); if (loop == NULL) { return NULL; } @@ -1500,7 +1500,7 @@ task_all_tasks(PyObject *loop) @classmethod _asyncio.Task.all_tasks - loop: 'O' = NULL + loop: 'O' = None Return a set of all tasks for an event loop. @@ -1509,12 +1509,12 @@ By default all tasks for the current event loop are returned. static PyObject * _asyncio_Task_all_tasks_impl(PyTypeObject *type, PyObject *loop) -/*[clinic end generated code: output=11f9b20749ccca5d input=cd64aa5f88bd5c49]*/ +/*[clinic end generated code: output=11f9b20749ccca5d input=c6f5b53bd487488f]*/ { PyObject *res; - if (loop == NULL) { - loop = PyObject_CallObject(asyncio_get_event_loop, NULL); + if (loop == Py_None) { + loop = _PyObject_CallNoArg(asyncio_get_event_loop); if (loop == NULL) { return NULL; } diff --git a/Modules/clinic/_asynciomodule.c.h b/Modules/clinic/_asynciomodule.c.h index 052d252331f6a7..41f11f4cac5494 100644 --- a/Modules/clinic/_asynciomodule.c.h +++ b/Modules/clinic/_asynciomodule.c.h @@ -278,7 +278,7 @@ _asyncio_Task_current_task(PyTypeObject *type, PyObject **args, Py_ssize_t nargs PyObject *return_value = NULL; static const char * const _keywords[] = {"loop", NULL}; static _PyArg_Parser _parser = {"|O:current_task", _keywords, 0}; - PyObject *loop = NULL; + PyObject *loop = Py_None; if (!_PyArg_ParseStack(args, nargs, kwnames, &_parser, &loop)) { @@ -310,7 +310,7 @@ _asyncio_Task_all_tasks(PyTypeObject *type, PyObject **args, Py_ssize_t nargs, P PyObject *return_value = NULL; static const char * const _keywords[] = {"loop", NULL}; static _PyArg_Parser _parser = {"|O:all_tasks", _keywords, 0}; - PyObject *loop = NULL; + PyObject *loop = Py_None; if (!_PyArg_ParseStack(args, nargs, kwnames, &_parser, &loop)) { @@ -517,4 +517,4 @@ _asyncio_Task__wakeup(TaskObj *self, PyObject **args, Py_ssize_t nargs, PyObject exit: return return_value; } -/*[clinic end generated code: output=8f036321bb083066 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=40ca6c9da517da73 input=a9049054013a1b77]*/ From 604faba1db724951ee440337099d111e3ecade49 Mon Sep 17 00:00:00 2001 From: "Seth M. Larson" Date: Thu, 2 Mar 2017 22:21:18 -0600 Subject: [PATCH 0070/2287] bpo-29704: Fix asyncio.SubprocessStreamProtocol closing (#405) --- Lib/asyncio/subprocess.py | 17 +- Lib/test/test_asyncio/test_subprocess.py | 24 + Misc/NEWS | 785 +++++++++++++++++++++++ 3 files changed, 824 insertions(+), 2 deletions(-) diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py index b2f5304f772121..4c85466859f8f0 100644 --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -24,6 +24,8 @@ def __init__(self, limit, loop): self._limit = limit self.stdin = self.stdout = self.stderr = None self._transport = None + self._process_exited = False + self._pipe_fds = [] def __repr__(self): info = [self.__class__.__name__] @@ -43,12 +45,14 @@ def connection_made(self, transport): self.stdout = streams.StreamReader(limit=self._limit, loop=self._loop) self.stdout.set_transport(stdout_transport) + self._pipe_fds.append(1) stderr_transport = transport.get_pipe_transport(2) if stderr_transport is not None: self.stderr = streams.StreamReader(limit=self._limit, loop=self._loop) self.stderr.set_transport(stderr_transport) + self._pipe_fds.append(2) stdin_transport = transport.get_pipe_transport(0) if stdin_transport is not None: @@ -86,9 +90,18 @@ def pipe_connection_lost(self, fd, exc): else: reader.set_exception(exc) + if fd in self._pipe_fds: + self._pipe_fds.remove(fd) + self._maybe_close_transport() + def process_exited(self): - self._transport.close() - self._transport = None + self._process_exited = True + self._maybe_close_transport() + + def _maybe_close_transport(self): + if len(self._pipe_fds) == 0 and self._process_exited: + self._transport.close() + self._transport = None class Process: diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py index bba688bb5a53c7..2e14a8a9735535 100644 --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -459,6 +459,30 @@ def test_popen_error(self): self.loop.run_until_complete(create) self.assertEqual(warns, []) + def test_read_stdout_after_process_exit(self): + @asyncio.coroutine + def execute(): + code = '\n'.join(['import sys', + 'for _ in range(64):', + ' sys.stdout.write("x" * 4096)', + 'sys.stdout.flush()', + 'sys.exit(1)']) + + fut = asyncio.create_subprocess_exec( + sys.executable, '-c', code, + stdout=asyncio.subprocess.PIPE, + loop=self.loop) + + process = yield from fut + while True: + data = yield from process.stdout.read(65536) + if data: + yield from asyncio.sleep(0.3, loop=self.loop) + else: + break + + self.loop.run_until_complete(execute()) + if sys.platform != 'win32': # Unix diff --git a/Misc/NEWS b/Misc/NEWS index ab5c602c454e93..ef45957e47e76c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -4,6 +4,791 @@ Python News What's New in Python 3.6.1 release candidate 1? =============================================== +What's New in Python 3.7.0 alpha 1? +=================================== + +*Release date: XXXX-XX-XX* + +Core and Builtins +----------------- + +- bpo-28893: Set correct __cause__ for errors about invalid awaitables + returned from __aiter__ and __anext__. + +- bpo-29683: Fixes to memory allocation in _PyCode_SetExtra. Patch by + Brian Coleman. + +- bpo-29684: Fix minor regression of PyEval_CallObjectWithKeywords. + It should raise TypeError when kwargs is not a dict. But it might + cause segv when args=NULL and kwargs is not a dict. + +- bpo-28598: Support __rmod__ for subclasses of str being called before + str.__mod__. Patch by Martijn Pieters. + +- bpo-29607: Fix stack_effect computation for CALL_FUNCTION_EX. + Patch by Matthieu Dartiailh. + +- bpo-29602: Fix incorrect handling of signed zeros in complex constructor for + complex subclasses and for inputs having a __complex__ method. Patch + by Serhiy Storchaka. + +- bpo-29347: Fixed possibly dereferencing undefined pointers + when creating weakref objects. + +- bpo-29463: Add ``docstring`` field to Module, ClassDef, FunctionDef, + and AsyncFunctionDef ast nodes. docstring is not first stmt in their body + anymore. It affects ``co_firstlineno`` and ``co_lnotab`` of code object + for module and class. + +- bpo-29438: Fixed use-after-free problem in key sharing dict. + +- bpo-29546: Set the 'path' and 'name' attribute on ImportError for ``from ... import ...``. + +- bpo-29546: Improve from-import error message with location + +- Issue #29319: Prevent RunMainFromImporter overwriting sys.path[0]. + +- Issue #29337: Fixed possible BytesWarning when compare the code objects. + Warnings could be emitted at compile time. + +- Issue #29327: Fixed a crash when pass the iterable keyword argument to + sorted(). + +- Issue #29034: Fix memory leak and use-after-free in os module (path_converter). + +- Issue #29159: Fix regression in bytes(x) when x.__index__() raises Exception. + +- Issue #29049: Call _PyObject_GC_TRACK() lazily when calling Python function. + Calling function is up to 5% faster. + +- Issue #28927: bytes.fromhex() and bytearray.fromhex() now ignore all ASCII + whitespace, not only spaces. Patch by Robert Xiao. + +- Issue #28932: Do not include if it does not exist. + +- Issue #25677: Correct the positioning of the syntax error caret for + indented blocks. Based on patch by Michael Layzell. + +- Issue #29000: Fixed bytes formatting of octals with zero padding in alternate + form. + +- Issue #18896: Python function can now have more than 255 parameters. + collections.namedtuple() now supports tuples with more than 255 elements. + +- Issue #28596: The preferred encoding is UTF-8 on Android. Patch written by + Chi Hsuan Yen. + +- Issue #26919: On Android, operating system data is now always encoded/decoded + to/from UTF-8, instead of the locale encoding to avoid inconsistencies with + os.fsencode() and os.fsdecode() which are already using UTF-8. + +- Issue #28991: functools.lru_cache() was susceptible to an obscure reentrancy + bug triggerable by a monkey-patched len() function. + +- Issue #28147: Fix a memory leak in split-table dictionaries: setattr() + must not convert combined table into split table. Patch written by INADA + Naoki. + +- Issue #28739: f-string expressions are no longer accepted as docstrings and + by ast.literal_eval() even if they do not include expressions. + +- Issue #28512: Fixed setting the offset attribute of SyntaxError by + PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject(). + +- Issue #28918: Fix the cross compilation of xxlimited when Python has been + built with Py_DEBUG defined. + +- Issue #23722: Rather than silently producing a class that doesn't support + zero-argument ``super()`` in methods, failing to pass the new + ``__classcell__`` namespace entry up to ``type.__new__`` now results in a + ``DeprecationWarning`` and a class that supports zero-argument ``super()``. + +- Issue #28797: Modifying the class __dict__ inside the __set_name__ method of + a descriptor that is used inside that class no longer prevents calling the + __set_name__ method of other descriptors. + +- Issue #28799: Remove the ``PyEval_GetCallStats()`` function and deprecate + the untested and undocumented ``sys.callstats()`` function. Remove the + ``CALL_PROFILE`` special build: use the :func:`sys.setprofile` function, + :mod:`cProfile` or :mod:`profile` to profile function calls. + +- Issue #12844: More than 255 arguments can now be passed to a function. + +- Issue #28782: Fix a bug in the implementation ``yield from`` when checking + if the next instruction is YIELD_FROM. Regression introduced by WORDCODE + (issue #26647). + +- Issue #28774: Fix error position of the unicode error in ASCII and Latin1 + encoders when a string returned by the error handler contains multiple + non-encodable characters (non-ASCII for the ASCII codec, characters out + of the U+0000-U+00FF range for Latin1). + +- Issue #28731: Optimize _PyDict_NewPresized() to create correct size dict. + Improve speed of dict literal with constant keys up to 30%. + +- Issue #28532: Show sys.version when -V option is supplied twice. + +- Issue #27100: The with-statement now checks for __enter__ before it + checks for __exit__. This gives less confusing error messages when + both methods are missing. Patch by Jonathan Ellington. + +- Issue #28746: Fix the set_inheritable() file descriptor method on platforms + that do not have the ioctl FIOCLEX and FIONCLEX commands. + +- Issue #26920: Fix not getting the locale's charset upon initializing the + interpreter, on platforms that do not have langinfo. + +- Issue #28648: Fixed crash in Py_DecodeLocale() in debug build on Mac OS X + when decode astral characters. Patch by Xiang Zhang. + +- Issue #28665: Improve speed of the STORE_DEREF opcode by 40%. + +- Issue #19398: Extra slash no longer added to sys.path components in case of + empty compile-time PYTHONPATH components. + +- Issue #28621: Sped up converting int to float by reusing faster bits counting + implementation. Patch by Adrian Wielgosik. + +- Issue #28580: Optimize iterating split table values. + Patch by Xiang Zhang. + +- Issue #28583: PyDict_SetDefault didn't combine split table when needed. + Patch by Xiang Zhang. + +- Issue #28128: Deprecation warning for invalid str and byte escape + sequences now prints better information about where the error + occurs. Patch by Serhiy Storchaka and Eric Smith. + +- Issue #28509: dict.update() no longer allocate unnecessary large memory. + +- Issue #28426: Fixed potential crash in PyUnicode_AsDecodedObject() in debug + build. + +- Issue #28517: Fixed of-by-one error in the peephole optimizer that caused + keeping unreachable code. + +- Issue #28214: Improved exception reporting for problematic __set_name__ + attributes. + +- Issue #23782: Fixed possible memory leak in _PyTraceback_Add() and exception + loss in PyTraceBack_Here(). + +- Issue #28183: Optimize and cleanup dict iteration. + +- Issue #26081: Added C implementation of asyncio.Future. + Original patch by Yury Selivanov. + +- Issue #28379: Added sanity checks and tests for PyUnicode_CopyCharacters(). + Patch by Xiang Zhang. + +- Issue #28376: The type of long range iterator is now registered as Iterator. + Patch by Oren Milman. + +- Issue #28376: Creating instances of range_iterator by calling range_iterator + type now is disallowed. Calling iter() on range instance is the only way. + Patch by Oren Milman. + +- Issue #26906: Resolving special methods of uninitialized type now causes + implicit initialization of the type instead of a fail. + +- Issue #18287: PyType_Ready() now checks that tp_name is not NULL. + Original patch by Niklas Koep. + +- Issue #24098: Fixed possible crash when AST is changed in process of + compiling it. + +- Issue #28201: Dict reduces possibility of 2nd conflict in hash table when + hashes have same lower bits. + +- Issue #28350: String constants with null character no longer interned. + +- Issue #26617: Fix crash when GC runs during weakref callbacks. + +- Issue #27942: String constants now interned recursively in tuples and frozensets. + +- Issue #28289: ImportError.__init__ now resets not specified attributes. + +- Issue #21578: Fixed misleading error message when ImportError called with + invalid keyword args. + +- Issue #28203: Fix incorrect type in complex(1.0, {2:3}) error message. + Patch by Soumya Sharma. + +- Issue #28086: Single var-positional argument of tuple subtype was passed + unscathed to the C-defined function. Now it is converted to exact tuple. + +- Issue #28214: Now __set_name__ is looked up on the class instead of the + instance. + +- Issue #27955: Fallback on reading /dev/urandom device when the getrandom() + syscall fails with EPERM, for example when blocked by SECCOMP. + +- Issue #28192: Don't import readline in isolated mode. + +- Issue #27441: Remove some redundant assignments to ob_size in longobject.c. + Thanks Oren Milman. + +- Issue #27222: Clean up redundant code in long_rshift function. Thanks + Oren Milman. + +- Upgrade internal unicode databases to Unicode version 9.0.0. + +- Issue #28131: Fix a regression in zipimport's compile_source(). zipimport + should use the same optimization level as the interpreter. + +- Issue #28126: Replace Py_MEMCPY with memcpy(). Visual Studio can properly + optimize memcpy(). + +- Issue #28120: Fix dict.pop() for splitted dictionary when trying to remove a + "pending key" (Not yet inserted in split-table). Patch by Xiang Zhang. + +- Issue #26182: Raise DeprecationWarning when async and await keywords are + used as variable/attribute/class/function name. + +- Issue #26182: Fix a refleak in code that raises DeprecationWarning. + +- Issue #28721: Fix asynchronous generators aclose() and athrow() to + handle StopAsyncIteration propagation properly. + +- Issue #26110: Speed-up method calls: add LOAD_METHOD and CALL_METHOD + opcodes. + +Extension Modules +----------------- + +- Issue #29169: Update zlib to 1.2.11. + +Library +------- + +- bpo-29704: asyncio.subprocess.SubprocessStreamProtocol no longer closes before + all pipes are closed. + +- bpo-29271: Fix Task.current_task and Task.all_tasks implemented in C + to accept None argument as their pure Python implementation. + +- bpo-29703: Fix asyncio to support instantiation of new event loops + in child processes. + +- bpo-29615: SimpleXMLRPCDispatcher no longer chains KeyError (or any other + exception) to exception(s) raised in the dispatched methods. + Patch by Petr Motejlek. + +- bpo-7769: Method register_function() of xmlrpc.server.SimpleXMLRPCDispatcher + and its subclasses can now be used as a decorator. + +- bpo-29376: Fix assertion error in threading._DummyThread.is_alive(). + +- bpo-28624: Add a test that checks that cwd parameter of Popen() accepts + PathLike objects. Patch by Sayan Chowdhury. + +- bpo-28518: Start a transaction implicitly before a DML statement. + Patch by Aviv Palivoda. + +- Issue #16285: urrlib.parse.quote is now based on RFC 3986 and hence includes + '~' in the set of characters that is not quoted by default. Patch by + Christian Theune and Ratnadeep Debnath. + +- bpo-29532: Altering a kwarg dictionary passed to functools.partial() + no longer affects a partial object after creation. + +- bpo-29110: Fix file object leak in aifc.open() when file is given as a + filesystem path and is not in valid AIFF format. Patch by Anthony Zhang. + +- bpo-22807: Add uuid.SafeUUID and uuid.UUID.is_safe to relay information from + the platform about whether generated UUIDs are generated with a + multiprocessing safe method. + +- bpo-29576: Improve some deprecations in importlib. Some deprecated methods + now emit DeprecationWarnings and have better descriptive messages. + +- bpo-29534: Fixed different behaviour of Decimal.from_float() + for _decimal and _pydecimal. Thanks Andrew Nester. + +- Issue #28556: Various updates to typing module: typing.Counter, typing.ChainMap, + improved ABC caching, etc. Original PRs by Jelle Zijlstra, Ivan Levkivskyi, + Manuel Krebber, and Łukasz Langa. + +- Issue #29100: Fix datetime.fromtimestamp() regression introduced in Python + 3.6.0: check minimum and maximum years. + +- Issue #29416: Prevent infinite loop in pathlib.Path.mkdir + +- Issue #29444: Fixed out-of-bounds buffer access in the group() method of + the match object. Based on patch by WGH. + +- Issue #29377: Add SlotWrapperType, MethodWrapperType, and + MethodDescriptorType built-in types to types module. + Original patch by Manuel Krebber. + +- Issue #29218: Unused install_misc command is now removed. It has been + documented as unused since 2000. Patch by Eric N. Vander Weele. + +- Issue #29368: The extend() method is now called instead of the append() + method when unpickle collections.deque and other list-like objects. + This can speed up unpickling to 2 times. + +- Issue #29338: The help of a builtin or extension class now includes the + constructor signature if __text_signature__ is provided for the class. + +- Issue #29335: Fix subprocess.Popen.wait() when the child process has + exited to a stopped instead of terminated state (ex: when under ptrace). + +- Issue #29290: Fix a regression in argparse that help messages would wrap at + non-breaking spaces. + +- Issue #28735: Fixed the comparison of mock.MagickMock with mock.ANY. + +- Issue #29197: Removed deprecated function ntpath.splitunc(). + +- Issue #29210: Removed support of deprecated argument "exclude" in + tarfile.TarFile.add(). + +- Issue #29219: Fixed infinite recursion in the repr of uninitialized + ctypes.CDLL instances. + +- Issue #29192: Removed deprecated features in the http.cookies module. + +- Issue #29193: A format string argument for string.Formatter.format() + is now positional-only. + +- Issue #29195: Removed support of deprecated undocumented keyword arguments + in methods of regular expression objects. + +- Issue #28969: Fixed race condition in C implementation of functools.lru_cache. + KeyError could be raised when cached function with full cache was + simultaneously called from differen threads with the same uncached arguments. + +- Issue #20804: The unittest.mock.sentinel attributes now preserve their + identity when they are copied or pickled. + +- Issue #29142: In urllib.request, suffixes in no_proxy environment variable with + leading dots could match related hostnames again (e.g. .b.c matches a.b.c). + Patch by Milan Oberkirch. + +- Issue #28961: Fix unittest.mock._Call helper: don't ignore the name parameter + anymore. Patch written by Jiajun Huang. + +- Issue #15812: inspect.getframeinfo() now correctly shows the first line of + a context. Patch by Sam Breese. + +- Issue #28985: Update authorizer constants in sqlite3 module. + Patch by Dingyuan Wang. + +- Issue #29094: Offsets in a ZIP file created with extern file object and modes + "w" and "x" now are relative to the start of the file. + +- Issue #29079: Prevent infinite loop in pathlib.resolve() on Windows + +- Issue #13051: Fixed recursion errors in large or resized + curses.textpad.Textbox. Based on patch by Tycho Andersen. + +- Issue #9770: curses.ascii predicates now work correctly with negative + integers. + +- Issue #28427: old keys should not remove new values from + WeakValueDictionary when collecting from another thread. + +- Issue 28923: Remove editor artifacts from Tix.py. + +- Issue #28871: Fixed a crash when deallocate deep ElementTree. + +- Issue #19542: Fix bugs in WeakValueDictionary.setdefault() and + WeakValueDictionary.pop() when a GC collection happens in another + thread. + +- Issue #20191: Fixed a crash in resource.prlimit() when passing a sequence that + doesn't own its elements as limits. + +- Issue #16255: subprocess.Popen uses /system/bin/sh on Android as the shell, + instead of /bin/sh. + +- Issue #28779: multiprocessing.set_forkserver_preload() would crash the + forkserver process if a preloaded module instantiated some + multiprocessing objects such as locks. + +- Issue #26937: The chown() method of the tarfile.TarFile class does not fail + now when the grp module cannot be imported, as for example on Android + platforms. + +- Issue #28847: dbm.dumb now supports reading read-only files and no longer + writes the index file when it is not changed. A deprecation warning is now + emitted if the index file is missed and recreated in the 'r' and 'w' modes + (will be an error in future Python releases). + +- Issue #27030: Unknown escapes consisting of ``'\'`` and an ASCII letter in + re.sub() replacement templates regular expressions now are errors. + +- Issue #28835: Fix a regression introduced in warnings.catch_warnings(): + call warnings.showwarning() if it was overriden inside the context manager. + +- Issue #27172: To assist with upgrades from 2.7, the previously documented + deprecation of ``inspect.getfullargspec()`` has been reversed. This decision + may be revisited again after the Python 2.7 branch is no longer officially + supported. + +- Issue #28740: Add sys.getandroidapilevel(): return the build time API version + of Android as an integer. Function only available on Android. + +- Issue #26273: Add new :data:`socket.TCP_CONGESTION` (Linux 2.6.13) and + :data:`socket.TCP_USER_TIMEOUT` (Linux 2.6.37) constants. Patch written by + Omar Sandoval. + +- Issue #28752: Restored the __reduce__() methods of datetime objects. + +- Issue #28727: Regular expression patterns, _sre.SRE_Pattern objects created + by re.compile(), become comparable (only x==y and x!=y operators). This + change should fix the issue #18383: don't duplicate warning filters when the + warnings module is reloaded (thing usually only done in unit tests). + +- Issue #20572: Remove the subprocess.Popen.wait endtime parameter. It was + deprecated in 3.4 and undocumented prior to that. + +- Issue #25659: In ctypes, prevent a crash calling the from_buffer() and + from_buffer_copy() methods on abstract classes like Array. + +- Issue #28548: In the "http.server" module, parse the protocol version if + possible, to avoid using HTTP 0.9 in some error responses. + +- Issue #19717: Makes Path.resolve() succeed on paths that do not exist. + Patch by Vajrasky Kok + +- Issue #28563: Fixed possible DoS and arbitrary code execution when handle + plural form selections in the gettext module. The expression parser now + supports exact syntax supported by GNU gettext. + +- Issue #28387: Fixed possible crash in _io.TextIOWrapper deallocator when + the garbage collector is invoked in other thread. Based on patch by + Sebastian Cufre. + +- Issue #27517: LZMA compressor and decompressor no longer raise exceptions if + given empty data twice. Patch by Benjamin Fogle. + +- Issue #28549: Fixed segfault in curses's addch() with ncurses6. + +- Issue #28449: tarfile.open() with mode "r" or "r:" now tries to open a tar + file with compression before trying to open it without compression. Otherwise + it had 50% chance failed with ignore_zeros=True. + +- Issue #23262: The webbrowser module now supports Firefox 36+ and derived + browsers. Based on patch by Oleg Broytman. + +- Issue #24241: The webbrowser in an X environment now prefers using the + default browser directly. Also, the webbrowser register() function now has + a documented 'preferred' argument, to specify browsers to be returned by + get() with no arguments. Patch by David Steele + +- Issue #27939: Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused + by representing the scale as float value internally in Tk. tkinter.IntVar + now works if float value is set to underlying Tk variable. + +- Issue #28255: calendar.TextCalendar.prweek() no longer prints a space after + a weeks's calendar. calendar.TextCalendar.pryear() no longer prints redundant + newline after a year's calendar. Based on patch by Xiang Zhang. + +- Issue #28255: calendar.TextCalendar.prmonth() no longer prints a space + at the start of new line after printing a month's calendar. Patch by + Xiang Zhang. + +- Issue #20491: The textwrap.TextWrapper class now honors non-breaking spaces. + Based on patch by Kaarle Ritvanen. + +- Issue #28353: os.fwalk() no longer fails on broken links. + +- Issue #28430: Fix iterator of C implemented asyncio.Future doesn't accept + non-None value is passed to it.send(val). + +- Issue #27025: Generated names for Tkinter widgets now start by the "!" prefix + for readability (was "`"). + +- Issue #25464: Fixed HList.header_exists() in tkinter.tix module by addin + a workaround to Tix library bug. + +- Issue #28488: shutil.make_archive() no longer adds entry "./" to ZIP archive. + +- Issue #25953: re.sub() now raises an error for invalid numerical group + reference in replacement template even if the pattern is not found in + the string. Error message for invalid group reference now includes the + group index and the position of the reference. + Based on patch by SilentGhost. + +- Issue #28469: timeit now uses the sequence 1, 2, 5, 10, 20, 50,... instead + of 1, 10, 100,... for autoranging. + +- Issue #28115: Command-line interface of the zipfile module now uses argparse. + Added support of long options. + +- Issue #18219: Optimize csv.DictWriter for large number of columns. + Patch by Mariatta Wijaya. + +- Issue #28448: Fix C implemented asyncio.Future didn't work on Windows. + +- Issue #23214: In the "io" module, the argument to BufferedReader and + BytesIO's read1() methods is now optional and can be -1, matching the + BufferedIOBase specification. + +- Issue #28480: Fix error building socket module when multithreading is + disabled. + +- Issue #28240: timeit: remove ``-c/--clock`` and ``-t/--time`` command line + options which were deprecated since Python 3.3. + +- Issue #28240: timeit now repeats the benchmarks 5 times instead of only 3 + to make benchmarks more reliable. + +- Issue #28240: timeit autorange now uses a single loop iteration if the + benchmark takes less than 10 seconds, instead of 10 iterations. + "python3 -m timeit -s 'import time' 'time.sleep(1)'" now takes 4 seconds + instead of 40 seconds. + +- Distutils.sdist now looks for README and setup.py files with case + sensitivity. This behavior matches that found in Setuptools 6.0 and + later. See `setuptools 100 + `_ for rationale. + +- Issue #24452: Make webbrowser support Chrome on Mac OS X. Patch by + Ned Batchelder. + +- Issue #20766: Fix references leaked by pdb in the handling of SIGINT + handlers. + +- Issue #27998: Fixed bytes path support in os.scandir() on Windows. + Patch by Eryk Sun. + +- Issue #28317: The disassembler now decodes FORMAT_VALUE argument. + +- Issue #26293: Fixed writing ZIP files that starts not from the start of the + file. Offsets in ZIP file now are relative to the start of the archive in + conforming to the specification. + +- Issue #28380: unittest.mock Mock autospec functions now properly support + assert_called, assert_not_called, and assert_called_once. + +- Issue #28229: lzma module now supports pathlib. + +- Issue #28321: Fixed writing non-BMP characters with binary format in plistlib. + +- Issue #28225: bz2 module now supports pathlib. Initial patch by Ethan Furman. + +- Issue #28227: gzip now supports pathlib. Patch by Ethan Furman. + +- Issue #28332: Deprecated silent truncations in socket.htons and socket.ntohs. + Original patch by Oren Milman. + +- Issue #27358: Optimized merging var-keyword arguments and improved error + message when passing a non-mapping as a var-keyword argument. + +- Issue #28257: Improved error message when passing a non-iterable as + a var-positional argument. Added opcode BUILD_TUPLE_UNPACK_WITH_CALL. + +- Issue #28322: Fixed possible crashes when unpickle itertools objects from + incorrect pickle data. Based on patch by John Leitch. + +- Issue #28228: imghdr now supports pathlib. + +- Issue #28226: compileall now supports pathlib. + +- Issue #28314: Fix function declaration (C flags) for the getiterator() method + of xml.etree.ElementTree.Element. + +- Issue #28148: Stop using localtime() and gmtime() in the time + module. + + Introduced platform independent _PyTime_localtime API that is + similar to POSIX localtime_r, but available on all platforms. Patch + by Ed Schouten. + +- Issue #28253: Fixed calendar functions for extreme months: 0001-01 + and 9999-12. + + Methods itermonthdays() and itermonthdays2() are reimplemented so + that they don't call itermonthdates() which can cause datetime.date + under/overflow. + +- Issue #28275: Fixed possible use after free in the decompress() + methods of the LZMADecompressor and BZ2Decompressor classes. + Original patch by John Leitch. + +- Issue #27897: Fixed possible crash in sqlite3.Connection.create_collation() + if pass invalid string-like object as a name. Patch by Xiang Zhang. + +- Issue #18844: random.choices() now has k as a keyword-only argument + to improve the readability of common cases and come into line + with the signature used in other languages. + +- Issue #18893: Fix invalid exception handling in Lib/ctypes/macholib/dyld.py. + Patch by Madison May. + +- Issue #27611: Fixed support of default root window in the tkinter.tix module. + Added the master parameter in the DisplayStyle constructor. + +- Issue #27348: In the traceback module, restore the formatting of exception + messages like "Exception: None". This fixes a regression introduced in + 3.5a2. + +- Issue #25651: Allow falsy values to be used for msg parameter of subTest(). + +- Issue #27778: Fix a memory leak in os.getrandom() when the getrandom() is + interrupted by a signal and a signal handler raises a Python exception. + +- Issue #28200: Fix memory leak on Windows in the os module (fix + path_converter() function). + +- Issue #25400: RobotFileParser now correctly returns default values for + crawl_delay and request_rate. Initial patch by Peter Wirtz. + +- Issue #27932: Prevent memory leak in win32_ver(). + +- Fix UnboundLocalError in socket._sendfile_use_sendfile. + +- Issue #28075: Check for ERROR_ACCESS_DENIED in Windows implementation of + os.stat(). Patch by Eryk Sun. + +- Issue #22493: Warning message emitted by using inline flags in the middle of + regular expression now contains a (truncated) regex pattern. + Patch by Tim Graham. + +- Issue #25270: Prevent codecs.escape_encode() from raising SystemError when + an empty bytestring is passed. + +- Issue #28181: Get antigravity over HTTPS. Patch by Kaartic Sivaraam. + +- Issue #25895: Enable WebSocket URL schemes in urllib.parse.urljoin. + Patch by Gergely Imreh and Markus Holtermann. + +- Issue #28114: Fix a crash in parse_envlist() when env contains byte strings. + Patch by Eryk Sun. + +- Issue #27599: Fixed buffer overrun in binascii.b2a_qp() and binascii.a2b_qp(). + +- Issue #27906: Fix socket accept exhaustion during high TCP traffic. + Patch by Kevin Conway. + +- Issue #28174: Handle when SO_REUSEPORT isn't properly supported. + Patch by Seth Michael Larson. + +- Issue #26654: Inspect functools.partial in asyncio.Handle.__repr__. + Patch by iceboy. + +- Issue #26909: Fix slow pipes IO in asyncio. + Patch by INADA Naoki. + +- Issue #28176: Fix callbacks race in asyncio.SelectorLoop.sock_connect. + +- Issue #27759: Fix selectors incorrectly retain invalid file descriptors. + Patch by Mark Williams. + +- Issue #28325: Remove vestigial MacOS 9 macurl2path module and its tests. + +- Issue #28368: Refuse monitoring processes if the child watcher has + no loop attached. + Patch by Vincent Michel. + +- Issue #28369: Raise RuntimeError when transport's FD is used with + add_reader, add_writer, etc. + +- Issue #28370: Speedup asyncio.StreamReader.readexactly. + Patch by Коренберг Марк. + +- Issue #28371: Deprecate passing asyncio.Handles to run_in_executor. + +- Issue #28372: Fix asyncio to support formatting of non-python coroutines. + +- Issue #28399: Remove UNIX socket from FS before binding. + Patch by Коренберг Марк. + +- Issue #27972: Prohibit Tasks to await on themselves. + +- Issue #24142: Reading a corrupt config file left configparser in an + invalid state. Original patch by Florian Höch. + +Windows +------- + +- bpo-29579: Removes readme.txt from the installer. + +- Issue #25778: winreg does not truncate string correctly (Patch by Eryk Sun) + +- Issue #28896: Deprecate WindowsRegistryFinder and disable it by default + +- Issue #28522: Fixes mishandled buffer reallocation in getpathp.c + +- Issue #28402: Adds signed catalog files for stdlib on Windows. + +- Issue #28333: Enables Unicode for ps1/ps2 and input() prompts. (Patch by + Eryk Sun) + +- Issue #28251: Improvements to help manuals on Windows. + +- Issue #28110: launcher.msi has different product codes between 32-bit and + 64-bit + +- Issue #28161: Opening CON for write access fails + +- Issue #28162: WindowsConsoleIO readall() fails if first line starts with + Ctrl+Z + +- Issue #28163: WindowsConsoleIO fileno() passes wrong flags to + _open_osfhandle + +- Issue #28164: _PyIO_get_console_type fails for various paths + +- Issue #28137: Renames Windows path file to ._pth + +- Issue #28138: Windows ._pth file should allow import site + +C API +----- + +- Issue #27867: Function PySlice_GetIndicesEx() is deprecated and replaced with + a macro if Py_LIMITED_API is not set or set to the value between 0x03050400 + and 0x03060000 (not including) or 0x03060100 or higher. Added functions + PySlice_Unpack() and PySlice_AdjustIndices(). + +- Issue #29083: Fixed the declaration of some public API functions. + PyArg_VaParse() and PyArg_VaParseTupleAndKeywords() were not available in + limited API. PyArg_ValidateKeywordArguments(), PyArg_UnpackTuple() and + Py_BuildValue() were not available in limited API of version < 3.3 when + PY_SSIZE_T_CLEAN is defined. + +- Issue #28769: The result of PyUnicode_AsUTF8AndSize() and PyUnicode_AsUTF8() + is now of type ``const char *`` rather of ``char *``. + +- Issue #29058: All stable API extensions added after Python 3.2 are now + available only when Py_LIMITED_API is set to the PY_VERSION_HEX value of + the minimum Python version supporting this API. + +- Issue #28822: The index parameters *start* and *end* of PyUnicode_FindChar() + are now adjusted to behave like ``str[start:end]``. + +- Issue #28808: PyUnicode_CompareWithASCIIString() now never raises exceptions. + +- Issue #28761: The fields name and doc of structures PyMemberDef, PyGetSetDef, + PyStructSequence_Field, PyStructSequence_Desc, and wrapperbase are now of + type ``const char *`` rather of ``char *``. + +- Issue #28748: Private variable _Py_PackageContext is now of type ``const char *`` + rather of ``char *``. + +- Issue #19569: Compiler warnings are now emitted if use most of deprecated + functions. + +- Issue #28426: Deprecated undocumented functions PyUnicode_AsEncodedObject(), + PyUnicode_AsDecodedObject(), PyUnicode_AsDecodedUnicode() and + PyUnicode_AsEncodedUnicode(). + +Documentation +------------- + +- bpo-28929: Link the documentation to its source file on GitHub. + +- bpo-25008: Document smtpd.py as effectively deprecated and add a pointer to + aiosmtpd, a third-party asyncio-based replacement. + +- Issue #26355: Add canonical header link on each page to corresponding major + version of the documentation. Patch by Matthias Bussonnier. + +- Issue #29349: Fix Python 2 syntax in code for building the documentation. *Release date: XXXX-XX-XX* From 2ef08d3be780457c444741b67e6181675b044be9 Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Thu, 2 Mar 2017 23:57:33 -0500 Subject: [PATCH 0071/2287] asyncio: Optimize _get_running_loop() to call getpid() only when there's a loop --- Lib/asyncio/events.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py index 7b30b4c84ad9a7..e85634e588f5a5 100644 --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -624,8 +624,9 @@ def _get_running_loop(): This is a low-level function intended to be used by event loops. This function is thread-specific. """ - if _running_loop._pid == os.getpid(): - return _running_loop._loop + running_loop = _running_loop._loop + if running_loop is not None and _running_loop._pid == os.getpid(): + return running_loop def _set_running_loop(loop): From d8b72e4a0673c414120b029065dbe77055f12e82 Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Thu, 2 Mar 2017 23:46:56 -0500 Subject: [PATCH 0072/2287] bpo-28963: Fix out of bound iteration in asyncio.Future.remove_done_callback/C (#408) --- Lib/test/test_asyncio/test_futures.py | 29 +++++++++++++++++++++++++++ Misc/NEWS | 3 +++ Modules/_asynciomodule.c | 2 +- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py index 89afdcaff28665..99336f86ab824e 100644 --- a/Lib/test/test_asyncio/test_futures.py +++ b/Lib/test/test_asyncio/test_futures.py @@ -569,6 +569,35 @@ def test_remove_done_callback(self): self.assertEqual(bag, [2]) self.assertEqual(f.result(), 'foo') + def test_remove_done_callbacks_list_mutation(self): + # see http://bugs.python.org/issue28963 for details + + fut = self._new_future() + fut.add_done_callback(str) + + for _ in range(63): + fut.add_done_callback(id) + + class evil: + def __eq__(self, other): + fut.remove_done_callback(id) + return False + + fut.remove_done_callback(evil()) + + def test_schedule_callbacks_list_mutation(self): + # see http://bugs.python.org/issue28963 for details + + def mut(f): + f.remove_done_callback(str) + + fut = self._new_future() + fut.add_done_callback(mut) + fut.add_done_callback(str) + fut.add_done_callback(str) + fut.set_result(1) + test_utils.run_briefly(self.loop) + @unittest.skipUnless(hasattr(futures, '_CFuture'), 'requires the C _asyncio module') diff --git a/Misc/NEWS b/Misc/NEWS index ef45957e47e76c..a13d8c74f23228 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -261,6 +261,9 @@ Extension Modules Library ------- +- bpo-28963: Fix out of bound iteration in asyncio.Future.remove_done_callback + implemented in C. + - bpo-29704: asyncio.subprocess.SubprocessStreamProtocol no longer closes before all pipes are closed. diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index d0e43ae47d9ec8..a77ff9689e4705 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -521,7 +521,7 @@ _asyncio_Future_remove_done_callback(FutureObj *self, PyObject *fn) return NULL; } - for (i = 0; i < len; i++) { + for (i = 0; i < PyList_GET_SIZE(self->fut_callbacks); i++) { int ret; PyObject *item = PyList_GET_ITEM(self->fut_callbacks, i); From b8f5d07158f171a18be4d42f9769d3c9c073e748 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 2 Mar 2017 21:50:10 -0800 Subject: [PATCH 0073/2287] bpo-29026: Clarify documentation of time.time (GH-34) (GH-417) (cherry picked from commit 23557d59b819f57800ddef0b1373acef8e024670) --- Doc/library/time.rst | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/Doc/library/time.rst b/Doc/library/time.rst index ae17f6f4f0d236..d2e2ac4410aba3 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -17,11 +17,23 @@ semantics of these functions varies among platforms. An explanation of some terminology and conventions is in order. +.. _epoch: + .. index:: single: epoch -* The :dfn:`epoch` is the point where the time starts. On January 1st of that - year, at 0 hours, the "time since the epoch" is zero. For Unix, the epoch is - 1970. To find out what the epoch is, look at ``gmtime(0)``. +* The :dfn:`epoch` is the point where the time starts, and is platform + dependent. For Unix, the epoch is January 1, 1970, 00:00:00 (UTC). + To find out what the epoch is on a given platform, look at + ``time.gmtime(0)``. + +.. _leap seconds: https://en.wikipedia.org/wiki/Leap_second + +.. index:: seconds since the epoch + +* The term :dfn:`seconds since the epoch` refers to the total number + of elapsed seconds since the epoch, typically excluding + `leap seconds`_. Leap seconds are excluded from this total on all + POSIX-compliant platforms. .. index:: single: Year 2038 @@ -467,7 +479,7 @@ The module defines the following functions and data items: (2) The range really is ``0`` to ``61``; value ``60`` is valid in - timestamps representing leap seconds and value ``61`` is supported + timestamps representing `leap seconds`_ and value ``61`` is supported for historical reasons. (3) @@ -572,12 +584,28 @@ The module defines the following functions and data items: .. function:: time() - Return the time in seconds since the epoch as a floating point number. + Return the time in seconds since the epoch_ as a floating point + number. The specific date of the epoch and the handling of + `leap seconds`_ is platform dependent. + On Windows and most Unix systems, the epoch is January 1, 1970, + 00:00:00 (UTC) and leap seconds are not counted towards the time + in seconds since the epoch. This is commonly referred to as + `Unix time `_. + To find out what the epoch is on a given platform, look at + ``gmtime(0)``. + Note that even though the time is always returned as a floating point number, not all systems provide time with a better precision than 1 second. While this function normally returns non-decreasing values, it can return a - lower value than a previous call if the system clock has been set back between - the two calls. + lower value than a previous call if the system clock has been set back + between the two calls. + + The number returned by :func:`.time` may be converted into a more common + time format (i.e. year, month, day, hour, etc...) in UTC by passing it to + :func:`gmtime` function or in local time by passing it to the + :func:`localtime` function. In both cases a + :class:`struct_time` object is returned, from which the components + of the calendar date may be accessed as attributes. .. data:: timezone From 93692b1a7cfd70be2aed33d77da05518d3a41f51 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 2 Mar 2017 21:56:06 -0800 Subject: [PATCH 0074/2287] getpass: update docstrings (GH-49) (GH-419) (cherry picked from commit baf7bb30a02aabde260143136bdf5b3738a1d409) --- Lib/getpass.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/getpass.py b/Lib/getpass.py index be511211585a48..36e17e4cb6965d 100644 --- a/Lib/getpass.py +++ b/Lib/getpass.py @@ -7,7 +7,6 @@ echoing of the password contents while reading. On Windows, the msvcrt module will be used. -On the Mac EasyDialogs.AskPassword is used, if available. """ From 2adc66848135be8e86ba08690a858737a65ae40d Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Fri, 3 Mar 2017 01:05:44 -0500 Subject: [PATCH 0075/2287] Restore NEWS file after incorrect git automerge --- Misc/NEWS | 788 +----------------------------------------------------- 1 file changed, 3 insertions(+), 785 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index a13d8c74f23228..2692043b6cbab6 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -4,8 +4,6 @@ Python News What's New in Python 3.6.1 release candidate 1? =============================================== -What's New in Python 3.7.0 alpha 1? -=================================== *Release date: XXXX-XX-XX* @@ -22,7 +20,7 @@ Core and Builtins It should raise TypeError when kwargs is not a dict. But it might cause segv when args=NULL and kwargs is not a dict. -- bpo-28598: Support __rmod__ for subclasses of str being called before +- Issue #28598: Support __rmod__ for subclasses of str being called before str.__mod__. Patch by Martijn Pieters. - bpo-29607: Fix stack_effect computation for CALL_FUNCTION_EX. @@ -35,17 +33,8 @@ Core and Builtins - bpo-29347: Fixed possibly dereferencing undefined pointers when creating weakref objects. -- bpo-29463: Add ``docstring`` field to Module, ClassDef, FunctionDef, - and AsyncFunctionDef ast nodes. docstring is not first stmt in their body - anymore. It affects ``co_firstlineno`` and ``co_lnotab`` of code object - for module and class. - - bpo-29438: Fixed use-after-free problem in key sharing dict. -- bpo-29546: Set the 'path' and 'name' attribute on ImportError for ``from ... import ...``. - -- bpo-29546: Improve from-import error message with location - - Issue #29319: Prevent RunMainFromImporter overwriting sys.path[0]. - Issue #29337: Fixed possible BytesWarning when compare the code objects. @@ -58,12 +47,6 @@ Core and Builtins - Issue #29159: Fix regression in bytes(x) when x.__index__() raises Exception. -- Issue #29049: Call _PyObject_GC_TRACK() lazily when calling Python function. - Calling function is up to 5% faster. - -- Issue #28927: bytes.fromhex() and bytearray.fromhex() now ignore all ASCII - whitespace, not only spaces. Patch by Robert Xiao. - - Issue #28932: Do not include if it does not exist. - Issue #25677: Correct the positioning of the syntax error caret for @@ -72,12 +55,6 @@ Core and Builtins - Issue #29000: Fixed bytes formatting of octals with zero padding in alternate form. -- Issue #18896: Python function can now have more than 255 parameters. - collections.namedtuple() now supports tuples with more than 255 elements. - -- Issue #28596: The preferred encoding is UTF-8 on Android. Patch written by - Chi Hsuan Yen. - - Issue #26919: On Android, operating system data is now always encoded/decoded to/from UTF-8, instead of the locale encoding to avoid inconsistencies with os.fsencode() and os.fsdecode() which are already using UTF-8. @@ -85,10 +62,6 @@ Core and Builtins - Issue #28991: functools.lru_cache() was susceptible to an obscure reentrancy bug triggerable by a monkey-patched len() function. -- Issue #28147: Fix a memory leak in split-table dictionaries: setattr() - must not convert combined table into split table. Patch written by INADA - Naoki. - - Issue #28739: f-string expressions are no longer accepted as docstrings and by ast.literal_eval() even if they do not include expressions. @@ -98,161 +71,9 @@ Core and Builtins - Issue #28918: Fix the cross compilation of xxlimited when Python has been built with Py_DEBUG defined. -- Issue #23722: Rather than silently producing a class that doesn't support - zero-argument ``super()`` in methods, failing to pass the new - ``__classcell__`` namespace entry up to ``type.__new__`` now results in a - ``DeprecationWarning`` and a class that supports zero-argument ``super()``. - -- Issue #28797: Modifying the class __dict__ inside the __set_name__ method of - a descriptor that is used inside that class no longer prevents calling the - __set_name__ method of other descriptors. - -- Issue #28799: Remove the ``PyEval_GetCallStats()`` function and deprecate - the untested and undocumented ``sys.callstats()`` function. Remove the - ``CALL_PROFILE`` special build: use the :func:`sys.setprofile` function, - :mod:`cProfile` or :mod:`profile` to profile function calls. - -- Issue #12844: More than 255 arguments can now be passed to a function. - -- Issue #28782: Fix a bug in the implementation ``yield from`` when checking - if the next instruction is YIELD_FROM. Regression introduced by WORDCODE - (issue #26647). - -- Issue #28774: Fix error position of the unicode error in ASCII and Latin1 - encoders when a string returned by the error handler contains multiple - non-encodable characters (non-ASCII for the ASCII codec, characters out - of the U+0000-U+00FF range for Latin1). - - Issue #28731: Optimize _PyDict_NewPresized() to create correct size dict. Improve speed of dict literal with constant keys up to 30%. -- Issue #28532: Show sys.version when -V option is supplied twice. - -- Issue #27100: The with-statement now checks for __enter__ before it - checks for __exit__. This gives less confusing error messages when - both methods are missing. Patch by Jonathan Ellington. - -- Issue #28746: Fix the set_inheritable() file descriptor method on platforms - that do not have the ioctl FIOCLEX and FIONCLEX commands. - -- Issue #26920: Fix not getting the locale's charset upon initializing the - interpreter, on platforms that do not have langinfo. - -- Issue #28648: Fixed crash in Py_DecodeLocale() in debug build on Mac OS X - when decode astral characters. Patch by Xiang Zhang. - -- Issue #28665: Improve speed of the STORE_DEREF opcode by 40%. - -- Issue #19398: Extra slash no longer added to sys.path components in case of - empty compile-time PYTHONPATH components. - -- Issue #28621: Sped up converting int to float by reusing faster bits counting - implementation. Patch by Adrian Wielgosik. - -- Issue #28580: Optimize iterating split table values. - Patch by Xiang Zhang. - -- Issue #28583: PyDict_SetDefault didn't combine split table when needed. - Patch by Xiang Zhang. - -- Issue #28128: Deprecation warning for invalid str and byte escape - sequences now prints better information about where the error - occurs. Patch by Serhiy Storchaka and Eric Smith. - -- Issue #28509: dict.update() no longer allocate unnecessary large memory. - -- Issue #28426: Fixed potential crash in PyUnicode_AsDecodedObject() in debug - build. - -- Issue #28517: Fixed of-by-one error in the peephole optimizer that caused - keeping unreachable code. - -- Issue #28214: Improved exception reporting for problematic __set_name__ - attributes. - -- Issue #23782: Fixed possible memory leak in _PyTraceback_Add() and exception - loss in PyTraceBack_Here(). - -- Issue #28183: Optimize and cleanup dict iteration. - -- Issue #26081: Added C implementation of asyncio.Future. - Original patch by Yury Selivanov. - -- Issue #28379: Added sanity checks and tests for PyUnicode_CopyCharacters(). - Patch by Xiang Zhang. - -- Issue #28376: The type of long range iterator is now registered as Iterator. - Patch by Oren Milman. - -- Issue #28376: Creating instances of range_iterator by calling range_iterator - type now is disallowed. Calling iter() on range instance is the only way. - Patch by Oren Milman. - -- Issue #26906: Resolving special methods of uninitialized type now causes - implicit initialization of the type instead of a fail. - -- Issue #18287: PyType_Ready() now checks that tp_name is not NULL. - Original patch by Niklas Koep. - -- Issue #24098: Fixed possible crash when AST is changed in process of - compiling it. - -- Issue #28201: Dict reduces possibility of 2nd conflict in hash table when - hashes have same lower bits. - -- Issue #28350: String constants with null character no longer interned. - -- Issue #26617: Fix crash when GC runs during weakref callbacks. - -- Issue #27942: String constants now interned recursively in tuples and frozensets. - -- Issue #28289: ImportError.__init__ now resets not specified attributes. - -- Issue #21578: Fixed misleading error message when ImportError called with - invalid keyword args. - -- Issue #28203: Fix incorrect type in complex(1.0, {2:3}) error message. - Patch by Soumya Sharma. - -- Issue #28086: Single var-positional argument of tuple subtype was passed - unscathed to the C-defined function. Now it is converted to exact tuple. - -- Issue #28214: Now __set_name__ is looked up on the class instead of the - instance. - -- Issue #27955: Fallback on reading /dev/urandom device when the getrandom() - syscall fails with EPERM, for example when blocked by SECCOMP. - -- Issue #28192: Don't import readline in isolated mode. - -- Issue #27441: Remove some redundant assignments to ob_size in longobject.c. - Thanks Oren Milman. - -- Issue #27222: Clean up redundant code in long_rshift function. Thanks - Oren Milman. - -- Upgrade internal unicode databases to Unicode version 9.0.0. - -- Issue #28131: Fix a regression in zipimport's compile_source(). zipimport - should use the same optimization level as the interpreter. - -- Issue #28126: Replace Py_MEMCPY with memcpy(). Visual Studio can properly - optimize memcpy(). - -- Issue #28120: Fix dict.pop() for splitted dictionary when trying to remove a - "pending key" (Not yet inserted in split-table). Patch by Xiang Zhang. - -- Issue #26182: Raise DeprecationWarning when async and await keywords are - used as variable/attribute/class/function name. - -- Issue #26182: Fix a refleak in code that raises DeprecationWarning. - -- Issue #28721: Fix asynchronous generators aclose() and athrow() to - handle StopAsyncIteration propagation properly. - -- Issue #26110: Speed-up method calls: add LOAD_METHOD and CALL_METHOD - opcodes. - Extension Modules ----------------- @@ -264,611 +85,8 @@ Library - bpo-28963: Fix out of bound iteration in asyncio.Future.remove_done_callback implemented in C. -- bpo-29704: asyncio.subprocess.SubprocessStreamProtocol no longer closes before - all pipes are closed. - -- bpo-29271: Fix Task.current_task and Task.all_tasks implemented in C - to accept None argument as their pure Python implementation. - -- bpo-29703: Fix asyncio to support instantiation of new event loops - in child processes. - -- bpo-29615: SimpleXMLRPCDispatcher no longer chains KeyError (or any other - exception) to exception(s) raised in the dispatched methods. - Patch by Petr Motejlek. - -- bpo-7769: Method register_function() of xmlrpc.server.SimpleXMLRPCDispatcher - and its subclasses can now be used as a decorator. - -- bpo-29376: Fix assertion error in threading._DummyThread.is_alive(). - -- bpo-28624: Add a test that checks that cwd parameter of Popen() accepts - PathLike objects. Patch by Sayan Chowdhury. - -- bpo-28518: Start a transaction implicitly before a DML statement. - Patch by Aviv Palivoda. - -- Issue #16285: urrlib.parse.quote is now based on RFC 3986 and hence includes - '~' in the set of characters that is not quoted by default. Patch by - Christian Theune and Ratnadeep Debnath. - -- bpo-29532: Altering a kwarg dictionary passed to functools.partial() - no longer affects a partial object after creation. - -- bpo-29110: Fix file object leak in aifc.open() when file is given as a - filesystem path and is not in valid AIFF format. Patch by Anthony Zhang. - -- bpo-22807: Add uuid.SafeUUID and uuid.UUID.is_safe to relay information from - the platform about whether generated UUIDs are generated with a - multiprocessing safe method. - -- bpo-29576: Improve some deprecations in importlib. Some deprecated methods - now emit DeprecationWarnings and have better descriptive messages. - -- bpo-29534: Fixed different behaviour of Decimal.from_float() - for _decimal and _pydecimal. Thanks Andrew Nester. - -- Issue #28556: Various updates to typing module: typing.Counter, typing.ChainMap, - improved ABC caching, etc. Original PRs by Jelle Zijlstra, Ivan Levkivskyi, - Manuel Krebber, and Łukasz Langa. - -- Issue #29100: Fix datetime.fromtimestamp() regression introduced in Python - 3.6.0: check minimum and maximum years. - -- Issue #29416: Prevent infinite loop in pathlib.Path.mkdir - -- Issue #29444: Fixed out-of-bounds buffer access in the group() method of - the match object. Based on patch by WGH. - -- Issue #29377: Add SlotWrapperType, MethodWrapperType, and - MethodDescriptorType built-in types to types module. - Original patch by Manuel Krebber. - -- Issue #29218: Unused install_misc command is now removed. It has been - documented as unused since 2000. Patch by Eric N. Vander Weele. - -- Issue #29368: The extend() method is now called instead of the append() - method when unpickle collections.deque and other list-like objects. - This can speed up unpickling to 2 times. - -- Issue #29338: The help of a builtin or extension class now includes the - constructor signature if __text_signature__ is provided for the class. - -- Issue #29335: Fix subprocess.Popen.wait() when the child process has - exited to a stopped instead of terminated state (ex: when under ptrace). - -- Issue #29290: Fix a regression in argparse that help messages would wrap at - non-breaking spaces. - -- Issue #28735: Fixed the comparison of mock.MagickMock with mock.ANY. - -- Issue #29197: Removed deprecated function ntpath.splitunc(). - -- Issue #29210: Removed support of deprecated argument "exclude" in - tarfile.TarFile.add(). - -- Issue #29219: Fixed infinite recursion in the repr of uninitialized - ctypes.CDLL instances. - -- Issue #29192: Removed deprecated features in the http.cookies module. - -- Issue #29193: A format string argument for string.Formatter.format() - is now positional-only. - -- Issue #29195: Removed support of deprecated undocumented keyword arguments - in methods of regular expression objects. - -- Issue #28969: Fixed race condition in C implementation of functools.lru_cache. - KeyError could be raised when cached function with full cache was - simultaneously called from differen threads with the same uncached arguments. - -- Issue #20804: The unittest.mock.sentinel attributes now preserve their - identity when they are copied or pickled. - -- Issue #29142: In urllib.request, suffixes in no_proxy environment variable with - leading dots could match related hostnames again (e.g. .b.c matches a.b.c). - Patch by Milan Oberkirch. - -- Issue #28961: Fix unittest.mock._Call helper: don't ignore the name parameter - anymore. Patch written by Jiajun Huang. - -- Issue #15812: inspect.getframeinfo() now correctly shows the first line of - a context. Patch by Sam Breese. - -- Issue #28985: Update authorizer constants in sqlite3 module. - Patch by Dingyuan Wang. - -- Issue #29094: Offsets in a ZIP file created with extern file object and modes - "w" and "x" now are relative to the start of the file. - -- Issue #29079: Prevent infinite loop in pathlib.resolve() on Windows - -- Issue #13051: Fixed recursion errors in large or resized - curses.textpad.Textbox. Based on patch by Tycho Andersen. - -- Issue #9770: curses.ascii predicates now work correctly with negative - integers. - -- Issue #28427: old keys should not remove new values from - WeakValueDictionary when collecting from another thread. - -- Issue 28923: Remove editor artifacts from Tix.py. - -- Issue #28871: Fixed a crash when deallocate deep ElementTree. - -- Issue #19542: Fix bugs in WeakValueDictionary.setdefault() and - WeakValueDictionary.pop() when a GC collection happens in another - thread. - -- Issue #20191: Fixed a crash in resource.prlimit() when passing a sequence that - doesn't own its elements as limits. - -- Issue #16255: subprocess.Popen uses /system/bin/sh on Android as the shell, - instead of /bin/sh. - -- Issue #28779: multiprocessing.set_forkserver_preload() would crash the - forkserver process if a preloaded module instantiated some - multiprocessing objects such as locks. - -- Issue #26937: The chown() method of the tarfile.TarFile class does not fail - now when the grp module cannot be imported, as for example on Android - platforms. - -- Issue #28847: dbm.dumb now supports reading read-only files and no longer - writes the index file when it is not changed. A deprecation warning is now - emitted if the index file is missed and recreated in the 'r' and 'w' modes - (will be an error in future Python releases). - -- Issue #27030: Unknown escapes consisting of ``'\'`` and an ASCII letter in - re.sub() replacement templates regular expressions now are errors. - -- Issue #28835: Fix a regression introduced in warnings.catch_warnings(): - call warnings.showwarning() if it was overriden inside the context manager. - -- Issue #27172: To assist with upgrades from 2.7, the previously documented - deprecation of ``inspect.getfullargspec()`` has been reversed. This decision - may be revisited again after the Python 2.7 branch is no longer officially - supported. - -- Issue #28740: Add sys.getandroidapilevel(): return the build time API version - of Android as an integer. Function only available on Android. - -- Issue #26273: Add new :data:`socket.TCP_CONGESTION` (Linux 2.6.13) and - :data:`socket.TCP_USER_TIMEOUT` (Linux 2.6.37) constants. Patch written by - Omar Sandoval. - -- Issue #28752: Restored the __reduce__() methods of datetime objects. - -- Issue #28727: Regular expression patterns, _sre.SRE_Pattern objects created - by re.compile(), become comparable (only x==y and x!=y operators). This - change should fix the issue #18383: don't duplicate warning filters when the - warnings module is reloaded (thing usually only done in unit tests). - -- Issue #20572: Remove the subprocess.Popen.wait endtime parameter. It was - deprecated in 3.4 and undocumented prior to that. - -- Issue #25659: In ctypes, prevent a crash calling the from_buffer() and - from_buffer_copy() methods on abstract classes like Array. - -- Issue #28548: In the "http.server" module, parse the protocol version if - possible, to avoid using HTTP 0.9 in some error responses. - -- Issue #19717: Makes Path.resolve() succeed on paths that do not exist. - Patch by Vajrasky Kok - -- Issue #28563: Fixed possible DoS and arbitrary code execution when handle - plural form selections in the gettext module. The expression parser now - supports exact syntax supported by GNU gettext. - -- Issue #28387: Fixed possible crash in _io.TextIOWrapper deallocator when - the garbage collector is invoked in other thread. Based on patch by - Sebastian Cufre. - -- Issue #27517: LZMA compressor and decompressor no longer raise exceptions if - given empty data twice. Patch by Benjamin Fogle. - -- Issue #28549: Fixed segfault in curses's addch() with ncurses6. - -- Issue #28449: tarfile.open() with mode "r" or "r:" now tries to open a tar - file with compression before trying to open it without compression. Otherwise - it had 50% chance failed with ignore_zeros=True. - -- Issue #23262: The webbrowser module now supports Firefox 36+ and derived - browsers. Based on patch by Oleg Broytman. - -- Issue #24241: The webbrowser in an X environment now prefers using the - default browser directly. Also, the webbrowser register() function now has - a documented 'preferred' argument, to specify browsers to be returned by - get() with no arguments. Patch by David Steele - -- Issue #27939: Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused - by representing the scale as float value internally in Tk. tkinter.IntVar - now works if float value is set to underlying Tk variable. - -- Issue #28255: calendar.TextCalendar.prweek() no longer prints a space after - a weeks's calendar. calendar.TextCalendar.pryear() no longer prints redundant - newline after a year's calendar. Based on patch by Xiang Zhang. - -- Issue #28255: calendar.TextCalendar.prmonth() no longer prints a space - at the start of new line after printing a month's calendar. Patch by - Xiang Zhang. - -- Issue #20491: The textwrap.TextWrapper class now honors non-breaking spaces. - Based on patch by Kaarle Ritvanen. - -- Issue #28353: os.fwalk() no longer fails on broken links. - -- Issue #28430: Fix iterator of C implemented asyncio.Future doesn't accept - non-None value is passed to it.send(val). - -- Issue #27025: Generated names for Tkinter widgets now start by the "!" prefix - for readability (was "`"). - -- Issue #25464: Fixed HList.header_exists() in tkinter.tix module by addin - a workaround to Tix library bug. - -- Issue #28488: shutil.make_archive() no longer adds entry "./" to ZIP archive. - -- Issue #25953: re.sub() now raises an error for invalid numerical group - reference in replacement template even if the pattern is not found in - the string. Error message for invalid group reference now includes the - group index and the position of the reference. - Based on patch by SilentGhost. - -- Issue #28469: timeit now uses the sequence 1, 2, 5, 10, 20, 50,... instead - of 1, 10, 100,... for autoranging. - -- Issue #28115: Command-line interface of the zipfile module now uses argparse. - Added support of long options. - -- Issue #18219: Optimize csv.DictWriter for large number of columns. - Patch by Mariatta Wijaya. - -- Issue #28448: Fix C implemented asyncio.Future didn't work on Windows. - -- Issue #23214: In the "io" module, the argument to BufferedReader and - BytesIO's read1() methods is now optional and can be -1, matching the - BufferedIOBase specification. - -- Issue #28480: Fix error building socket module when multithreading is - disabled. - -- Issue #28240: timeit: remove ``-c/--clock`` and ``-t/--time`` command line - options which were deprecated since Python 3.3. - -- Issue #28240: timeit now repeats the benchmarks 5 times instead of only 3 - to make benchmarks more reliable. - -- Issue #28240: timeit autorange now uses a single loop iteration if the - benchmark takes less than 10 seconds, instead of 10 iterations. - "python3 -m timeit -s 'import time' 'time.sleep(1)'" now takes 4 seconds - instead of 40 seconds. - -- Distutils.sdist now looks for README and setup.py files with case - sensitivity. This behavior matches that found in Setuptools 6.0 and - later. See `setuptools 100 - `_ for rationale. - -- Issue #24452: Make webbrowser support Chrome on Mac OS X. Patch by - Ned Batchelder. - -- Issue #20766: Fix references leaked by pdb in the handling of SIGINT - handlers. - -- Issue #27998: Fixed bytes path support in os.scandir() on Windows. - Patch by Eryk Sun. - -- Issue #28317: The disassembler now decodes FORMAT_VALUE argument. - -- Issue #26293: Fixed writing ZIP files that starts not from the start of the - file. Offsets in ZIP file now are relative to the start of the archive in - conforming to the specification. - -- Issue #28380: unittest.mock Mock autospec functions now properly support - assert_called, assert_not_called, and assert_called_once. - -- Issue #28229: lzma module now supports pathlib. - -- Issue #28321: Fixed writing non-BMP characters with binary format in plistlib. - -- Issue #28225: bz2 module now supports pathlib. Initial patch by Ethan Furman. - -- Issue #28227: gzip now supports pathlib. Patch by Ethan Furman. - -- Issue #28332: Deprecated silent truncations in socket.htons and socket.ntohs. - Original patch by Oren Milman. - -- Issue #27358: Optimized merging var-keyword arguments and improved error - message when passing a non-mapping as a var-keyword argument. - -- Issue #28257: Improved error message when passing a non-iterable as - a var-positional argument. Added opcode BUILD_TUPLE_UNPACK_WITH_CALL. - -- Issue #28322: Fixed possible crashes when unpickle itertools objects from - incorrect pickle data. Based on patch by John Leitch. - -- Issue #28228: imghdr now supports pathlib. - -- Issue #28226: compileall now supports pathlib. - -- Issue #28314: Fix function declaration (C flags) for the getiterator() method - of xml.etree.ElementTree.Element. - -- Issue #28148: Stop using localtime() and gmtime() in the time - module. - - Introduced platform independent _PyTime_localtime API that is - similar to POSIX localtime_r, but available on all platforms. Patch - by Ed Schouten. - -- Issue #28253: Fixed calendar functions for extreme months: 0001-01 - and 9999-12. - - Methods itermonthdays() and itermonthdays2() are reimplemented so - that they don't call itermonthdates() which can cause datetime.date - under/overflow. - -- Issue #28275: Fixed possible use after free in the decompress() - methods of the LZMADecompressor and BZ2Decompressor classes. - Original patch by John Leitch. - -- Issue #27897: Fixed possible crash in sqlite3.Connection.create_collation() - if pass invalid string-like object as a name. Patch by Xiang Zhang. - -- Issue #18844: random.choices() now has k as a keyword-only argument - to improve the readability of common cases and come into line - with the signature used in other languages. - -- Issue #18893: Fix invalid exception handling in Lib/ctypes/macholib/dyld.py. - Patch by Madison May. - -- Issue #27611: Fixed support of default root window in the tkinter.tix module. - Added the master parameter in the DisplayStyle constructor. - -- Issue #27348: In the traceback module, restore the formatting of exception - messages like "Exception: None". This fixes a regression introduced in - 3.5a2. - -- Issue #25651: Allow falsy values to be used for msg parameter of subTest(). - -- Issue #27778: Fix a memory leak in os.getrandom() when the getrandom() is - interrupted by a signal and a signal handler raises a Python exception. - -- Issue #28200: Fix memory leak on Windows in the os module (fix - path_converter() function). - -- Issue #25400: RobotFileParser now correctly returns default values for - crawl_delay and request_rate. Initial patch by Peter Wirtz. - -- Issue #27932: Prevent memory leak in win32_ver(). - -- Fix UnboundLocalError in socket._sendfile_use_sendfile. - -- Issue #28075: Check for ERROR_ACCESS_DENIED in Windows implementation of - os.stat(). Patch by Eryk Sun. - -- Issue #22493: Warning message emitted by using inline flags in the middle of - regular expression now contains a (truncated) regex pattern. - Patch by Tim Graham. - -- Issue #25270: Prevent codecs.escape_encode() from raising SystemError when - an empty bytestring is passed. - -- Issue #28181: Get antigravity over HTTPS. Patch by Kaartic Sivaraam. - -- Issue #25895: Enable WebSocket URL schemes in urllib.parse.urljoin. - Patch by Gergely Imreh and Markus Holtermann. - -- Issue #28114: Fix a crash in parse_envlist() when env contains byte strings. - Patch by Eryk Sun. - -- Issue #27599: Fixed buffer overrun in binascii.b2a_qp() and binascii.a2b_qp(). - -- Issue #27906: Fix socket accept exhaustion during high TCP traffic. - Patch by Kevin Conway. - -- Issue #28174: Handle when SO_REUSEPORT isn't properly supported. - Patch by Seth Michael Larson. - -- Issue #26654: Inspect functools.partial in asyncio.Handle.__repr__. - Patch by iceboy. - -- Issue #26909: Fix slow pipes IO in asyncio. - Patch by INADA Naoki. - -- Issue #28176: Fix callbacks race in asyncio.SelectorLoop.sock_connect. - -- Issue #27759: Fix selectors incorrectly retain invalid file descriptors. - Patch by Mark Williams. - -- Issue #28325: Remove vestigial MacOS 9 macurl2path module and its tests. - -- Issue #28368: Refuse monitoring processes if the child watcher has - no loop attached. - Patch by Vincent Michel. - -- Issue #28369: Raise RuntimeError when transport's FD is used with - add_reader, add_writer, etc. - -- Issue #28370: Speedup asyncio.StreamReader.readexactly. - Patch by Коренберг Марк. - -- Issue #28371: Deprecate passing asyncio.Handles to run_in_executor. - -- Issue #28372: Fix asyncio to support formatting of non-python coroutines. - -- Issue #28399: Remove UNIX socket from FS before binding. - Patch by Коренберг Марк. - -- Issue #27972: Prohibit Tasks to await on themselves. - -- Issue #24142: Reading a corrupt config file left configparser in an - invalid state. Original patch by Florian Höch. - -Windows -------- - -- bpo-29579: Removes readme.txt from the installer. - -- Issue #25778: winreg does not truncate string correctly (Patch by Eryk Sun) - -- Issue #28896: Deprecate WindowsRegistryFinder and disable it by default - -- Issue #28522: Fixes mishandled buffer reallocation in getpathp.c - -- Issue #28402: Adds signed catalog files for stdlib on Windows. - -- Issue #28333: Enables Unicode for ps1/ps2 and input() prompts. (Patch by - Eryk Sun) - -- Issue #28251: Improvements to help manuals on Windows. - -- Issue #28110: launcher.msi has different product codes between 32-bit and - 64-bit - -- Issue #28161: Opening CON for write access fails - -- Issue #28162: WindowsConsoleIO readall() fails if first line starts with - Ctrl+Z - -- Issue #28163: WindowsConsoleIO fileno() passes wrong flags to - _open_osfhandle - -- Issue #28164: _PyIO_get_console_type fails for various paths - -- Issue #28137: Renames Windows path file to ._pth - -- Issue #28138: Windows ._pth file should allow import site - -C API ------ - -- Issue #27867: Function PySlice_GetIndicesEx() is deprecated and replaced with - a macro if Py_LIMITED_API is not set or set to the value between 0x03050400 - and 0x03060000 (not including) or 0x03060100 or higher. Added functions - PySlice_Unpack() and PySlice_AdjustIndices(). - -- Issue #29083: Fixed the declaration of some public API functions. - PyArg_VaParse() and PyArg_VaParseTupleAndKeywords() were not available in - limited API. PyArg_ValidateKeywordArguments(), PyArg_UnpackTuple() and - Py_BuildValue() were not available in limited API of version < 3.3 when - PY_SSIZE_T_CLEAN is defined. - -- Issue #28769: The result of PyUnicode_AsUTF8AndSize() and PyUnicode_AsUTF8() - is now of type ``const char *`` rather of ``char *``. - -- Issue #29058: All stable API extensions added after Python 3.2 are now - available only when Py_LIMITED_API is set to the PY_VERSION_HEX value of - the minimum Python version supporting this API. - -- Issue #28822: The index parameters *start* and *end* of PyUnicode_FindChar() - are now adjusted to behave like ``str[start:end]``. - -- Issue #28808: PyUnicode_CompareWithASCIIString() now never raises exceptions. - -- Issue #28761: The fields name and doc of structures PyMemberDef, PyGetSetDef, - PyStructSequence_Field, PyStructSequence_Desc, and wrapperbase are now of - type ``const char *`` rather of ``char *``. - -- Issue #28748: Private variable _Py_PackageContext is now of type ``const char *`` - rather of ``char *``. - -- Issue #19569: Compiler warnings are now emitted if use most of deprecated - functions. - -- Issue #28426: Deprecated undocumented functions PyUnicode_AsEncodedObject(), - PyUnicode_AsDecodedObject(), PyUnicode_AsDecodedUnicode() and - PyUnicode_AsEncodedUnicode(). - -Documentation -------------- - -- bpo-28929: Link the documentation to its source file on GitHub. - -- bpo-25008: Document smtpd.py as effectively deprecated and add a pointer to - aiosmtpd, a third-party asyncio-based replacement. - -- Issue #26355: Add canonical header link on each page to corresponding major - version of the documentation. Patch by Matthias Bussonnier. - -- Issue #29349: Fix Python 2 syntax in code for building the documentation. - -*Release date: XXXX-XX-XX* - -Core and Builtins ------------------ - -- bpo-28893: Set correct __cause__ for errors about invalid awaitables - returned from __aiter__ and __anext__. - -- bpo-29683: Fixes to memory allocation in _PyCode_SetExtra. Patch by - Brian Coleman. - -- bpo-29684: Fix minor regression of PyEval_CallObjectWithKeywords. - It should raise TypeError when kwargs is not a dict. But it might - cause segv when args=NULL and kwargs is not a dict. - -- Issue #28598: Support __rmod__ for subclasses of str being called before - str.__mod__. Patch by Martijn Pieters. - -- bpo-29607: Fix stack_effect computation for CALL_FUNCTION_EX. - Patch by Matthieu Dartiailh. - -- bpo-29602: Fix incorrect handling of signed zeros in complex constructor for - complex subclasses and for inputs having a __complex__ method. Patch - by Serhiy Storchaka. - -- bpo-29347: Fixed possibly dereferencing undefined pointers - when creating weakref objects. - -- bpo-29438: Fixed use-after-free problem in key sharing dict. - -- Issue #29319: Prevent RunMainFromImporter overwriting sys.path[0]. - -- Issue #29337: Fixed possible BytesWarning when compare the code objects. - Warnings could be emitted at compile time. - -- Issue #29327: Fixed a crash when pass the iterable keyword argument to - sorted(). - -- Issue #29034: Fix memory leak and use-after-free in os module (path_converter). - -- Issue #29159: Fix regression in bytes(x) when x.__index__() raises Exception. - -- Issue #28932: Do not include if it does not exist. - -- Issue #25677: Correct the positioning of the syntax error caret for - indented blocks. Based on patch by Michael Layzell. - -- Issue #29000: Fixed bytes formatting of octals with zero padding in alternate - form. - -- Issue #26919: On Android, operating system data is now always encoded/decoded - to/from UTF-8, instead of the locale encoding to avoid inconsistencies with - os.fsencode() and os.fsdecode() which are already using UTF-8. - -- Issue #28991: functools.lru_cache() was susceptible to an obscure reentrancy - bug triggerable by a monkey-patched len() function. - -- Issue #28739: f-string expressions are no longer accepted as docstrings and - by ast.literal_eval() even if they do not include expressions. - -- Issue #28512: Fixed setting the offset attribute of SyntaxError by - PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject(). - -- Issue #28918: Fix the cross compilation of xxlimited when Python has been - built with Py_DEBUG defined. - -- Issue #28731: Optimize _PyDict_NewPresized() to create correct size dict. - Improve speed of dict literal with constant keys up to 30%. - -Extension Modules ------------------ - -- Issue #29169: Update zlib to 1.2.11. - -Library -------- +- bpo-29704: asyncio.subprocess.SubprocessStreamProtocol no longer closes + before all pipes are closed. - bpo-29271: Fix Task.current_task and Task.all_tasks implemented in C to accept None argument as their pure Python implementation. From c7ff163abf428d73d4054754db3c99d06487e3ad Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Fri, 3 Mar 2017 18:07:18 +0300 Subject: [PATCH 0076/2287] Add Python version since deprecation in base64 methods. (#33) (#429) Allow developers to not have to either test on N Python versions or looked through multiple versions of the docs to know whether they can easily update. (cherry picked from commit c643a967dd7d33ccefa5b61b38caf40b448057ce) --- Doc/library/base64.rst | 17 +++++++++++++---- Lib/base64.py | 6 ++++-- Lib/test/test_base64.py | 8 ++++++++ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/Doc/library/base64.rst b/Doc/library/base64.rst index 080d9d77ec984e..ceecf17cba23e3 100644 --- a/Doc/library/base64.rst +++ b/Doc/library/base64.rst @@ -237,14 +237,18 @@ The legacy interface: .. function:: decodebytes(s) - decodestring(s) Decode the :term:`bytes-like object` *s*, which must contain one or more lines of base64 encoded data, and return the decoded :class:`bytes`. - ``decodestring`` is a deprecated alias. .. versionadded:: 3.1 +.. function:: decodestring(s) + + Deprecated alias of :func:`decodebytes`. + + .. deprecated:: 3.1 + .. function:: encode(input, output) @@ -257,14 +261,19 @@ The legacy interface: .. function:: encodebytes(s) - encodestring(s) Encode the :term:`bytes-like object` *s*, which can contain arbitrary binary data, and return :class:`bytes` containing the base64-encoded data, with newlines (``b'\n'``) inserted after every 76 bytes of output, and ensuring that there is a trailing newline, as per :rfc:`2045` (MIME). - ``encodestring`` is a deprecated alias. + .. versionadded:: 3.1 + +.. function:: encodestring(s) + + Deprecated alias of :func:`encodebytes`. + + .. deprecated:: 3.1 An example usage of the module: diff --git a/Lib/base64.py b/Lib/base64.py index 58f6ad6816ee2f..eb8f258a2d1977 100755 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -541,7 +541,8 @@ def encodebytes(s): def encodestring(s): """Legacy alias of encodebytes().""" import warnings - warnings.warn("encodestring() is a deprecated alias, use encodebytes()", + warnings.warn("encodestring() is a deprecated alias since 3.1, " + "use encodebytes()", DeprecationWarning, 2) return encodebytes(s) @@ -554,7 +555,8 @@ def decodebytes(s): def decodestring(s): """Legacy alias of decodebytes().""" import warnings - warnings.warn("decodestring() is a deprecated alias, use decodebytes()", + warnings.warn("decodestring() is a deprecated alias since Python 3.1, " + "use decodebytes()", DeprecationWarning, 2) return decodebytes(s) diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py index 4f86aaa0c0eb49..47547396b8cb54 100644 --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -18,6 +18,14 @@ def check_type_errors(self, f): int_data = memoryview(b"1234").cast('I') self.assertRaises(TypeError, f, int_data) + def test_encodestring_warns(self): + with self.assertWarns(DeprecationWarning): + base64.encodestring(b"www.python.org") + + def test_decodestring_warns(self): + with self.assertWarns(DeprecationWarning): + base64.decodestring(b"d3d3LnB5dGhvbi5vcmc=\n") + def test_encodebytes(self): eq = self.assertEqual eq(base64.encodebytes(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=\n") From 21ce65aa67f0dc63002ab0a5fb21ef921cf5279e Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Fri, 3 Mar 2017 20:48:37 +0300 Subject: [PATCH 0077/2287] [3.6] bpo-29623: Make PathLike objects work with ConfigParser.read() (#242) (#432) (cherry picked from commit 85b8d01c916b482dac937b93ede1e53b1db0361c) Conflicts: Lib/test/test_configparser.py --- Doc/library/configparser.rst | 20 +++++++++++++------- Lib/configparser.py | 5 ++++- Lib/test/test_configparser.py | 12 +++++++++++- Misc/NEWS | 3 +++ 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/Doc/library/configparser.rst b/Doc/library/configparser.rst index e09562dc9046c7..af57cba2b5661d 100644 --- a/Doc/library/configparser.rst +++ b/Doc/library/configparser.rst @@ -983,13 +983,16 @@ ConfigParser Objects .. method:: read(filenames, encoding=None) Attempt to read and parse a list of filenames, returning a list of - filenames which were successfully parsed. If *filenames* is a string, it - is treated as a single filename. If a file named in *filenames* cannot - be opened, that file will be ignored. This is designed so that you can - specify a list of potential configuration file locations (for example, - the current directory, the user's home directory, and some system-wide - directory), and all existing configuration files in the list will be - read. If none of the named files exist, the :class:`ConfigParser` + filenames which were successfully parsed. + + If *filenames* is a string or :term:`path-like object`, it is treated as + a single filename. If a file named in *filenames* cannot be opened, that + file will be ignored. This is designed so that you can specify a list of + potential configuration file locations (for example, the current + directory, the user's home directory, and some system-wide directory), + and all existing configuration files in the list will be read. + + If none of the named files exist, the :class:`ConfigParser` instance will contain an empty dataset. An application which requires initial values to be loaded from a file should load the required file or files using :meth:`read_file` before calling :meth:`read` for any @@ -1006,6 +1009,9 @@ ConfigParser Objects The *encoding* parameter. Previously, all files were read using the default encoding for :func:`open`. + .. versionadded:: 3.6.1 + The *filenames* parameter accepts a :term:`path-like object`. + .. method:: read_file(f, source=None) diff --git a/Lib/configparser.py b/Lib/configparser.py index af5aca1feae34a..230ab2b017eade 100644 --- a/Lib/configparser.py +++ b/Lib/configparser.py @@ -143,6 +143,7 @@ import functools import io import itertools +import os import re import sys import warnings @@ -687,7 +688,7 @@ def read(self, filenames, encoding=None): Return list of successfully read files. """ - if isinstance(filenames, str): + if isinstance(filenames, (str, os.PathLike)): filenames = [filenames] read_ok = [] for filename in filenames: @@ -696,6 +697,8 @@ def read(self, filenames, encoding=None): self._read(fp, filename) except OSError: continue + if isinstance(filename, os.PathLike): + filename = os.fspath(filename) read_ok.append(filename) return read_ok diff --git a/Lib/test/test_configparser.py b/Lib/test/test_configparser.py index 0d06080da33c52..72c3f19fb41f56 100644 --- a/Lib/test/test_configparser.py +++ b/Lib/test/test_configparser.py @@ -2,7 +2,7 @@ import configparser import io import os -import sys +import pathlib import textwrap import unittest import warnings @@ -721,6 +721,16 @@ def test_read_returns_file_list(self): parsed_files = cf.read(file1) self.assertEqual(parsed_files, [file1]) self.assertEqual(cf.get("Foo Bar", "foo"), "newbar") + # check when we pass only a Path object: + cf = self.newconfig() + parsed_files = cf.read(pathlib.Path(file1)) + self.assertEqual(parsed_files, [file1]) + self.assertEqual(cf.get("Foo Bar", "foo"), "newbar") + # check when we passed both a filename and a Path object: + cf = self.newconfig() + parsed_files = cf.read([pathlib.Path(file1), file1]) + self.assertEqual(parsed_files, [file1, file1]) + self.assertEqual(cf.get("Foo Bar", "foo"), "newbar") # check when we pass only missing files: cf = self.newconfig() parsed_files = cf.read(["nonexistent-file"]) diff --git a/Misc/NEWS b/Misc/NEWS index 2692043b6cbab6..692dc189f4f1fd 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -82,6 +82,9 @@ Extension Modules Library ------- +- bpo-29623: Allow use of path-like object as a single argument in + ConfigParser.read(). Patch by David Ellis. + - bpo-28963: Fix out of bound iteration in asyncio.Future.remove_done_callback implemented in C. From 9d07aceedabcdc9826489f8b9baffff056283bb3 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 3 Mar 2017 12:58:17 -0800 Subject: [PATCH 0078/2287] bpo-29455: Mention coverage.py in trace module documentation (GH-435) (cherry picked from commit 5dfccb06dc513ae67fac5fee66356ad58a4de170) --- Doc/library/trace.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Doc/library/trace.rst b/Doc/library/trace.rst index b0ac81271c5c18..5cb7029adf5e9e 100644 --- a/Doc/library/trace.rst +++ b/Doc/library/trace.rst @@ -13,6 +13,12 @@ annotated statement coverage listings, print caller/callee relationships and list functions executed during a program run. It can be used in another program or from the command line. +.. seealso:: + + `Coverage.py `_ + A popular third-party coverage tool that provides HTML + output along with advanced features such as branch coverage. + .. _trace-cli: Command-Line Usage From 1936ba93c900d47d0c8c915184ac2fa7773c952e Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 3 Mar 2017 13:24:13 -0800 Subject: [PATCH 0079/2287] bpo-29709: Improve Boolean Operations documentation (#433) (#437) (cherry picked from commit 8eb531d9db0861e14222445fcaebe1a373bba170) --- Doc/library/stdtypes.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 9a4f42caa408a5..6729a20a9c2ecc 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -108,11 +108,11 @@ Notes: (1) This is a short-circuit operator, so it only evaluates the second - argument if the first one is :const:`False`. + argument if the first one is false. (2) This is a short-circuit operator, so it only evaluates the second - argument if the first one is :const:`True`. + argument if the first one is true. (3) ``not`` has a lower priority than non-Boolean operators, so ``not a == b`` is From 03f7cb060414b17d88cb406f3e09f26c902d8658 Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Fri, 3 Mar 2017 16:07:25 -0600 Subject: [PATCH 0080/2287] bpo-29572: Update Windows build to OpenSSL 1.0.2k (GH-442) --- Misc/NEWS | 2 ++ PCbuild/get_externals.bat | 2 +- PCbuild/python.props | 2 +- PCbuild/readme.txt | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 692dc189f4f1fd..2bdf5403c3e1be 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -276,6 +276,8 @@ Tests Build ----- +- bpo-29572: Update Windows build and OS X installers to use OpenSSL 1.0.2k. + - Issue #26851: Set Android compilation and link flags. - Issue #28768: Fix implicit declaration of function _setmode. Patch by diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index a5185becee5a96..98a755d870ad90 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -54,7 +54,7 @@ echo.Fetching external libraries... set libraries= set libraries=%libraries% bzip2-1.0.6 if NOT "%IncludeSSL%"=="false" set libraries=%libraries% nasm-2.11.06 -if NOT "%IncludeSSL%"=="false" set libraries=%libraries% openssl-1.0.2j +if NOT "%IncludeSSL%"=="false" set libraries=%libraries% openssl-1.0.2k set libraries=%libraries% sqlite-3.14.2.0 if NOT "%IncludeTkinter%"=="false" set libraries=%libraries% tcl-core-8.6.6.0 if NOT "%IncludeTkinter%"=="false" set libraries=%libraries% tk-8.6.6.0 diff --git a/PCbuild/python.props b/PCbuild/python.props index dde94f733a13ae..d6bfd0877e09df 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -45,7 +45,7 @@ $(ExternalsDir)sqlite-3.14.2.0\ $(ExternalsDir)bzip2-1.0.6\ $(ExternalsDir)xz-5.2.2\ - $(ExternalsDir)openssl-1.0.2j\ + $(ExternalsDir)openssl-1.0.2k\ $(opensslDir)include32 $(opensslDir)include64 $(ExternalsDir)\nasm-2.11.06\ diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index c04ba4e46b9894..8924b3fcfa2e80 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -169,7 +169,7 @@ _lzma Homepage: http://tukaani.org/xz/ _ssl - Python wrapper for version 1.0.2j of the OpenSSL secure sockets + Python wrapper for version 1.0.2k of the OpenSSL secure sockets library, which is built by ssl.vcxproj Homepage: http://www.openssl.org/ From 226af23e858e2914cf78dfa6fd441c7b90a4cc91 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 3 Mar 2017 14:47:06 -0800 Subject: [PATCH 0081/2287] bpo-26213: Document _UNPACK bytecodes and BUILD_MAP changes (GH-440) (cherry picked from commit 0705f66eb369aa6a6cdb699e24ff61e1ab2e0c56) --- Doc/library/dis.rst | 55 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index a15690ba489a66..1c1e1a2aa5d4b3 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -772,8 +772,13 @@ All of the following opcodes use their arguments. .. opcode:: BUILD_MAP (count) - Pushes a new dictionary object onto the stack. The dictionary is pre-sized - to hold *count* entries. + Pushes a new dictionary object onto the stack. Pops ``2 * count`` items + so that the dictionary holds *count* entries: + ``{..., TOS3: TOS2, TOS1: TOS}``. + + .. versionchanged:: 3.5 + The dictionary is created from stack items instead of creating an + empty dictionary pre-sized to hold *count* items. .. opcode:: BUILD_CONST_KEY_MAP (count) @@ -793,6 +798,52 @@ All of the following opcodes use their arguments. .. versionadded:: 3.6 +.. opcode:: BUILD_TUPLE_UNPACK (count) + + Pops *count* iterables from the stack, joins them in a single tuple, + and pushes the result. Implements iterable unpacking in tuple + displays ``(*x, *y, *z)``. + + .. versionadded:: 3.5 + + +.. opcode:: BUILD_LIST_UNPACK (count) + + This is similar to :opcode:`BUILD_TUPLE_UNPACK`, but pushes a list + instead of tuple. Implements iterable unpacking in list + displays ``[*x, *y, *z]``. + + .. versionadded:: 3.5 + + +.. opcode:: BUILD_SET_UNPACK (count) + + This is similar to :opcode:`BUILD_TUPLE_UNPACK`, but pushes a set + instead of tuple. Implements iterable unpacking in set + displays ``{*x, *y, *z}``. + + .. versionadded:: 3.5 + + +.. opcode:: BUILD_MAP_UNPACK (count) + + Pops *count* mappings from the stack, merges them into a single dictionary, + and pushes the result. Implements dictionary unpacking in dictionary + displays ``{**x, **y, **z}``. + + .. versionadded:: 3.5 + + +.. opcode:: BUILD_MAP_UNPACK_WITH_CALL (oparg) + + This is similar to :opcode:`BUILD_MAP_UNPACK`, + but is used for ``f(**x, **y, **z)`` call syntax. The lowest byte of + *oparg* is the count of mappings, the relative position of the + corresponding callable ``f`` is encoded in the second byte of *oparg*. + + .. versionadded:: 3.5 + + .. opcode:: LOAD_ATTR (namei) Replaces TOS with ``getattr(TOS, co_names[namei])``. From d3e1e9df724d97ab83113c2d5fa15179d1dcd560 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Fri, 3 Mar 2017 21:32:17 -0800 Subject: [PATCH 0082/2287] bpo-27593: Updates Windows build to use information from git (#262) (#450) * bpo-27593: Updates Windows build to use information from git --- PCbuild/build.bat | 8 ++++---- PCbuild/pythoncore.vcxproj | 24 ++++++++++++------------ Tools/msi/buildrelease.bat | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/PCbuild/build.bat b/PCbuild/build.bat index 70ab340905e4c9..f7f2858d7d9d99 100644 --- a/PCbuild/build.bat +++ b/PCbuild/build.bat @@ -105,9 +105,9 @@ if "%platf%"=="x64" ( ) ) -if not exist "%HG%" where hg > "%TEMP%\hg.loc" 2> nul && set /P HG= < "%TEMP%\hg.loc" & del "%TEMP%\hg.loc" -if exist "%HG%" set HGProperty=/p:HG="%HG%" -if not exist "%HG%" echo Cannot find Mercurial on PATH & set HGProperty= +if not exist "%GIT%" where git > "%TEMP%\git.loc" 2> nul && set /P GIT= < "%TEMP%\git.loc" & del "%TEMP%\git.loc" +if exist "%GIT%" set GITProperty=/p:GIT="%GIT%" +if not exist "%GIT%" echo Cannot find Git on PATH & set GITProperty= rem Setup the environment call "%dir%env.bat" %vs_platf% >nul @@ -145,7 +145,7 @@ msbuild "%dir%pcbuild.proj" /t:%target% %parallel% %verbose%^ /p:Configuration=%conf% /p:Platform=%platf%^ /p:IncludeExternals=%IncludeExternals%^ /p:IncludeSSL=%IncludeSSL% /p:IncludeTkinter=%IncludeTkinter%^ - /p:UseTestMarker=%UseTestMarker% %HGProperty%^ + /p:UseTestMarker=%UseTestMarker% %GITProperty%^ %1 %2 %3 %4 %5 %6 %7 %8 %9 @echo off diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 6b23d8ecacce3b..8f8bede8a8818e 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -407,24 +407,24 @@ - hg - <_HG>$(HG) - <_HG Condition="$(HG.Contains(` `))">"$(HG)" + git + <_GIT>$(GIT) + <_GIT Condition="$(GIT.Contains(` `))">"$(GIT)" - + - - - + + + - $([System.IO.File]::ReadAllText('$(IntDir)hgbranch.txt').Trim()) - $([System.IO.File]::ReadAllText('$(IntDir)hgversion.txt').Trim()) - $([System.IO.File]::ReadAllText('$(IntDir)hgtag.txt').Trim()) + $([System.IO.File]::ReadAllText('$(IntDir)gitbranch.txt').Trim()) + $([System.IO.File]::ReadAllText('$(IntDir)gitversion.txt').Trim()) + $([System.IO.File]::ReadAllText('$(IntDir)gittag.txt').Trim()) - + - HGVERSION="$(HgVersion)";HGTAG="$(HgTag)";HGBRANCH="$(HgBranch)";%(PreprocessorDefinitions) + GITVERSION="$(GitVersion)";GITTAG="$(GitTag)";GITBRANCH="$(GitBranch)";%(PreprocessorDefinitions) diff --git a/Tools/msi/buildrelease.bat b/Tools/msi/buildrelease.bat index 4659a32b838cc1..81a3f86cab36b0 100644 --- a/Tools/msi/buildrelease.bat +++ b/Tools/msi/buildrelease.bat @@ -65,8 +65,8 @@ if "%1" NEQ "" echo Invalid option: "%1" && exit /B 1 if not defined BUILDX86 if not defined BUILDX64 (set BUILDX86=1) && (set BUILDX64=1) -if not exist "%HG%" where hg > "%TEMP%\hg.loc" 2> nul && set /P HG= < "%TEMP%\hg.loc" & del "%TEMP%\hg.loc" -if not exist "%HG%" echo Cannot find Mercurial on PATH && exit /B 1 +if not exist "%GIT%" where git > "%TEMP%\git.loc" 2> nul && set /P GIT= < "%TEMP%\git.loc" & del "%TEMP%\git.loc" +if not exist "%GIT%" echo Cannot find Git on PATH && exit /B 1 call "%D%get_externals.bat" From 793f822068335cff68f25304a915c726f3f3a599 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Fri, 3 Mar 2017 21:57:47 -0800 Subject: [PATCH 0083/2287] Fixes git command (#451) (#452) --- PCbuild/pythoncore.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 8f8bede8a8818e..d7e9473638cbb2 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -415,7 +415,7 @@ - + $([System.IO.File]::ReadAllText('$(IntDir)gitbranch.txt').Trim()) $([System.IO.File]::ReadAllText('$(IntDir)gitversion.txt').Trim()) From 95c50e5aed9e5683676e18349dd94b11901a66b3 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Sat, 4 Mar 2017 01:05:06 -0500 Subject: [PATCH 0084/2287] [3.6] bpo-27593: Get SCM build info from git instead of hg. (#446) (#454) * bpo-27593: Get SCM build info from git instead of hg. (#446) sys.version and the platform module python_build(), python_branch(), and python_revision() functions now use git information rather than hg when building from a repo. Based on original patches by Brett Cannon and Steve Dower. (cherry picked from commit 5c4b0d063aba0a68c325073f5f312a2c9f40d178) --- Include/pylifecycle.h | 4 ++-- Lib/platform.py | 4 +++- Lib/test/test_platform.py | 12 +++++----- Makefile.pre.in | 12 +++++----- Misc/NEWS | 6 +++++ Modules/getbuildinfo.c | 46 ++++++++++++++++++------------------- Python/sysmodule.c | 6 ++--- configure | 48 +++++++++++++++++++-------------------- configure.ac | 26 ++++++++++----------- 9 files changed, 86 insertions(+), 78 deletions(-) diff --git a/Include/pylifecycle.h b/Include/pylifecycle.h index 5a67666874da94..01abfa9fcd6fb7 100644 --- a/Include/pylifecycle.h +++ b/Include/pylifecycle.h @@ -70,8 +70,8 @@ PyAPI_FUNC(const char *) Py_GetCopyright(void); PyAPI_FUNC(const char *) Py_GetCompiler(void); PyAPI_FUNC(const char *) Py_GetBuildInfo(void); #ifndef Py_LIMITED_API -PyAPI_FUNC(const char *) _Py_hgidentifier(void); -PyAPI_FUNC(const char *) _Py_hgversion(void); +PyAPI_FUNC(const char *) _Py_gitidentifier(void); +PyAPI_FUNC(const char *) _Py_gitversion(void); #endif /* Internal -- various one-time initializations */ diff --git a/Lib/platform.py b/Lib/platform.py index 062347537531ba..cc2db9870d84b6 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -1198,7 +1198,9 @@ def _sys_version(sys_version=None): elif buildtime: builddate = builddate + ' ' + buildtime - if hasattr(sys, '_mercurial'): + if hasattr(sys, '_git'): + _, branch, revision = sys._git + elif hasattr(sys, '_mercurial'): _, branch, revision = sys._mercurial elif hasattr(sys, 'subversion'): # sys.subversion was added in Python 2.5 diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py index 5f875eff6c7ede..ea6752b61d8f77 100644 --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -67,12 +67,12 @@ def test_processor(self): def setUp(self): self.save_version = sys.version - self.save_mercurial = sys._mercurial + self.save_git = sys._git self.save_platform = sys.platform def tearDown(self): sys.version = self.save_version - sys._mercurial = self.save_mercurial + sys._git = self.save_git sys.platform = self.save_platform def test_sys_version(self): @@ -102,7 +102,7 @@ def test_sys_version(self): ('CPython', '2.4.3', '', '', 'truncation', '', 'GCC')), ): # branch and revision are not "parsed", but fetched - # from sys._mercurial. Ignore them + # from sys._git. Ignore them (name, version, branch, revision, buildno, builddate, compiler) \ = platform._sys_version(input) self.assertEqual( @@ -149,10 +149,10 @@ def test_sys_version(self): sys_versions.items(): sys.version = version_tag if subversion is None: - if hasattr(sys, "_mercurial"): - del sys._mercurial + if hasattr(sys, "_git"): + del sys._git else: - sys._mercurial = subversion + sys._git = subversion if sys_platform is not None: sys.platform = sys_platform self.assertEqual(platform.python_implementation(), info[0]) diff --git a/Makefile.pre.in b/Makefile.pre.in index 93aae9124726bd..8f27d7320c1d69 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -41,9 +41,9 @@ RANLIB= @RANLIB@ READELF= @READELF@ SOABI= @SOABI@ LDVERSION= @LDVERSION@ -HGVERSION= @HGVERSION@ -HGTAG= @HGTAG@ -HGBRANCH= @HGBRANCH@ +GITVERSION= @GITVERSION@ +GITTAG= @GITTAG@ +GITBRANCH= @GITBRANCH@ PGO_PROF_GEN_FLAG=@PGO_PROF_GEN_FLAG@ PGO_PROF_USE_FLAG=@PGO_PROF_USE_FLAG@ LLVM_PROF_MERGER=@LLVM_PROF_MERGER@ @@ -740,9 +740,9 @@ Modules/getbuildinfo.o: $(PARSER_OBJS) \ $(MODOBJS) \ $(srcdir)/Modules/getbuildinfo.c $(CC) -c $(PY_CORE_CFLAGS) \ - -DHGVERSION="\"`LC_ALL=C $(HGVERSION)`\"" \ - -DHGTAG="\"`LC_ALL=C $(HGTAG)`\"" \ - -DHGBRANCH="\"`LC_ALL=C $(HGBRANCH)`\"" \ + -DGITVERSION="\"`LC_ALL=C $(GITVERSION)`\"" \ + -DGITTAG="\"`LC_ALL=C $(GITTAG)`\"" \ + -DGITBRANCH="\"`LC_ALL=C $(GITBRANCH)`\"" \ -o $@ $(srcdir)/Modules/getbuildinfo.c Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile diff --git a/Misc/NEWS b/Misc/NEWS index 2bdf5403c3e1be..debadc1e54c141 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -23,6 +23,8 @@ Core and Builtins - Issue #28598: Support __rmod__ for subclasses of str being called before str.__mod__. Patch by Martijn Pieters. +- bpo-29572: Update Windows build and OS X installers to use OpenSSL 1.0.2k. + - bpo-29607: Fix stack_effect computation for CALL_FUNCTION_EX. Patch by Matthieu Dartiailh. @@ -276,6 +278,10 @@ Tests Build ----- +- bpo-27593: sys.version and the platform module python_build(), + python_branch(), and python_revision() functions now use + git information rather than hg when building from a repo. + - bpo-29572: Update Windows build and OS X installers to use OpenSSL 1.0.2k. - Issue #26851: Set Android compilation and link flags. diff --git a/Modules/getbuildinfo.c b/Modules/getbuildinfo.c index 0971a64fccbadc..5f941a26e1d54c 100644 --- a/Modules/getbuildinfo.c +++ b/Modules/getbuildinfo.c @@ -21,47 +21,47 @@ #endif /* XXX Only unix build process has been tested */ -#ifndef HGVERSION -#define HGVERSION "" +#ifndef GITVERSION +#define GITVERSION "" #endif -#ifndef HGTAG -#define HGTAG "" +#ifndef GITTAG +#define GITTAG "" #endif -#ifndef HGBRANCH -#define HGBRANCH "" +#ifndef GITBRANCH +#define GITBRANCH "" #endif const char * Py_GetBuildInfo(void) { - static char buildinfo[50 + sizeof(HGVERSION) + - ((sizeof(HGTAG) > sizeof(HGBRANCH)) ? - sizeof(HGTAG) : sizeof(HGBRANCH))]; - const char *revision = _Py_hgversion(); + static char buildinfo[50 + sizeof(GITVERSION) + + ((sizeof(GITTAG) > sizeof(GITBRANCH)) ? + sizeof(GITTAG) : sizeof(GITBRANCH))]; + const char *revision = _Py_gitversion(); const char *sep = *revision ? ":" : ""; - const char *hgid = _Py_hgidentifier(); - if (!(*hgid)) - hgid = "default"; + const char *gitid = _Py_gitidentifier(); + if (!(*gitid)) + gitid = "default"; PyOS_snprintf(buildinfo, sizeof(buildinfo), - "%s%s%s, %.20s, %.9s", hgid, sep, revision, + "%s%s%s, %.20s, %.9s", gitid, sep, revision, DATE, TIME); return buildinfo; } const char * -_Py_hgversion(void) +_Py_gitversion(void) { - return HGVERSION; + return GITVERSION; } const char * -_Py_hgidentifier(void) +_Py_gitidentifier(void) { - const char *hgtag, *hgid; - hgtag = HGTAG; - if ((*hgtag) && strcmp(hgtag, "tip") != 0) - hgid = hgtag; + const char *gittag, *gitid; + gittag = GITTAG; + if ((*gittag) && strcmp(gittag, "undefined") != 0) + gitid = gittag; else - hgid = HGBRANCH; - return hgid; + gitid = GITBRANCH; + return gitid; } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 52034ff7fb5ddf..99e6b5ea018ea1 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1942,9 +1942,9 @@ _PySys_Init(void) PyUnicode_FromString(Py_GetVersion())); SET_SYS_FROM_STRING("hexversion", PyLong_FromLong(PY_VERSION_HEX)); - SET_SYS_FROM_STRING("_mercurial", - Py_BuildValue("(szz)", "CPython", _Py_hgidentifier(), - _Py_hgversion())); + SET_SYS_FROM_STRING("_git", + Py_BuildValue("(szz)", "CPython", _Py_gitidentifier(), + _Py_gitversion())); SET_SYS_FROM_STRING("dont_write_bytecode", PyBool_FromLong(Py_DontWriteBytecodeFlag)); SET_SYS_FROM_STRING("api_version", diff --git a/configure b/configure index 1500cea4a8292b..d4eccb1d68d856 100755 --- a/configure +++ b/configure @@ -760,10 +760,10 @@ build_os build_vendor build_cpu build -HAS_HG -HGBRANCH -HGTAG -HGVERSION +HAS_GIT +GITBRANCH +GITTAG +GITVERSION BASECPPFLAGS target_alias host_alias @@ -2698,17 +2698,17 @@ fi -if test -e $srcdir/.hg/dirstate +if test -e $srcdir/.git/HEAD then -# Extract the first word of "hg", so it can be a program name with args. -set dummy hg; ac_word=$2 +# Extract the first word of "git", so it can be a program name with args. +set dummy git; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_HAS_HG+:} false; then : +if ${ac_cv_prog_HAS_GIT+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$HAS_HG"; then - ac_cv_prog_HAS_HG="$HAS_HG" # Let the user override the test. + if test -n "$HAS_GIT"; then + ac_cv_prog_HAS_GIT="$HAS_GIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -2717,7 +2717,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_HAS_HG="found" + ac_cv_prog_HAS_GIT="found" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -2725,13 +2725,13 @@ done done IFS=$as_save_IFS - test -z "$ac_cv_prog_HAS_HG" && ac_cv_prog_HAS_HG="not-found" + test -z "$ac_cv_prog_HAS_GIT" && ac_cv_prog_HAS_GIT="not-found" fi fi -HAS_HG=$ac_cv_prog_HAS_HG -if test -n "$HAS_HG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAS_HG" >&5 -$as_echo "$HAS_HG" >&6; } +HAS_GIT=$ac_cv_prog_HAS_GIT +if test -n "$HAS_GIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAS_GIT" >&5 +$as_echo "$HAS_GIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } @@ -2739,17 +2739,17 @@ fi else -HAS_HG=no-repository +HAS_GIT=no-repository fi -if test $HAS_HG = found +if test $HAS_GIT = found then - HGVERSION="hg id -i \$(srcdir)" - HGTAG="hg id -t \$(srcdir)" - HGBRANCH="hg id -b \$(srcdir)" + GITVERSION="git -C \$(srcdir) rev-parse HEAD" + GITTAG="git -C \$(srcdir) name-rev --tags --name-only HEAD" + GITBRANCH="git -C \$(srcdir) name-rev --name-only HEAD" else - HGVERSION="" - HGTAG="" - HGBRANCH="" + GITVERSION="" + GITTAG="" + GITBRANCH="" fi diff --git a/configure.ac b/configure.ac index 64f12f28790a7d..f00a2a6fa498f7 100644 --- a/configure.ac +++ b/configure.ac @@ -25,25 +25,25 @@ else BASECPPFLAGS="" fi -AC_SUBST(HGVERSION) -AC_SUBST(HGTAG) -AC_SUBST(HGBRANCH) +AC_SUBST(GITVERSION) +AC_SUBST(GITTAG) +AC_SUBST(GITBRANCH) -if test -e $srcdir/.hg/dirstate +if test -e $srcdir/.git/HEAD then -AC_CHECK_PROG(HAS_HG, hg, found, not-found) +AC_CHECK_PROG(HAS_GIT, git, found, not-found) else -HAS_HG=no-repository +HAS_GIT=no-repository fi -if test $HAS_HG = found +if test $HAS_GIT = found then - HGVERSION="hg id -i \$(srcdir)" - HGTAG="hg id -t \$(srcdir)" - HGBRANCH="hg id -b \$(srcdir)" + GITVERSION="git -C \$(srcdir) rev-parse HEAD" + GITTAG="git -C \$(srcdir) name-rev --tags --name-only HEAD" + GITBRANCH="git -C \$(srcdir) name-rev --name-only HEAD" else - HGVERSION="" - HGTAG="" - HGBRANCH="" + GITVERSION="" + GITTAG="" + GITBRANCH="" fi AC_CONFIG_SRCDIR([Include/object.h]) From 5ddddb166d9979161624c17cce3bdc11e1d9f3b8 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Sat, 4 Mar 2017 02:55:09 -0500 Subject: [PATCH 0085/2287] bpo-29550: Temporarily skip "make touch" in Mac installer build. (#456) (#458) (cherry picked from commit 7cd9b22e98a5b7a99a7539500ea946a7a58e1c8d) --- Mac/BuildScript/build-installer.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 8dfd092d08b512..5649911c24c505 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -13,7 +13,7 @@ Python 2.6. In addition to what is supplied with OS X 10.5+ and Xcode 3+, the script -requires an installed version of hg and a third-party version of +requires an installed version of git and a third-party version of Tcl/Tk 8.4 (for OS X 10.4 and 10.5 deployment targets) or Tcl/TK 8.5 (for 10.6 or later) installed in /Library/Frameworks. When installed, the Python built by this script will attempt to dynamically link first to @@ -23,7 +23,7 @@ 32-bit-only installer builds are still possible on OS X 10.4 with Xcode 2.5 and the installation of additional components, such as a newer Python -(2.5 is needed for Python parser updates), hg, and for the documentation +(2.5 is needed for Python parser updates), git, and for the documentation build either svn (pre-3.4.1) or sphinx-build (3.4.1 and later). Usage: see USAGE variable in the script. @@ -635,9 +635,9 @@ def checkEnvironment(): base_path = base_path + ':' + OLD_DEVELOPER_TOOLS os.environ['PATH'] = base_path print("Setting default PATH: %s"%(os.environ['PATH'])) - # Ensure ws have access to hg and to sphinx-build. + # Ensure ws have access to git and to sphinx-build. # You may have to create links in /usr/bin for them. - runCommand('hg --version') + runCommand('git --version') runCommand('sphinx-build --version') def parseOptions(args=None): @@ -1142,8 +1142,9 @@ def buildPython(): shellQuote(WORKDIR)[1:-1], shellQuote(WORKDIR)[1:-1])) - print("Running make touch") - runCommand("make touch") + # bpo-29550: avoid using make touch until it is fixed for git + # print("Running make touch") + # runCommand("make touch") print("Running make") runCommand("make") From 343d48379c31f31cb0bcc843c537990c4283703d Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Sat, 4 Mar 2017 03:04:48 -0500 Subject: [PATCH 0086/2287] bpo-29572: Update macOS installer build to OpenSSL 1.0.2k (#457) (#459) (cherry picked from commit cfcd76777e35c83d548d8736f5d7dc92fe56d806) --- Mac/BuildScript/build-installer.py | 6 +++--- Mac/BuildScript/openssl_sdk_makedepend.patch | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 5649911c24c505..f59ae34df2549a 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -213,9 +213,9 @@ def library_recipes(): result.extend([ dict( - name="OpenSSL 1.0.2j", - url="https://www.openssl.org/source/openssl-1.0.2j.tar.gz", - checksum='96322138f0b69e61b7212bc53d5e912b', + name="OpenSSL 1.0.2k", + url="https://www.openssl.org/source/openssl-1.0.2k.tar.gz", + checksum='f965fc0bf01bf882b31314b61391ae65', patches=[ "openssl_sdk_makedepend.patch", ], diff --git a/Mac/BuildScript/openssl_sdk_makedepend.patch b/Mac/BuildScript/openssl_sdk_makedepend.patch index e22d67e4e45143..0caac0a64c1ec6 100644 --- a/Mac/BuildScript/openssl_sdk_makedepend.patch +++ b/Mac/BuildScript/openssl_sdk_makedepend.patch @@ -1,6 +1,6 @@ # HG changeset patch # -# using openssl 1.0.2j +# using openssl 1.0.2k # # - support building with an OS X SDK From 1d391f926b37484b8d4b326003a72c0084db19ec Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Sat, 4 Mar 2017 06:19:05 -0500 Subject: [PATCH 0087/2287] [3.6] bpo-28087: Skip test_asyncore and test_eintr poll failures on macOS (#463) Skip some tests of select.poll when running on macOS due to unresolved issues with the underlying system poll function on some macOS versions. (cherry picked from commit de04644627f82d9dc48b3423def7ff5b4aa1926a) --- Lib/test/eintrdata/eintr_tester.py | 2 ++ Lib/test/test_asyncore.py | 3 +++ Misc/NEWS | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/Lib/test/eintrdata/eintr_tester.py b/Lib/test/eintrdata/eintr_tester.py index d194e775eaeb8f..c619b3d6c38a59 100644 --- a/Lib/test/eintrdata/eintr_tester.py +++ b/Lib/test/eintrdata/eintr_tester.py @@ -437,6 +437,8 @@ def test_select(self): self.stop_alarm() self.assertGreaterEqual(dt, self.sleep_time) + @unittest.skipIf(sys.platform == "darwin", + "poll may fail on macOS; see issue #28087") @unittest.skipUnless(hasattr(select, 'poll'), 'need select.poll') def test_poll(self): poller = select.poll() diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py index 51c65737a441de..d05462b7efce35 100644 --- a/Lib/test/test_asyncore.py +++ b/Lib/test/test_asyncore.py @@ -661,6 +661,9 @@ def test_handle_expt(self): if HAS_UNIX_SOCKETS and self.family == socket.AF_UNIX: self.skipTest("Not applicable to AF_UNIX sockets.") + if sys.platform == "darwin" and self.use_poll: + self.skipTest("poll may fail on macOS; see issue #28087") + class TestClient(BaseClient): def handle_expt(self): self.socket.recv(1024, socket.MSG_OOB) diff --git a/Misc/NEWS b/Misc/NEWS index debadc1e54c141..9aee4974344e10 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -261,6 +261,10 @@ Documentation Tests ----- +- bpo-28087: Skip test_asyncore and test_eintr poll failures on macOS. + Skip some tests of select.poll when running on macOS due to unresolved + issues with the underlying system poll function on some macOS versions. + - Issue #29571: to match the behaviour of the ``re.LOCALE`` flag, test_re.test_locale_flag now uses ``locale.getpreferredencoding(False)`` to determine the candidate encoding for the test regex (allowing it to correctly From 5976b9a88b8510789ed6e1679cc3578f7b345eb1 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Sat, 4 Mar 2017 07:04:41 -0500 Subject: [PATCH 0088/2287] Refresh Python/importlib.h and Python/importlib_external.h (#464) --- Python/importlib.h | 2 +- Python/importlib_external.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Python/importlib.h b/Python/importlib.h index 195fbfd13b6227..4607c40de60e7c 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -392,7 +392,7 @@ const unsigned char _Py_M__importlib[] = { 111,118,101,100,197,0,0,0,115,2,0,0,0,0,8,114, 58,0,0,0,114,33,0,0,0,41,1,218,9,118,101,114, 98,111,115,105,116,121,99,1,0,0,0,1,0,0,0,3, - 0,0,0,5,0,0,0,71,0,0,0,115,54,0,0,0, + 0,0,0,4,0,0,0,71,0,0,0,115,54,0,0,0, 116,0,106,1,106,2,124,1,107,5,114,50,124,0,106,3, 100,6,131,1,115,30,100,3,124,0,23,0,125,0,116,4, 124,0,106,5,124,2,142,0,116,0,106,6,100,4,141,2, diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 2f40978fb78e13..886aa68009ec03 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -578,7 +578,7 @@ const unsigned char _Py_M__importlib_external[] = { 218,17,95,102,105,110,100,95,109,111,100,117,108,101,95,115, 104,105,109,157,1,0,0,115,10,0,0,0,0,10,14,1, 16,1,4,1,22,1,114,127,0,0,0,99,4,0,0,0, - 0,0,0,0,11,0,0,0,22,0,0,0,67,0,0,0, + 0,0,0,0,11,0,0,0,19,0,0,0,67,0,0,0, 115,136,1,0,0,105,0,125,4,124,2,100,1,107,9,114, 22,124,2,124,4,100,2,60,0,110,4,100,3,125,2,124, 3,100,1,107,9,114,42,124,3,124,4,100,4,60,0,124, From cefca3d7b5ee3f8421c082ccf24758fcb641fb6c Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Sat, 4 Mar 2017 12:18:43 -0500 Subject: [PATCH 0089/2287] Update pydoc topics for 3.6.0rc1 --- Lib/pydoc_data/topics.py | 370 ++++++++++++++++++--------------------- 1 file changed, 171 insertions(+), 199 deletions(-) diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index c7fac3395b3be0..2caab630978fa0 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Tue Dec 6 18:51:51 2016 -topics = {'assert': '\n' - 'The "assert" statement\n' +# Autogenerated by Sphinx on Sat Mar 4 12:14:44 2017 +topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' 'Assert statements are a convenient way to insert debugging ' @@ -39,8 +38,7 @@ 'Assignments to "__debug__" are illegal. The value for the ' 'built-in\n' 'variable is determined when the interpreter starts.\n', - 'assignment': '\n' - 'Assignment statements\n' + 'assignment': 'Assignment statements\n' '*********************\n' '\n' 'Assignment statements are used to (re)bind names to values and ' @@ -405,8 +403,7 @@ 'See also: **PEP 526** - Variable and attribute annotation ' 'syntax\n' ' **PEP 484** - Type hints\n', - 'atom-identifiers': '\n' - 'Identifiers (Names)\n' + 'atom-identifiers': 'Identifiers (Names)\n' '*******************\n' '\n' 'An identifier occurring as an atom is a name. See ' @@ -446,8 +443,7 @@ 'happen. If the class name consists only of underscores, ' 'no\n' 'transformation is done.\n', - 'atom-literals': '\n' - 'Literals\n' + 'atom-literals': 'Literals\n' '********\n' '\n' 'Python supports string and bytes literals and various ' @@ -476,8 +472,7 @@ 'may obtain\n' 'the same object or a different object with the same ' 'value.\n', - 'attribute-access': '\n' - 'Customizing attribute access\n' + 'attribute-access': 'Customizing attribute access\n' '****************************\n' '\n' 'The following methods can be defined to customize the ' @@ -851,8 +846,7 @@ '* *__class__* assignment works only if both classes have ' 'the same\n' ' *__slots__*.\n', - 'attribute-references': '\n' - 'Attribute references\n' + 'attribute-references': 'Attribute references\n' '********************\n' '\n' 'An attribute reference is a primary followed by a ' @@ -875,8 +869,7 @@ 'determined by the object. Multiple evaluations of ' 'the same attribute\n' 'reference may yield different objects.\n', - 'augassign': '\n' - 'Augmented assignment statements\n' + 'augassign': 'Augmented assignment statements\n' '*******************************\n' '\n' 'Augmented assignment is the combination, in a single statement, ' @@ -940,8 +933,7 @@ 'about\n' 'class and instance attributes applies as for regular ' 'assignments.\n', - 'binary': '\n' - 'Binary arithmetic operations\n' + 'binary': 'Binary arithmetic operations\n' '****************************\n' '\n' 'The binary arithmetic operations have the conventional priority\n' @@ -1029,8 +1021,7 @@ 'The "-" (subtraction) operator yields the difference of its ' 'arguments.\n' 'The numeric arguments are first converted to a common type.\n', - 'bitwise': '\n' - 'Binary bitwise operations\n' + 'bitwise': 'Binary bitwise operations\n' '*************************\n' '\n' 'Each of the three bitwise operations has a different priority ' @@ -1050,8 +1041,7 @@ 'The "|" operator yields the bitwise (inclusive) OR of its ' 'arguments,\n' 'which must be integers.\n', - 'bltin-code-objects': '\n' - 'Code Objects\n' + 'bltin-code-objects': 'Code Objects\n' '************\n' '\n' 'Code objects are used by the implementation to ' @@ -1074,8 +1064,7 @@ '\n' 'See The standard type hierarchy for more ' 'information.\n', - 'bltin-ellipsis-object': '\n' - 'The Ellipsis Object\n' + 'bltin-ellipsis-object': 'The Ellipsis Object\n' '*******************\n' '\n' 'This object is commonly used by slicing (see ' @@ -1087,8 +1076,7 @@ '"Ellipsis" singleton.\n' '\n' 'It is written as "Ellipsis" or "...".\n', - 'bltin-null-object': '\n' - 'The Null Object\n' + 'bltin-null-object': 'The Null Object\n' '***************\n' '\n' "This object is returned by functions that don't " @@ -1100,8 +1088,7 @@ 'same singleton.\n' '\n' 'It is written as "None".\n', - 'bltin-type-objects': '\n' - 'Type Objects\n' + 'bltin-type-objects': 'Type Objects\n' '************\n' '\n' 'Type objects represent the various object types. An ' @@ -1113,8 +1100,7 @@ 'all standard built-in types.\n' '\n' 'Types are written like this: "".\n', - 'booleans': '\n' - 'Boolean operations\n' + 'booleans': 'Boolean operations\n' '******************\n' '\n' ' or_test ::= and_test | or_test "or" and_test\n' @@ -1163,8 +1149,7 @@ 'its\n' 'argument (for example, "not \'foo\'" produces "False" rather ' 'than "\'\'".)\n', - 'break': '\n' - 'The "break" statement\n' + 'break': 'The "break" statement\n' '*********************\n' '\n' ' break_stmt ::= "break"\n' @@ -1185,8 +1170,7 @@ 'clause, that "finally" clause is executed before really leaving ' 'the\n' 'loop.\n', - 'callable-types': '\n' - 'Emulating callable objects\n' + 'callable-types': 'Emulating callable objects\n' '**************************\n' '\n' 'object.__call__(self[, args...])\n' @@ -1195,8 +1179,7 @@ 'this method\n' ' is defined, "x(arg1, arg2, ...)" is a shorthand for\n' ' "x.__call__(arg1, arg2, ...)".\n', - 'calls': '\n' - 'Calls\n' + 'calls': 'Calls\n' '*****\n' '\n' 'A call calls a callable object (e.g., a *function*) with a ' @@ -1217,7 +1200,8 @@ ' ("," "*" expression | "," ' 'keyword_item)*\n' ' keywords_arguments ::= (keyword_item | "**" expression)\n' - ' ("," keyword_item | "**" expression)*\n' + ' ("," keyword_item | "," "**" ' + 'expression)*\n' ' keyword_item ::= identifier "=" expression\n' '\n' 'An optional trailing comma may be present after the positional and\n' @@ -1382,8 +1366,7 @@ ' The class must define a "__call__()" method; the effect is then ' 'the\n' ' same as if that method was called.\n', - 'class': '\n' - 'Class definitions\n' + 'class': 'Class definitions\n' '*****************\n' '\n' 'A class definition defines a class object (see section The ' @@ -1469,8 +1452,7 @@ '\n' 'See also: **PEP 3115** - Metaclasses in Python 3 **PEP 3129** -\n' ' Class Decorators\n', - 'comparisons': '\n' - 'Comparisons\n' + 'comparisons': 'Comparisons\n' '***********\n' '\n' 'Unlike C, all comparison operations in Python have the same ' @@ -1623,7 +1605,7 @@ 'restriction that\n' ' ranges do not support order comparison. Equality ' 'comparison across\n' - ' these types results in unequality, and ordering comparison ' + ' these types results in inequality, and ordering comparison ' 'across\n' ' these types raises "TypeError".\n' '\n' @@ -1762,6 +1744,12 @@ ' to sequences, but not to sets or mappings). See also the\n' ' "total_ordering()" decorator.\n' '\n' + '* The "hash()" result should be consistent with equality. ' + 'Objects\n' + ' that are equal should either have the same hash value, or ' + 'be marked\n' + ' as unhashable.\n' + '\n' 'Python does not enforce these consistency rules. In fact, ' 'the\n' 'not-a-number values are an example for not following these ' @@ -1833,8 +1821,7 @@ 'is determined using the "id()" function. "x is not y" yields ' 'the\n' 'inverse truth value. [4]\n', - 'compound': '\n' - 'Compound statements\n' + 'compound': 'Compound statements\n' '*******************\n' '\n' 'Compound statements contain (groups of) other statements; they ' @@ -2613,7 +2600,8 @@ 'functions, even if they do not contain "await" or "async" ' 'keywords.\n' '\n' - 'It is a "SyntaxError" to use "yield" expressions in "async def"\n' + 'It is a "SyntaxError" to use "yield from" expressions in "async ' + 'def"\n' 'coroutines.\n' '\n' 'An example of a coroutine function:\n' @@ -2724,8 +2712,7 @@ ' body is transformed into the namespace\'s "__doc__" item ' 'and\n' " therefore the class's *docstring*.\n", - 'context-managers': '\n' - 'With Statement Context Managers\n' + 'context-managers': 'With Statement Context Managers\n' '*******************************\n' '\n' 'A *context manager* is an object that defines the ' @@ -2787,8 +2774,7 @@ ' The specification, background, and examples for the ' 'Python "with"\n' ' statement.\n', - 'continue': '\n' - 'The "continue" statement\n' + 'continue': 'The "continue" statement\n' '************************\n' '\n' ' continue_stmt ::= "continue"\n' @@ -2805,8 +2791,7 @@ '"finally" clause, that "finally" clause is executed before ' 'really\n' 'starting the next loop cycle.\n', - 'conversions': '\n' - 'Arithmetic conversions\n' + 'conversions': 'Arithmetic conversions\n' '**********************\n' '\n' 'When a description of an arithmetic operator below uses the ' @@ -2832,8 +2817,7 @@ "left argument to the '%' operator). Extensions must define " 'their own\n' 'conversion behavior.\n', - 'customization': '\n' - 'Basic customization\n' + 'customization': 'Basic customization\n' '*******************\n' '\n' 'object.__new__(cls[, ...])\n' @@ -3152,15 +3136,18 @@ 'on members\n' ' of hashed collections including "set", "frozenset", and ' '"dict".\n' - ' "__hash__()" should return an integer. The only ' - 'required property\n' + ' "__hash__()" should return an integer. The only required ' + 'property\n' ' is that objects which compare equal have the same hash ' 'value; it is\n' - ' advised to somehow mix together (e.g. using exclusive ' - 'or) the hash\n' - ' values for the components of the object that also play a ' - 'part in\n' - ' comparison of objects.\n' + ' advised to mix together the hash values of the ' + 'components of the\n' + ' object that also play a part in comparison of objects by ' + 'packing\n' + ' them into a tuple and hashing the tuple. Example:\n' + '\n' + ' def __hash__(self):\n' + ' return hash((self.name, self.nick, self.color))\n' '\n' ' Note: "hash()" truncates the value returned from an ' "object's\n" @@ -3272,8 +3259,7 @@ ' neither "__len__()" nor "__bool__()", all its instances ' 'are\n' ' considered true.\n', - 'debugger': '\n' - '"pdb" --- The Python Debugger\n' + 'debugger': '"pdb" --- The Python Debugger\n' '*****************************\n' '\n' '**Source code:** Lib/pdb.py\n' @@ -3938,8 +3924,7 @@ '[1] Whether a frame is considered to originate in a certain ' 'module\n' ' is determined by the "__name__" in the frame globals.\n', - 'del': '\n' - 'The "del" statement\n' + 'del': 'The "del" statement\n' '*******************\n' '\n' ' del_stmt ::= "del" target_list\n' @@ -3968,8 +3953,7 @@ 'Changed in version 3.2: Previously it was illegal to delete a name\n' 'from the local namespace if it occurs as a free variable in a nested\n' 'block.\n', - 'dict': '\n' - 'Dictionary displays\n' + 'dict': 'Dictionary displays\n' '*******************\n' '\n' 'A dictionary display is a possibly empty series of key/datum pairs\n' @@ -4013,8 +3997,7 @@ 'should be *hashable*, which excludes all mutable objects.) Clashes\n' 'between duplicate keys are not detected; the last datum (textually\n' 'rightmost in the display) stored for a given key value prevails.\n', - 'dynamic-features': '\n' - 'Interaction with dynamic features\n' + 'dynamic-features': 'Interaction with dynamic features\n' '*********************************\n' '\n' 'Name resolution of free variables occurs at runtime, not ' @@ -4050,8 +4033,7 @@ 'override the global and local namespace. If only one ' 'namespace is\n' 'specified, it is used for both.\n', - 'else': '\n' - 'The "if" statement\n' + 'else': 'The "if" statement\n' '******************\n' '\n' 'The "if" statement is used for conditional execution:\n' @@ -4068,8 +4050,7 @@ '(and no other part of the "if" statement is executed or evaluated).\n' 'If all expressions are false, the suite of the "else" clause, if\n' 'present, is executed.\n', - 'exceptions': '\n' - 'Exceptions\n' + 'exceptions': 'Exceptions\n' '**********\n' '\n' 'Exceptions are a means of breaking out of the normal flow of ' @@ -4145,8 +4126,7 @@ ' these operations is not available at the time the module ' 'is\n' ' compiled.\n', - 'execmodel': '\n' - 'Execution model\n' + 'execmodel': 'Execution model\n' '***************\n' '\n' '\n' @@ -4477,8 +4457,7 @@ ' these operations is not available at the time the module ' 'is\n' ' compiled.\n', - 'exprlists': '\n' - 'Expression lists\n' + 'exprlists': 'Expression lists\n' '****************\n' '\n' ' expression_list ::= expression ( "," expression )* [","]\n' @@ -4515,8 +4494,7 @@ 'value of that expression. (To create an empty tuple, use an ' 'empty pair\n' 'of parentheses: "()".)\n', - 'floating': '\n' - 'Floating point literals\n' + 'floating': 'Floating point literals\n' '***********************\n' '\n' 'Floating point literals are described by the following lexical\n' @@ -4552,8 +4530,7 @@ 'Changed in version 3.6: Underscores are now allowed for ' 'grouping\n' 'purposes in literals.\n', - 'for': '\n' - 'The "for" statement\n' + 'for': 'The "for" statement\n' '*******************\n' '\n' 'The "for" statement is used to iterate over the elements of a ' @@ -4625,8 +4602,7 @@ '\n' ' for x in a[:]:\n' ' if x < 0: a.remove(x)\n', - 'formatstrings': '\n' - 'Format String Syntax\n' + 'formatstrings': 'Format String Syntax\n' '********************\n' '\n' 'The "str.format()" method and the "Formatter" class share ' @@ -5345,8 +5321,7 @@ ' 9 9 11 1001\n' ' 10 A 12 1010\n' ' 11 B 13 1011\n', - 'function': '\n' - 'Function definitions\n' + 'function': 'Function definitions\n' '********************\n' '\n' 'A function definition defines a user-defined function object ' @@ -5515,8 +5490,7 @@ '\n' ' **PEP 3107** - Function Annotations\n' ' The original specification for function annotations.\n', - 'global': '\n' - 'The "global" statement\n' + 'global': 'The "global" statement\n' '**********************\n' '\n' ' global_stmt ::= "global" identifier ("," identifier)*\n' @@ -5560,8 +5534,7 @@ 'code containing the function call. The same applies to the ' '"eval()"\n' 'and "compile()" functions.\n', - 'id-classes': '\n' - 'Reserved classes of identifiers\n' + 'id-classes': 'Reserved classes of identifiers\n' '*******************************\n' '\n' 'Certain classes of identifiers (besides keywords) have ' @@ -5609,8 +5582,7 @@ ' to help avoid name clashes between "private" attributes of ' 'base and\n' ' derived classes. See section Identifiers (Names).\n', - 'identifiers': '\n' - 'Identifiers and keywords\n' + 'identifiers': 'Identifiers and keywords\n' '************************\n' '\n' 'Identifiers (also referred to as *names*) are described by ' @@ -5758,8 +5730,7 @@ ' to help avoid name clashes between "private" attributes of ' 'base and\n' ' derived classes. See section Identifiers (Names).\n', - 'if': '\n' - 'The "if" statement\n' + 'if': 'The "if" statement\n' '******************\n' '\n' 'The "if" statement is used for conditional execution:\n' @@ -5775,8 +5746,7 @@ '(and no other part of the "if" statement is executed or evaluated).\n' 'If all expressions are false, the suite of the "else" clause, if\n' 'present, is executed.\n', - 'imaginary': '\n' - 'Imaginary literals\n' + 'imaginary': 'Imaginary literals\n' '******************\n' '\n' 'Imaginary literals are described by the following lexical ' @@ -5796,8 +5766,7 @@ '\n' ' 3.14j 10.j 10j .001j 1e100j 3.14e-10j ' '3.14_15_93j\n', - 'import': '\n' - 'The "import" statement\n' + 'import': 'The "import" statement\n' '**********************\n' '\n' ' import_stmt ::= "import" module ["as" name] ( "," module ' @@ -6058,8 +6027,7 @@ '\n' ' **PEP 236** - Back to the __future__\n' ' The original proposal for the __future__ mechanism.\n', - 'in': '\n' - 'Membership test operations\n' + 'in': 'Membership test operations\n' '**************************\n' '\n' 'The operators "in" and "not in" test for membership. "x in s"\n' @@ -6094,8 +6062,7 @@ '\n' 'The operator "not in" is defined to have the inverse true value of\n' '"in".\n', - 'integers': '\n' - 'Integer literals\n' + 'integers': 'Integer literals\n' '****************\n' '\n' 'Integer literals are described by the following lexical ' @@ -6141,8 +6108,7 @@ 'Changed in version 3.6: Underscores are now allowed for ' 'grouping\n' 'purposes in literals.\n', - 'lambda': '\n' - 'Lambdas\n' + 'lambda': 'Lambdas\n' '*******\n' '\n' ' lambda_expr ::= "lambda" [parameter_list]: expression\n' @@ -6165,8 +6131,7 @@ 'Note that functions created with lambda expressions cannot ' 'contain\n' 'statements or annotations.\n', - 'lists': '\n' - 'List displays\n' + 'lists': 'List displays\n' '*************\n' '\n' 'A list display is a possibly empty series of expressions enclosed ' @@ -6183,8 +6148,7 @@ 'from left to right and placed into the list object in that order.\n' 'When a comprehension is supplied, the list is constructed from the\n' 'elements resulting from the comprehension.\n', - 'naming': '\n' - 'Naming and binding\n' + 'naming': 'Naming and binding\n' '******************\n' '\n' '\n' @@ -6397,8 +6361,7 @@ 'override the global and local namespace. If only one namespace ' 'is\n' 'specified, it is used for both.\n', - 'nonlocal': '\n' - 'The "nonlocal" statement\n' + 'nonlocal': 'The "nonlocal" statement\n' '************************\n' '\n' ' nonlocal_stmt ::= "nonlocal" identifier ("," identifier)*\n' @@ -6429,8 +6392,7 @@ '\n' ' **PEP 3104** - Access to Names in Outer Scopes\n' ' The specification for the "nonlocal" statement.\n', - 'numbers': '\n' - 'Numeric literals\n' + 'numbers': 'Numeric literals\n' '****************\n' '\n' 'There are three types of numeric literals: integers, floating ' @@ -6444,8 +6406,7 @@ 'is actually an expression composed of the unary operator \'"-"\' ' 'and the\n' 'literal "1".\n', - 'numeric-types': '\n' - 'Emulating numeric types\n' + 'numeric-types': 'Emulating numeric types\n' '***********************\n' '\n' 'The following methods can be defined to emulate numeric ' @@ -6621,8 +6582,7 @@ ' "__index__()" is defined "__int__()" should also be ' 'defined, and\n' ' both should return the same value.\n', - 'objects': '\n' - 'Objects, values and types\n' + 'objects': 'Objects, values and types\n' '*************************\n' '\n' "*Objects* are Python's abstraction for data. All data in a " @@ -6750,8 +6710,7 @@ 'created empty lists. (Note that "c = d = []" assigns the same ' 'object\n' 'to both "c" and "d".)\n', - 'operator-summary': '\n' - 'Operator precedence\n' + 'operator-summary': 'Operator precedence\n' '*******************\n' '\n' 'The following table summarizes the operator precedence ' @@ -6924,8 +6883,7 @@ 'arithmetic\n' ' or bitwise unary operator on its right, that is, ' '"2**-1" is "0.5".\n', - 'pass': '\n' - 'The "pass" statement\n' + 'pass': 'The "pass" statement\n' '********************\n' '\n' ' pass_stmt ::= "pass"\n' @@ -6938,8 +6896,7 @@ ' def f(arg): pass # a function that does nothing (yet)\n' '\n' ' class C: pass # a class with no methods (yet)\n', - 'power': '\n' - 'The power operator\n' + 'power': 'The power operator\n' '******************\n' '\n' 'The power operator binds more tightly than unary operators on its\n' @@ -6973,8 +6930,7 @@ 'Raising a negative number to a fractional power results in a ' '"complex"\n' 'number. (In earlier versions it raised a "ValueError".)\n', - 'raise': '\n' - 'The "raise" statement\n' + 'raise': 'The "raise" statement\n' '*********************\n' '\n' ' raise_stmt ::= "raise" [expression ["from" expression]]\n' @@ -7059,8 +7015,7 @@ 'Exceptions, and information about handling exceptions is in ' 'section\n' 'The try statement.\n', - 'return': '\n' - 'The "return" statement\n' + 'return': 'The "return" statement\n' '**********************\n' '\n' ' return_stmt ::= "return" [expression_list]\n' @@ -7087,9 +7042,15 @@ 'generator is done and will cause "StopIteration" to be raised. ' 'The\n' 'returned value (if any) is used as an argument to construct\n' - '"StopIteration" and becomes the "StopIteration.value" attribute.\n', - 'sequence-types': '\n' - 'Emulating container types\n' + '"StopIteration" and becomes the "StopIteration.value" attribute.\n' + '\n' + 'In an asynchronous generator function, an empty "return" ' + 'statement\n' + 'indicates that the asynchronous generator is done and will cause\n' + '"StopAsyncIteration" to be raised. A non-empty "return" statement ' + 'is\n' + 'a syntax error in an asynchronous generator function.\n', + 'sequence-types': 'Emulating container types\n' '*************************\n' '\n' 'The following methods can be defined to implement ' @@ -7310,8 +7271,7 @@ ' iteration protocol via "__getitem__()", see this ' 'section in the\n' ' language reference.\n', - 'shifting': '\n' - 'Shifting operations\n' + 'shifting': 'Shifting operations\n' '*******************\n' '\n' 'The shifting operations have lower priority than the arithmetic\n' @@ -7335,8 +7295,7 @@ 'operand is\n' ' larger than "sys.maxsize" an "OverflowError" exception is ' 'raised.\n', - 'slicings': '\n' - 'Slicings\n' + 'slicings': 'Slicings\n' '********\n' '\n' 'A slicing selects a range of items in a sequence object (e.g., ' @@ -7387,8 +7346,7 @@ 'as lower bound, upper bound and stride, respectively, ' 'substituting\n' '"None" for missing expressions.\n', - 'specialattrs': '\n' - 'Special Attributes\n' + 'specialattrs': 'Special Attributes\n' '******************\n' '\n' 'The implementation adds a few special read-only attributes ' @@ -7473,8 +7431,7 @@ '[5] To format only a tuple you should therefore provide a\n' ' singleton tuple whose only element is the tuple to be ' 'formatted.\n', - 'specialnames': '\n' - 'Special method names\n' + 'specialnames': 'Special method names\n' '********************\n' '\n' 'A class can implement certain operations that are invoked by ' @@ -7835,15 +7792,18 @@ 'on members\n' ' of hashed collections including "set", "frozenset", and ' '"dict".\n' - ' "__hash__()" should return an integer. The only required ' + ' "__hash__()" should return an integer. The only required ' 'property\n' ' is that objects which compare equal have the same hash ' 'value; it is\n' - ' advised to somehow mix together (e.g. using exclusive or) ' - 'the hash\n' - ' values for the components of the object that also play a ' - 'part in\n' - ' comparison of objects.\n' + ' advised to mix together the hash values of the components ' + 'of the\n' + ' object that also play a part in comparison of objects by ' + 'packing\n' + ' them into a tuple and hashing the tuple. Example:\n' + '\n' + ' def __hash__(self):\n' + ' return hash((self.name, self.nick, self.color))\n' '\n' ' Note: "hash()" truncates the value returned from an ' "object's\n" @@ -9262,8 +9222,7 @@ 'special method *must* be set on the class object itself in ' 'order to be\n' 'consistently invoked by the interpreter).\n', - 'string-methods': '\n' - 'String Methods\n' + 'string-methods': 'String Methods\n' '**************\n' '\n' 'Strings implement all of the common sequence operations, ' @@ -9500,12 +9459,11 @@ 'characters\n' ' and there is at least one character, false otherwise. ' 'Decimal\n' - ' characters are those from general category "Nd". This ' - 'category\n' - ' includes digit characters, and all characters that can ' - 'be used to\n' - ' form decimal-radix numbers, e.g. U+0660, ARABIC-INDIC ' - 'DIGIT ZERO.\n' + ' characters are those that can be used to form numbers ' + 'in base 10,\n' + ' e.g. U+0660, ARABIC-INDIC DIGIT ZERO. Formally a ' + 'decimal character\n' + ' is a character in the Unicode General Category "Nd".\n' '\n' 'str.isdigit()\n' '\n' @@ -9515,10 +9473,13 @@ 'include decimal\n' ' characters and digits that need special handling, such ' 'as the\n' - ' compatibility superscript digits. Formally, a digit is ' - 'a character\n' - ' that has the property value Numeric_Type=Digit or\n' - ' Numeric_Type=Decimal.\n' + ' compatibility superscript digits. This covers digits ' + 'which cannot\n' + ' be used to form numbers in base 10, like the Kharosthi ' + 'numbers.\n' + ' Formally, a digit is a character that has the property ' + 'value\n' + ' Numeric_Type=Digit or Numeric_Type=Decimal.\n' '\n' 'str.isidentifier()\n' '\n' @@ -10064,8 +10025,7 @@ " '00042'\n" ' >>> "-42".zfill(5)\n' " '-0042'\n", - 'strings': '\n' - 'String and Bytes literals\n' + 'strings': 'String and Bytes literals\n' '*************************\n' '\n' 'String literals are described by the following lexical ' @@ -10299,8 +10259,7 @@ 'followed by a newline is interpreted as those two characters as ' 'part\n' 'of the literal, *not* as a line continuation.\n', - 'subscriptions': '\n' - 'Subscriptions\n' + 'subscriptions': 'Subscriptions\n' '*************\n' '\n' 'A subscription selects an item of a sequence (string, tuple ' @@ -10357,8 +10316,7 @@ "A string's items are characters. A character is not a " 'separate data\n' 'type but a string of exactly one character.\n', - 'truth': '\n' - 'Truth Value Testing\n' + 'truth': 'Truth Value Testing\n' '*******************\n' '\n' 'Any object can be tested for truth value, for use in an "if" or\n' @@ -10390,8 +10348,7 @@ 'otherwise stated. (Important exception: the Boolean operations ' '"or"\n' 'and "and" always return one of their operands.)\n', - 'try': '\n' - 'The "try" statement\n' + 'try': 'The "try" statement\n' '*******************\n' '\n' 'The "try" statement specifies exception handlers and/or cleanup code\n' @@ -10538,8 +10495,7 @@ 'Exceptions, and information on using the "raise" statement to ' 'generate\n' 'exceptions may be found in section The raise statement.\n', - 'types': '\n' - 'The standard type hierarchy\n' + 'types': 'The standard type hierarchy\n' '***************************\n' '\n' 'Below is a list of the types that are built into Python. ' @@ -11097,6 +11053,27 @@ 'statements.\n' ' See also the Coroutine Objects section.\n' '\n' + ' Asynchronous generator functions\n' + ' A function or method which is defined using "async def" and\n' + ' which uses the "yield" statement is called a *asynchronous\n' + ' generator function*. Such a function, when called, returns ' + 'an\n' + ' asynchronous iterator object which can be used in an "async ' + 'for"\n' + ' statement to execute the body of the function.\n' + '\n' + ' Calling the asynchronous iterator\'s "aiterator.__anext__()"\n' + ' method will return an *awaitable* which when awaited will\n' + ' execute until it provides a value using the "yield" ' + 'expression.\n' + ' When the function executes an empty "return" statement or ' + 'falls\n' + ' off the end, a "StopAsyncIteration" exception is raised and ' + 'the\n' + ' asynchronous iterator will have reached the end of the set ' + 'of\n' + ' values to be yielded.\n' + '\n' ' Built-in functions\n' ' A built-in function object is a wrapper around a C function.\n' ' Examples of built-in functions are "len()" and "math.sin()"\n' @@ -11233,14 +11210,14 @@ 'the\n' ' dictionary containing the class\'s namespace; "__bases__" is a ' 'tuple\n' - ' (possibly empty or a singleton) containing the base classes, in ' - 'the\n' - ' order of their occurrence in the base class list; "__doc__" is ' - 'the\n' - ' class\'s documentation string, or "None" if undefined;\n' - ' "__annotations__" (optional) is a dictionary containing ' - '*variable\n' - ' annotations* collected during class body execution.\n' + ' containing the base classes, in the order of their occurrence ' + 'in\n' + ' the base class list; "__doc__" is the class\'s documentation ' + 'string,\n' + ' or "None" if undefined; "__annotations__" (optional) is a\n' + ' dictionary containing *variable annotations* collected during ' + 'class\n' + ' body execution.\n' '\n' 'Class instances\n' ' A class instance is created by calling a class object (see ' @@ -11520,8 +11497,7 @@ ' under "User-defined methods". Class method objects are ' 'created\n' ' by the built-in "classmethod()" constructor.\n', - 'typesfunctions': '\n' - 'Functions\n' + 'typesfunctions': 'Functions\n' '*********\n' '\n' 'Function objects are created by function definitions. The ' @@ -11538,8 +11514,7 @@ 'different object types.\n' '\n' 'See Function definitions for more information.\n', - 'typesmapping': '\n' - 'Mapping Types --- "dict"\n' + 'typesmapping': 'Mapping Types --- "dict"\n' '************************\n' '\n' 'A *mapping* object maps *hashable* values to arbitrary ' @@ -11896,8 +11871,7 @@ " {'bacon'}\n" " >>> keys ^ {'sausage', 'juice'}\n" " {'juice', 'sausage', 'bacon', 'spam'}\n", - 'typesmethods': '\n' - 'Methods\n' + 'typesmethods': 'Methods\n' '*******\n' '\n' 'Methods are functions that are called using the attribute ' @@ -11954,8 +11928,7 @@ " 'my name is method'\n" '\n' 'See The standard type hierarchy for more information.\n', - 'typesmodules': '\n' - 'Modules\n' + 'typesmodules': 'Modules\n' '*******\n' '\n' 'The only special operation on a module is attribute access: ' @@ -11992,8 +11965,7 @@ 'written as\n' '"".\n', - 'typesseq': '\n' - 'Sequence Types --- "list", "tuple", "range"\n' + 'typesseq': 'Sequence Types --- "list", "tuple", "range"\n' '*******************************************\n' '\n' 'There are three basic sequence types: lists, tuples, and range\n' @@ -12141,9 +12113,9 @@ '\n' '3. If *i* or *j* is negative, the index is relative to the end ' 'of\n' - ' the string: "len(s) + i" or "len(s) + j" is substituted. But ' - 'note\n' - ' that "-0" is still "0".\n' + ' sequence *s*: "len(s) + i" or "len(s) + j" is substituted. ' + 'But\n' + ' note that "-0" is still "0".\n' '\n' '4. The slice of *s* from *i* to *j* is defined as the sequence ' 'of\n' @@ -12162,12 +12134,17 @@ ' (j-i)/k". In other words, the indices are "i", "i+k", ' '"i+2*k",\n' ' "i+3*k" and so on, stopping when *j* is reached (but never\n' - ' including *j*). If *i* or *j* is greater than "len(s)", use\n' - ' "len(s)". If *i* or *j* are omitted or "None", they become ' - '"end"\n' - ' values (which end depends on the sign of *k*). Note, *k* ' - 'cannot be\n' - ' zero. If *k* is "None", it is treated like "1".\n' + ' including *j*). When *k* is positive, *i* and *j* are ' + 'reduced to\n' + ' "len(s)" if they are greater. When *k* is negative, *i* and ' + '*j* are\n' + ' reduced to "len(s) - 1" if they are greater. If *i* or *j* ' + 'are\n' + ' omitted or "None", they become "end" values (which end ' + 'depends on\n' + ' the sign of *k*). Note, *k* cannot be zero. If *k* is ' + '"None", it\n' + ' is treated like "1".\n' '\n' '6. Concatenating immutable sequences always results in a new\n' ' object. This means that building up a sequence by repeated\n' @@ -12685,8 +12662,7 @@ ' * The linspace recipe shows how to implement a lazy version ' 'of\n' ' range that suitable for floating point applications.\n', - 'typesseq-mutable': '\n' - 'Mutable Sequence Types\n' + 'typesseq-mutable': 'Mutable Sequence Types\n' '**********************\n' '\n' 'The operations in the following table are defined on ' @@ -12826,8 +12802,7 @@ 'referenced multiple\n' ' times, as explained for "s * n" under Common Sequence ' 'Operations.\n', - 'unary': '\n' - 'Unary arithmetic and bitwise operations\n' + 'unary': 'Unary arithmetic and bitwise operations\n' '***************************************\n' '\n' 'All unary arithmetic and bitwise operations have the same ' @@ -12849,8 +12824,7 @@ 'In all three cases, if the argument does not have the proper type, ' 'a\n' '"TypeError" exception is raised.\n', - 'while': '\n' - 'The "while" statement\n' + 'while': 'The "while" statement\n' '*********************\n' '\n' 'The "while" statement is used for repeated execution as long as an\n' @@ -12874,8 +12848,7 @@ 'executed in the first suite skips the rest of the suite and goes ' 'back\n' 'to testing the expression.\n', - 'with': '\n' - 'The "with" statement\n' + 'with': 'The "with" statement\n' '********************\n' '\n' 'The "with" statement is used to wrap the execution of a block with\n' @@ -12948,8 +12921,7 @@ ' The specification, background, and examples for the Python ' '"with"\n' ' statement.\n', - 'yield': '\n' - 'The "yield" statement\n' + 'yield': 'The "yield" statement\n' '*********************\n' '\n' ' yield_stmt ::= yield_expression\n' From e0fbe5feee4f9c00f09eb9659c2182183036261a Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Sat, 4 Mar 2017 12:25:04 -0500 Subject: [PATCH 0090/2287] Update docs and patchlevel for 3.6.1rc1. --- Include/patchlevel.h | 8 ++++---- Misc/NEWS | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 49930e85565349..b42a0db2f82007 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -18,12 +18,12 @@ /*--start constants--*/ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 6 -#define PY_MICRO_VERSION 0 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL -#define PY_RELEASE_SERIAL 0 +#define PY_MICRO_VERSION 1 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA +#define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.6.0+" +#define PY_VERSION "3.6.1rc1" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Misc/NEWS b/Misc/NEWS index 9aee4974344e10..d715d306a34bc3 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2,10 +2,10 @@ Python News +++++++++++ -What's New in Python 3.6.1 release candidate 1? -=============================================== +What's New in Python 3.6.1 release candidate 1 +============================================== -*Release date: XXXX-XX-XX* +*Release date: 2017-03-04* Core and Builtins ----------------- From 43571dde7b81f8426e01875c611d29274135355a Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 4 Mar 2017 15:40:48 -0800 Subject: [PATCH 0091/2287] Correct spelling "instanciate" (GH-465) (GH-467) (cherry picked from commit 6abaed0ddaa1dd9be727ede09f6cd801c467c2ec) --- Doc/library/asyncio-subprocess.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst index dc93a74c6dee12..16ba9a3cd6c7f2 100644 --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -80,7 +80,7 @@ Run subprocesses asynchronously using the :mod:`subprocess` module. however, where :class:`~subprocess.Popen` takes a single argument which is list of strings, :func:`subprocess_exec` takes multiple string arguments. - The *protocol_factory* must instanciate a subclass of the + The *protocol_factory* must instantiate a subclass of the :class:`asyncio.SubprocessProtocol` class. Other parameters: @@ -123,7 +123,7 @@ Run subprocesses asynchronously using the :mod:`subprocess` module. using the platform's "shell" syntax. This is similar to the standard library :class:`subprocess.Popen` class called with ``shell=True``. - The *protocol_factory* must instanciate a subclass of the + The *protocol_factory* must instantiate a subclass of the :class:`asyncio.SubprocessProtocol` class. See :meth:`~AbstractEventLoop.subprocess_exec` for more details about From 9619ec99470100969a95a86ed8d7a1fab6c27546 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 4 Mar 2017 16:43:57 -0800 Subject: [PATCH 0092/2287] distutils docs: Fix a typo (GH-470) (GH-471) (cherry picked from commit 2a7bddaab7d6e1f7b243cdbb4fa6f6c8e266b18d) --- Doc/distutils/examples.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/distutils/examples.rst b/Doc/distutils/examples.rst index 1f5be9cdb29a97..4e2761d8a7d046 100644 --- a/Doc/distutils/examples.rst +++ b/Doc/distutils/examples.rst @@ -321,7 +321,7 @@ You can read back this static file, by using the >>> metadata.description 'Easily download, build, install, upgrade, and uninstall Python packages' -Notice that the class can also be instanciated with a metadata file path to +Notice that the class can also be instantiated with a metadata file path to loads its values:: >>> pkg_info_path = 'distribute-0.6.8-py2.7.egg-info' From 38136e2a581ada0382d9bd1df5b32678cbd94b9a Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Sun, 5 Mar 2017 05:33:38 -0500 Subject: [PATCH 0093/2287] Bump to v3.6.1rc1+. --- Include/patchlevel.h | 2 +- Misc/NEWS | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index b42a0db2f82007..b13794521f297c 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -23,7 +23,7 @@ #define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.6.1rc1" +#define PY_VERSION "3.6.1rc1+" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Misc/NEWS b/Misc/NEWS index d715d306a34bc3..b342738ac4b475 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2,6 +2,18 @@ Python News +++++++++++ +What's New in Python 3.6.1 final? +================================= + +*Release date: XXXX-XX-XX* + +Core and Builtins +----------------- + +Library +------- + + What's New in Python 3.6.1 release candidate 1 ============================================== From 3405792b024e9c6b70c0d2355c55a23ac84e1e67 Mon Sep 17 00:00:00 2001 From: Petr Motejlek Date: Sun, 5 Mar 2017 17:14:06 +0100 Subject: [PATCH 0094/2287] bpo-29615: backport to 3.6 (#478) --- Lib/test/test_xmlrpc.py | 90 ++++++++++++++++++++++++++++++++++++++++- Lib/xmlrpc/server.py | 43 +++++++++++--------- Misc/NEWS | 4 ++ 3 files changed, 117 insertions(+), 20 deletions(-) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py index df9c79e3df0689..69de08e9c3b252 100644 --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -343,6 +343,94 @@ def run_server(): self.assertEqual(p.method(), 5) self.assertEqual(p.method(), 5) + +class SimpleXMLRPCDispatcherTestCase(unittest.TestCase): + class DispatchExc(Exception): + """Raised inside the dispatched functions when checking for + chained exceptions""" + + def test_call_registered_func(self): + """Calls explicitly registered function""" + # Makes sure any exception raised inside the function has no other + # exception chained to it + + exp_params = 1, 2, 3 + + def dispatched_func(*params): + raise self.DispatchExc(params) + + dispatcher = xmlrpc.server.SimpleXMLRPCDispatcher() + dispatcher.register_function(dispatched_func) + with self.assertRaises(self.DispatchExc) as exc_ctx: + dispatcher._dispatch('dispatched_func', exp_params) + self.assertEqual(exc_ctx.exception.args, (exp_params,)) + self.assertIsNone(exc_ctx.exception.__cause__) + self.assertIsNone(exc_ctx.exception.__context__) + + def test_call_instance_func(self): + """Calls a registered instance attribute as a function""" + # Makes sure any exception raised inside the function has no other + # exception chained to it + + exp_params = 1, 2, 3 + + class DispatchedClass: + def dispatched_func(self, *params): + raise SimpleXMLRPCDispatcherTestCase.DispatchExc(params) + + dispatcher = xmlrpc.server.SimpleXMLRPCDispatcher() + dispatcher.register_instance(DispatchedClass()) + with self.assertRaises(self.DispatchExc) as exc_ctx: + dispatcher._dispatch('dispatched_func', exp_params) + self.assertEqual(exc_ctx.exception.args, (exp_params,)) + self.assertIsNone(exc_ctx.exception.__cause__) + self.assertIsNone(exc_ctx.exception.__context__) + + def test_call_dispatch_func(self): + """Calls the registered instance's `_dispatch` function""" + # Makes sure any exception raised inside the function has no other + # exception chained to it + + exp_method = 'method' + exp_params = 1, 2, 3 + + class TestInstance: + def _dispatch(self, method, params): + raise SimpleXMLRPCDispatcherTestCase.DispatchExc( + method, params) + + dispatcher = xmlrpc.server.SimpleXMLRPCDispatcher() + dispatcher.register_instance(TestInstance()) + with self.assertRaises(self.DispatchExc) as exc_ctx: + dispatcher._dispatch(exp_method, exp_params) + self.assertEqual(exc_ctx.exception.args, (exp_method, exp_params)) + self.assertIsNone(exc_ctx.exception.__cause__) + self.assertIsNone(exc_ctx.exception.__context__) + + def test_registered_func_is_none(self): + """Calls explicitly registered function which is None""" + + dispatcher = xmlrpc.server.SimpleXMLRPCDispatcher() + dispatcher.register_function(None, name='method') + with self.assertRaises(Exception, expected_regex='method'): + dispatcher._dispatch('method', ('param',)) + + def test_instance_has_no_func(self): + """Attempts to call nonexistent function on a registered instance""" + + dispatcher = xmlrpc.server.SimpleXMLRPCDispatcher() + dispatcher.register_instance(object()) + with self.assertRaises(Exception, expected_regex='method'): + dispatcher._dispatch('method', ('param',)) + + def test_cannot_locate_func(self): + """Calls a function that the dispatcher cannot locate""" + + dispatcher = xmlrpc.server.SimpleXMLRPCDispatcher() + with self.assertRaises(Exception, expected_regex='method'): + dispatcher._dispatch('method', ('param',)) + + class HelperTestCase(unittest.TestCase): def test_escape(self): self.assertEqual(xmlrpclib.escape("a&b"), "a&b") @@ -1312,7 +1400,7 @@ def test_main(): KeepaliveServerTestCase1, KeepaliveServerTestCase2, GzipServerTestCase, GzipUtilTestCase, MultiPathServerTestCase, ServerProxyTestCase, FailingServerTestCase, - CGIHandlerTestCase) + CGIHandlerTestCase, SimpleXMLRPCDispatcherTestCase) if __name__ == "__main__": diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py index 849bfddd84816f..6faa2d6f8fa319 100644 --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -386,31 +386,36 @@ def _dispatch(self, method, params): not be called. """ - func = None try: - # check to see if a matching function has been registered + # call the matching registered function func = self.funcs[method] except KeyError: - if self.instance is not None: - # check for a _dispatch method - if hasattr(self.instance, '_dispatch'): - return self.instance._dispatch(method, params) - else: - # call instance method directly - try: - func = resolve_dotted_attribute( - self.instance, - method, - self.allow_dotted_names - ) - except AttributeError: - pass - - if func is not None: - return func(*params) + pass else: + if func is not None: + return func(*params) raise Exception('method "%s" is not supported' % method) + if self.instance is not None: + if hasattr(self.instance, '_dispatch'): + # call the `_dispatch` method on the instance + return self.instance._dispatch(method, params) + + # call the instance's method directly + try: + func = resolve_dotted_attribute( + self.instance, + method, + self.allow_dotted_names + ) + except AttributeError: + pass + else: + if func is not None: + return func(*params) + + raise Exception('method "%s" is not supported' % method) + class SimpleXMLRPCRequestHandler(BaseHTTPRequestHandler): """Simple XML-RPC request handler class. diff --git a/Misc/NEWS b/Misc/NEWS index b342738ac4b475..a12229857945c8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,10 @@ Core and Builtins Library ------- +- bpo-29615: SimpleXMLRPCDispatcher no longer chains KeyError (or any other + exception) to exception(s) raised in the dispatched methods. + Patch by Petr Motejlek. + What's New in Python 3.6.1 release candidate 1 ============================================== From b414e349eb6a6140a81ccec249bae3abe939e836 Mon Sep 17 00:00:00 2001 From: Ivan Levkivskyi Date: Sun, 5 Mar 2017 20:18:43 +0100 Subject: [PATCH 0095/2287] bpo-29638: Fix spurious refleaks after typing is imported (#469) (#483) --- Lib/test/libregrtest/refleak.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Lib/test/libregrtest/refleak.py b/Lib/test/libregrtest/refleak.py index 3b3d2458b1f2e0..e2e58bd872f094 100644 --- a/Lib/test/libregrtest/refleak.py +++ b/Lib/test/libregrtest/refleak.py @@ -143,9 +143,14 @@ def dash_R_cleanup(fs, ps, pic, zdc, abcs): sys._clear_type_cache() # Clear ABC registries, restoring previously saved ABC registries. - for abc in [getattr(collections.abc, a) for a in collections.abc.__all__]: - if not isabstract(abc): - continue + abs_classes = [getattr(collections.abc, a) for a in collections.abc.__all__] + abs_classes = filter(isabstract, abs_classes) + if 'typing' in sys.modules: + t = sys.modules['typing'] + # These classes require special treatment because they do not appear + # in direct subclasses of collections.abc classes + abs_classes = list(abs_classes) + [t.ChainMap, t.Counter, t.DefaultDict] + for abc in abs_classes: for obj in abc.__subclasses__() + [abc]: obj._abc_registry = abcs.get(obj, WeakSet()).copy() obj._abc_cache.clear() From e544b40faa5ab61b6aba691577d90b2b641f664d Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Sun, 5 Mar 2017 19:58:06 -0800 Subject: [PATCH 0096/2287] Fixes the upload script to purge the CDN correctly and display success output. (#466) (#497) --- Tools/msi/uploadrelease.proj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Tools/msi/uploadrelease.proj b/Tools/msi/uploadrelease.proj index 305e84fc2d4b28..75840f2f851ecd 100644 --- a/Tools/msi/uploadrelease.proj +++ b/Tools/msi/uploadrelease.proj @@ -8,6 +8,7 @@ $(TARGET) /srv/www.python.org/ftp/python true + true false false @@ -91,6 +92,7 @@ echo." /> + From 4e1a065c20856a00d0fe88ce022b249170608058 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Mon, 6 Mar 2017 17:24:28 +0900 Subject: [PATCH 0097/2287] bpo-29719: Remove Date and Release field in whatsnew/3.6 (GH-500) (cherry picked from commit 2225ddaa9e64c086b2b6997b0c9ac50921f7aa85) --- Doc/whatsnew/3.6.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index 96fd256b991b76..a696af4a999c84 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -2,8 +2,6 @@ What's New In Python 3.6 **************************** -:Release: |release| -:Date: |today| :Editors: Elvis Pranskevichus , Yury Selivanov .. Rules for maintenance: From df6d7b406f3d1b2e4e2014751bfa25574c4df222 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Mon, 6 Mar 2017 18:17:10 +0800 Subject: [PATCH 0098/2287] [3.6] bpo-29714: Fix a regression that bytes format may fail when containing zero bytes inside. (GH-504) --- Lib/test/test_bytes.py | 10 ++++++++++ Misc/NEWS | 3 +++ Objects/bytesobject.c | 4 ++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index a103a7d39cae24..cd82fa64570cb5 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -507,6 +507,11 @@ def test_mod(self): a = b % (b'seventy-nine', 79) self.assertEqual(a, b'seventy-nine / 100 = 79%') self.assertIs(type(a), self.type2test) + # issue 29714 + b = self.type2test(b'hello,\x00%b!') + b = b % b'world' + self.assertEqual(b, b'hello,\x00world!') + self.assertIs(type(b), self.type2test) def test_imod(self): b = self.type2test(b'hello, %b!') @@ -519,6 +524,11 @@ def test_imod(self): b %= (b'seventy-nine', 79) self.assertEqual(b, b'seventy-nine / 100 = 79%') self.assertIs(type(b), self.type2test) + # issue 29714 + b = self.type2test(b'hello,\x00%b!') + b %= b'world' + self.assertEqual(b, b'hello,\x00world!') + self.assertIs(type(b), self.type2test) def test_rmod(self): with self.assertRaises(TypeError): diff --git a/Misc/NEWS b/Misc/NEWS index a12229857945c8..1fb78365bb89be 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.6.1 final? Core and Builtins ----------------- +- bpo-29714: Fix a regression that bytes format may fail when containing zero + bytes inside. + Library ------- diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 5d484409600852..801711f7e6ccaa 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -619,11 +619,11 @@ _PyBytes_FormatEx(const char *format, Py_ssize_t format_len, Py_ssize_t len; char *pos; - pos = strchr(fmt + 1, '%'); + pos = (char *)memchr(fmt + 1, '%', fmtcnt); if (pos != NULL) len = pos - fmt; else - len = format_len - (fmt - format); + len = fmtcnt + 1; assert(len != 0); memcpy(res, fmt, len); From e9effe6bb6b6dcbc9fb13e47811a251a84a807c5 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Mon, 6 Mar 2017 09:15:41 -0800 Subject: [PATCH 0099/2287] fix minor bug in pymalloc. (GH-335) (GH-476) (cherry picked from commit f669ffff6010a94f2d441200e0fd73e9dea2883e) --- Doc/c-api/memory.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/c-api/memory.rst b/Doc/c-api/memory.rst index 3ff545275fb3b8..873fb2ac1d3cad 100644 --- a/Doc/c-api/memory.rst +++ b/Doc/c-api/memory.rst @@ -391,7 +391,7 @@ with a fixed size of 256 KB. It falls back to :c:func:`PyMem_RawMalloc` and :c:func:`PyMem_RawRealloc` for allocations larger than 512 bytes. *pymalloc* is the default allocator of the :c:data:`PYMEM_DOMAIN_MEM` (ex: -:c:func:`PyObject_Malloc`) and :c:data:`PYMEM_DOMAIN_OBJ` (ex: +:c:func:`PyMem_Malloc`) and :c:data:`PYMEM_DOMAIN_OBJ` (ex: :c:func:`PyObject_Malloc`) domains. The arena allocator uses the following functions: From 130c4ec5fbeb0878b88ec6aa06e47c9672566c17 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Mon, 6 Mar 2017 09:31:16 -0800 Subject: [PATCH 0100/2287] bpo-29557: Remove ambiguous line in binhex docs (GH-90) (GH-475) "appears to not work in all cases" does not inspire confidence in this module. I can find no context for what bug this was referencing so it should be removed. (cherry picked from commit 6de2b7817fa9403e81dc38f13f3690f0bbf3d064) --- Doc/library/binhex.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/Doc/library/binhex.rst b/Doc/library/binhex.rst index 359ab23b2f9787..2966e0dbfbcfe8 100644 --- a/Doc/library/binhex.rst +++ b/Doc/library/binhex.rst @@ -55,5 +55,3 @@ the source for details. If you code or decode textfiles on non-Macintosh platforms they will still use the old Macintosh newline convention (carriage-return as end of line). -As of this writing, :func:`hexbin` appears to not work in all cases. - From 284a2ba140cf11216e9804573d8cea6674ab90d9 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Tue, 7 Mar 2017 11:53:29 +0800 Subject: [PATCH 0101/2287] bpo-28728: clarify possible test failure due to ISP (GH-412) (GH-531) --- Lib/test/test_socket.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 97dc3cd76b24a5..5315d475df2218 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -803,11 +803,6 @@ def testHostnameRes(self): self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names))) def test_host_resolution(self): - for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2', - '1:1:1:1:1:1:1:1:1']: - self.assertRaises(OSError, socket.gethostbyname, addr) - self.assertRaises(OSError, socket.gethostbyaddr, addr) - for addr in [support.HOST, '10.0.0.1', '255.255.255.255']: self.assertEqual(socket.gethostbyname(addr), addr) @@ -816,6 +811,21 @@ def test_host_resolution(self): for host in [support.HOST]: self.assertIn(host, socket.gethostbyaddr(host)[2]) + def test_host_resolution_bad_address(self): + # These are all malformed IP addresses and expected not to resolve to + # any result. But some ISPs, e.g. AWS, may successfully resolve these + # IPs. + explanation = ( + "resolving an invalid IP address did not raise OSError; " + "can be caused by a broken DNS server" + ) + for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2', + '1:1:1:1:1:1:1:1:1']: + with self.assertRaises(OSError): + socket.gethostbyname(addr) + with self.assertRaises(OSError, msg=explanation): + socket.gethostbyaddr(addr) + @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()") @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()") def test_sethostname(self): From 33d70d1721ed8a23d2744f33d5358657adccf4cd Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Tue, 7 Mar 2017 17:18:12 +0900 Subject: [PATCH 0102/2287] PCbuild: Add -q option to svn export (GH-537) Without this option, AppVeyor log is too unreadable. (cherry picked from commit 8886d5f39286dffa7d9337857b151e7fb4af23fd) --- PCbuild/get_externals.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index 98a755d870ad90..3a2656e961ef7f 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -66,7 +66,7 @@ for %%e in (%libraries%) do ( echo.%%e already exists, skipping. ) else ( echo.Fetching %%e... - svn export %SVNROOT%%%e + svn export -q %SVNROOT%%%e ) ) From 23b26c4e206427a9e0a1d39240c17a049cf8c732 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 7 Mar 2017 02:44:11 -0800 Subject: [PATCH 0103/2287] Fixes bpo-29680: Older gdb does not have gdb.error. (GH-363) (GH-534) This change is required to make python-dbg.py compatible with GDB versions before 7.3. (cherry picked from commit 661ca8843fed1183e38db06e52d59ac300bf1c2a) --- Tools/gdb/libpython.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py index cc1afbe16d01d1..d28851f9fd7f27 100755 --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -714,7 +714,7 @@ def _get_entries(self, keys): try: # <= Python 3.5 return keys['dk_entries'], dk_size - except gdb.error: + except RuntimeError: # >= Python 3.6 pass From 78ad039bcf1a8c494cbc8e18380cc30665869c3e Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Wed, 8 Mar 2017 11:43:35 +0800 Subject: [PATCH 0104/2287] bpo-26915: Test identity first in index() and count() of collections.abc.Sequence (GH-553) --- Lib/_collections_abc.py | 5 +++-- Lib/test/test_collections.py | 17 +++++++++++++---- Misc/NEWS | 3 +++ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index b172f3f360e6ef..005d884572465f 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -908,7 +908,8 @@ def index(self, value, start=0, stop=None): i = start while stop is None or i < stop: try: - if self[i] == value: + v = self[i] + if v is value or v == value: return i except IndexError: break @@ -917,7 +918,7 @@ def index(self, value, start=0, stop=None): def count(self, value): 'S.count(value) -> integer -- return number of occurrences of value' - return sum(1 for v in self if v == value) + return sum(1 for v in self if v is value or v == value) Sequence.register(tuple) Sequence.register(str) diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 87454cc6704cb0..47f756213ddf00 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -1310,20 +1310,29 @@ def test_issue26915(self): class CustomEqualObject: def __eq__(self, other): return False - class CustomSequence(list): - def __contains__(self, value): - return Sequence.__contains__(self, value) + class CustomSequence(Sequence): + def __init__(self, seq): + self._seq = seq + def __getitem__(self, index): + return self._seq[index] + def __len__(self): + return len(self._seq) nan = float('nan') obj = CustomEqualObject() + seq = CustomSequence([nan, obj, nan]) containers = [ - CustomSequence([nan, obj]), + seq, ItemsView({1: nan, 2: obj}), ValuesView({1: nan, 2: obj}) ] for container in containers: for elem in container: self.assertIn(elem, container) + self.assertEqual(seq.index(nan), 0) + self.assertEqual(seq.index(obj), 1) + self.assertEqual(seq.count(nan), 2) + self.assertEqual(seq.count(obj), 1) def assertSameSet(self, s1, s2): # coerce both to a real set then check equality diff --git a/Misc/NEWS b/Misc/NEWS index 1fb78365bb89be..7a03a2d65e35bc 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -16,6 +16,9 @@ Core and Builtins Library ------- +- bpo-26915: index() and count() methods of collections.abc.Sequence now + check identity before checking equality when do comparisons. + - bpo-29615: SimpleXMLRPCDispatcher no longer chains KeyError (or any other exception) to exception(s) raised in the dispatched methods. Patch by Petr Motejlek. From 6a4b04cd337347d074ae0140fb13dca5bd4b11ef Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Tue, 7 Mar 2017 23:56:59 -0800 Subject: [PATCH 0105/2287] Revert "bpo-29571: Use correct locale encoding in test_re (#149)" (#554) (#555) This reverts commit ace5c0fdd9b962e6e886c29dbcea72c53f051dc4. --- Lib/test/test_re.py | 2 +- Misc/NEWS | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index a506b98be4aeb2..b945cf094e99c1 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1402,7 +1402,7 @@ def test_ascii_and_unicode_flag(self): def test_locale_flag(self): import locale - enc = locale.getpreferredencoding(False) + _, enc = locale.getlocale(locale.LC_CTYPE) # Search non-ASCII letter for i in range(128, 256): try: diff --git a/Misc/NEWS b/Misc/NEWS index 7a03a2d65e35bc..bf3876948f0a26 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -134,6 +134,7 @@ Library - bpo-29110: Fix file object leak in aifc.open() when file is given as a filesystem path and is not in valid AIFF format. Patch by Anthony Zhang. +- Issue #24932: Use proper command line parsing in _testembed - Issue #28556: Various updates to typing module: typing.Counter, typing.ChainMap, improved ABC caching, etc. Original PRs by Jelle Zijlstra, Ivan Levkivskyi, From 666165fddf499e80d10a5d9263846ec4534f6a2a Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 8 Mar 2017 12:29:33 +0200 Subject: [PATCH 0106/2287] [3.6] bpo-28230: Document the pathlib support in tarfile and add tests. (#559) --- Doc/library/tarfile.rst | 28 ++++++++++++--- Lib/test/test_tarfile.py | 76 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 4 deletions(-) diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst index d8f809753dfdd7..337c061107299c 100644 --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -146,6 +146,10 @@ Some facts and figures: .. versionchanged:: 3.5 The ``'x'`` (exclusive creation) mode was added. + .. versionchanged:: 3.6 + The *name* parameter accepts a :term:`path-like object`. + + .. class:: TarFile Class for reading and writing tar archives. Do not use this class directly: @@ -266,7 +270,8 @@ be finalized; only the internally used file object will be closed. See the All following arguments are optional and can be accessed as instance attributes as well. - *name* is the pathname of the archive. It can be omitted if *fileobj* is given. + *name* is the pathname of the archive. *name* may be a :term:`path-like object`. + It can be omitted if *fileobj* is given. In this case, the file object's :attr:`name` attribute is used if it exists. *mode* is either ``'r'`` to read from an existing archive, ``'a'`` to append @@ -319,6 +324,10 @@ be finalized; only the internally used file object will be closed. See the .. versionchanged:: 3.5 The ``'x'`` (exclusive creation) mode was added. + .. versionchanged:: 3.6 + The *name* parameter accepts a :term:`path-like object`. + + .. classmethod:: TarFile.open(...) Alternative constructor. The :func:`tarfile.open` function is actually a @@ -390,14 +399,17 @@ be finalized; only the internally used file object will be closed. See the .. versionchanged:: 3.5 Added the *numeric_owner* parameter. + .. versionchanged:: 3.6 + The *path* parameter accepts a :term:`path-like object`. + .. method:: TarFile.extract(member, path="", set_attrs=True, *, numeric_owner=False) Extract a member from the archive to the current working directory, using its full name. Its file information is extracted as accurately as possible. *member* may be a filename or a :class:`TarInfo` object. You can specify a different - directory using *path*. File attributes (owner, mtime, mode) are set unless - *set_attrs* is false. + directory using *path*. *path* may be a :term:`path-like object`. + File attributes (owner, mtime, mode) are set unless *set_attrs* is false. If *numeric_owner* is :const:`True`, the uid and gid numbers from the tarfile are used to set the owner/group for the extracted files. Otherwise, the named @@ -418,6 +430,10 @@ be finalized; only the internally used file object will be closed. See the .. versionchanged:: 3.5 Added the *numeric_owner* parameter. + .. versionchanged:: 3.6 + The *path* parameter accepts a :term:`path-like object`. + + .. method:: TarFile.extractfile(member) Extract a member from the archive as a file object. *member* may be a filename @@ -464,7 +480,8 @@ be finalized; only the internally used file object will be closed. See the Create a :class:`TarInfo` object from the result of :func:`os.stat` or equivalent on an existing file. The file is either named by *name*, or - specified as a :term:`file object` *fileobj* with a file descriptor. If + specified as a :term:`file object` *fileobj* with a file descriptor. + *name* may be a :term:`path-like object`. If given, *arcname* specifies an alternative name for the file in the archive, otherwise, the name is taken from *fileobj*’s :attr:`~io.FileIO.name` attribute, or the *name* argument. The name @@ -478,6 +495,9 @@ be finalized; only the internally used file object will be closed. See the The :attr:`~TarInfo.name` may also be modified, in which case *arcname* could be a dummy string. + .. versionchanged:: 3.6 + The *name* parameter accepts a :term:`path-like object`. + .. method:: TarFile.close() diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 619cbc03b28abc..fc79055421161c 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -4,6 +4,7 @@ from hashlib import md5 from contextlib import contextmanager from random import Random +import pathlib import unittest import unittest.mock @@ -440,6 +441,22 @@ def test_bytes_name_attribute(self): self.assertIsInstance(tar.name, bytes) self.assertEqual(tar.name, os.path.abspath(fobj.name)) + def test_pathlike_name(self): + tarname = pathlib.Path(self.tarname) + with tarfile.open(tarname, mode=self.mode) as tar: + self.assertIsInstance(tar.name, str) + self.assertEqual(tar.name, os.path.abspath(os.fspath(tarname))) + with self.taropen(tarname) as tar: + self.assertIsInstance(tar.name, str) + self.assertEqual(tar.name, os.path.abspath(os.fspath(tarname))) + with tarfile.TarFile.open(tarname, mode=self.mode) as tar: + self.assertIsInstance(tar.name, str) + self.assertEqual(tar.name, os.path.abspath(os.fspath(tarname))) + if self.suffix == '': + with tarfile.TarFile(tarname, mode='r') as tar: + self.assertIsInstance(tar.name, str) + self.assertEqual(tar.name, os.path.abspath(os.fspath(tarname))) + def test_illegal_mode_arg(self): with open(tmpname, 'wb'): pass @@ -582,6 +599,26 @@ def test_extract_directory(self): finally: support.rmtree(DIR) + def test_extractall_pathlike_name(self): + DIR = pathlib.Path(TEMPDIR) / "extractall" + with support.temp_dir(DIR), \ + tarfile.open(tarname, encoding="iso8859-1") as tar: + directories = [t for t in tar if t.isdir()] + tar.extractall(DIR, directories) + for tarinfo in directories: + path = DIR / tarinfo.name + self.assertEqual(os.path.getmtime(path), tarinfo.mtime) + + def test_extract_pathlike_name(self): + dirtype = "ustar/dirtype" + DIR = pathlib.Path(TEMPDIR) / "extractall" + with support.temp_dir(DIR), \ + tarfile.open(tarname, encoding="iso8859-1") as tar: + tarinfo = tar.getmember(dirtype) + tar.extract(tarinfo, path=DIR) + extracted = DIR / dirtype + self.assertEqual(os.path.getmtime(extracted), tarinfo.mtime) + def test_init_close_fobj(self): # Issue #7341: Close the internal file object in the TarFile # constructor in case of an error. For the test we rely on @@ -1092,6 +1129,17 @@ def test_directory_size(self): finally: support.rmdir(path) + def test_gettarinfo_pathlike_name(self): + with tarfile.open(tmpname, self.mode) as tar: + path = pathlib.Path(TEMPDIR) / "file" + with open(path, "wb") as fobj: + fobj.write(b"aaa") + tarinfo = tar.gettarinfo(path) + tarinfo2 = tar.gettarinfo(os.fspath(path)) + self.assertIsInstance(tarinfo.name, str) + self.assertEqual(tarinfo.name, tarinfo2.name) + self.assertEqual(tarinfo.size, 3) + @unittest.skipUnless(hasattr(os, "link"), "Missing hardlink implementation") def test_link_size(self): @@ -1528,6 +1576,34 @@ def test_create_existing_taropen(self): self.assertEqual(len(names), 1) self.assertIn("spameggs42", names[0]) + def test_create_pathlike_name(self): + with tarfile.open(pathlib.Path(tmpname), self.mode) as tobj: + self.assertIsInstance(tobj.name, str) + self.assertEqual(tobj.name, os.path.abspath(tmpname)) + tobj.add(pathlib.Path(self.file_path)) + names = tobj.getnames() + self.assertEqual(len(names), 1) + self.assertIn('spameggs42', names[0]) + + with self.taropen(tmpname) as tobj: + names = tobj.getnames() + self.assertEqual(len(names), 1) + self.assertIn('spameggs42', names[0]) + + def test_create_taropen_pathlike_name(self): + with self.taropen(pathlib.Path(tmpname), "x") as tobj: + self.assertIsInstance(tobj.name, str) + self.assertEqual(tobj.name, os.path.abspath(tmpname)) + tobj.add(pathlib.Path(self.file_path)) + names = tobj.getnames() + self.assertEqual(len(names), 1) + self.assertIn('spameggs42', names[0]) + + with self.taropen(tmpname) as tobj: + names = tobj.getnames() + self.assertEqual(len(names), 1) + self.assertIn('spameggs42', names[0]) + class GzipCreateTest(GzipTest, CreateTest): pass From eb65edd1029876a4a5bb70b009aeb914088ac749 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 8 Mar 2017 15:45:43 +0200 Subject: [PATCH 0107/2287] [3.6] bpo-28231: The zipfile module now accepts path-like objects for external paths. (#561) (cherry picked from commit 8606e9524a7a4065042f7f228dc57eb74f88e4d3) --- Doc/library/zipfile.rst | 24 +++++++- Lib/test/test_zipfile.py | 117 ++++++++++++++++++++++++++++++++++----- Lib/zipfile.py | 20 +++++-- Misc/NEWS | 3 + 4 files changed, 143 insertions(+), 21 deletions(-) diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index 5eb6f103380661..4c91759c67f5d4 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -132,8 +132,9 @@ ZipFile Objects .. class:: ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True) - Open a ZIP file, where *file* can be either a path to a file (a string) or a - file-like object. The *mode* parameter should be ``'r'`` to read an existing + Open a ZIP file, where *file* can be a path to a file (a string), a + file-like object or a :term:`path-like object`. + The *mode* parameter should be ``'r'`` to read an existing file, ``'w'`` to truncate and write a new file, ``'a'`` to append to an existing file, or ``'x'`` to exclusively create and write a new file. If *mode* is ``'x'`` and *file* refers to an existing file, @@ -183,6 +184,9 @@ ZipFile Objects Previously, a plain :exc:`RuntimeError` was raised for unrecognized compression values. + .. versionchanged:: 3.6.2 + The *file* parameter accepts a :term:`path-like object`. + .. method:: ZipFile.close() @@ -284,6 +288,9 @@ ZipFile Objects Calling :meth:`extract` on a closed ZipFile will raise a :exc:`ValueError`. Previously, a :exc:`RuntimeError` was raised. + .. versionchanged:: 3.6.2 + The *path* parameter accepts a :term:`path-like object`. + .. method:: ZipFile.extractall(path=None, members=None, pwd=None) @@ -304,6 +311,9 @@ ZipFile Objects Calling :meth:`extractall` on a closed ZipFile will raise a :exc:`ValueError`. Previously, a :exc:`RuntimeError` was raised. + .. versionchanged:: 3.6.2 + The *path* parameter accepts a :term:`path-like object`. + .. method:: ZipFile.printdir() @@ -403,6 +413,9 @@ ZipFile Objects The following data attributes are also available: +.. attribute:: ZipFile.filename + + Name of the ZIP file. .. attribute:: ZipFile.debug @@ -488,6 +501,9 @@ The :class:`PyZipFile` constructor takes the same parameters as the .. versionadded:: 3.4 The *filterfunc* parameter. + .. versionchanged:: 3.6.2 + The *pathname* parameter accepts a :term:`path-like object`. + .. _zipinfo-objects: @@ -514,6 +530,10 @@ file: .. versionadded:: 3.6 + .. versionchanged:: 3.6.2 + The *filename* parameter accepts a :term:`path-like object`. + + Instances have the following methods and attributes: .. method:: ZipInfo.is_dir() diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 0a43b20e2bcf0d..d39f05fdb7788e 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -2,6 +2,7 @@ import io import os import importlib.util +import pathlib import posixpath import time import struct @@ -13,7 +14,7 @@ from random import randint, random, getrandbits from test.support import script_helper -from test.support import (TESTFN, findfile, unlink, rmtree, temp_dir, +from test.support import (TESTFN, findfile, unlink, rmtree, temp_dir, temp_cwd, requires_zlib, requires_bz2, requires_lzma, captured_stdout, check_warnings) @@ -148,6 +149,12 @@ def test_open(self): for f in get_files(self): self.zip_open_test(f, self.compression) + def test_open_with_pathlike(self): + path = pathlib.Path(TESTFN2) + self.zip_open_test(path, self.compression) + with zipfile.ZipFile(path, "r", self.compression) as zipfp: + self.assertIsInstance(zipfp.filename, str) + def zip_random_open_test(self, f, compression): self.make_test_archive(f, compression) @@ -906,22 +913,56 @@ def test_write_pyfile_bad_syntax(self): finally: rmtree(TESTFN2) + def test_write_pathlike(self): + os.mkdir(TESTFN2) + try: + with open(os.path.join(TESTFN2, "mod1.py"), "w") as fp: + fp.write("print(42)\n") + + with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp: + zipfp.writepy(pathlib.Path(TESTFN2) / "mod1.py") + names = zipfp.namelist() + self.assertCompiledIn('mod1.py', names) + finally: + rmtree(TESTFN2) + class ExtractTests(unittest.TestCase): - def test_extract(self): + + def make_test_file(self): with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp: for fpath, fdata in SMALL_TEST_DATA: zipfp.writestr(fpath, fdata) + def test_extract(self): + with temp_cwd(): + self.make_test_file() + with zipfile.ZipFile(TESTFN2, "r") as zipfp: + for fpath, fdata in SMALL_TEST_DATA: + writtenfile = zipfp.extract(fpath) + + # make sure it was written to the right place + correctfile = os.path.join(os.getcwd(), fpath) + correctfile = os.path.normpath(correctfile) + + self.assertEqual(writtenfile, correctfile) + + # make sure correct data is in correct file + with open(writtenfile, "rb") as f: + self.assertEqual(fdata.encode(), f.read()) + + unlink(writtenfile) + + def _test_extract_with_target(self, target): + self.make_test_file() with zipfile.ZipFile(TESTFN2, "r") as zipfp: for fpath, fdata in SMALL_TEST_DATA: - writtenfile = zipfp.extract(fpath) + writtenfile = zipfp.extract(fpath, target) # make sure it was written to the right place - correctfile = os.path.join(os.getcwd(), fpath) + correctfile = os.path.join(target, fpath) correctfile = os.path.normpath(correctfile) - - self.assertEqual(writtenfile, correctfile) + self.assertTrue(os.path.samefile(writtenfile, correctfile), (writtenfile, target)) # make sure correct data is in correct file with open(writtenfile, "rb") as f: @@ -929,26 +970,50 @@ def test_extract(self): unlink(writtenfile) - # remove the test file subdirectories - rmtree(os.path.join(os.getcwd(), 'ziptest2dir')) + unlink(TESTFN2) + + def test_extract_with_target(self): + with temp_dir() as extdir: + self._test_extract_with_target(extdir) + + def test_extract_with_target_pathlike(self): + with temp_dir() as extdir: + self._test_extract_with_target(pathlib.Path(extdir)) def test_extract_all(self): - with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp: - for fpath, fdata in SMALL_TEST_DATA: - zipfp.writestr(fpath, fdata) + with temp_cwd(): + self.make_test_file() + with zipfile.ZipFile(TESTFN2, "r") as zipfp: + zipfp.extractall() + for fpath, fdata in SMALL_TEST_DATA: + outfile = os.path.join(os.getcwd(), fpath) + + with open(outfile, "rb") as f: + self.assertEqual(fdata.encode(), f.read()) + + unlink(outfile) + def _test_extract_all_with_target(self, target): + self.make_test_file() with zipfile.ZipFile(TESTFN2, "r") as zipfp: - zipfp.extractall() + zipfp.extractall(target) for fpath, fdata in SMALL_TEST_DATA: - outfile = os.path.join(os.getcwd(), fpath) + outfile = os.path.join(target, fpath) with open(outfile, "rb") as f: self.assertEqual(fdata.encode(), f.read()) unlink(outfile) - # remove the test file subdirectories - rmtree(os.path.join(os.getcwd(), 'ziptest2dir')) + unlink(TESTFN2) + + def test_extract_all_with_target(self): + with temp_dir() as extdir: + self._test_extract_all_with_target(extdir) + + def test_extract_all_with_target_pathlike(self): + with temp_dir() as extdir: + self._test_extract_all_with_target(pathlib.Path(extdir)) def check_file(self, filename, content): self.assertTrue(os.path.isfile(filename)) @@ -1188,6 +1253,8 @@ def test_is_zip_erroneous_file(self): with open(TESTFN, "w") as fp: fp.write("this is not a legal zip file\n") self.assertFalse(zipfile.is_zipfile(TESTFN)) + # - passing a path-like object + self.assertFalse(zipfile.is_zipfile(pathlib.Path(TESTFN))) # - passing a file object with open(TESTFN, "rb") as fp: self.assertFalse(zipfile.is_zipfile(fp)) @@ -2033,6 +2100,26 @@ def test_from_file(self): zi = zipfile.ZipInfo.from_file(__file__) self.assertEqual(posixpath.basename(zi.filename), 'test_zipfile.py') self.assertFalse(zi.is_dir()) + self.assertEqual(zi.file_size, os.path.getsize(__file__)) + + def test_from_file_pathlike(self): + zi = zipfile.ZipInfo.from_file(pathlib.Path(__file__)) + self.assertEqual(posixpath.basename(zi.filename), 'test_zipfile.py') + self.assertFalse(zi.is_dir()) + self.assertEqual(zi.file_size, os.path.getsize(__file__)) + + def test_from_file_bytes(self): + zi = zipfile.ZipInfo.from_file(os.fsencode(__file__), 'test') + self.assertEqual(posixpath.basename(zi.filename), 'test') + self.assertFalse(zi.is_dir()) + self.assertEqual(zi.file_size, os.path.getsize(__file__)) + + def test_from_file_fileno(self): + with open(__file__, 'rb') as f: + zi = zipfile.ZipInfo.from_file(f.fileno(), 'test') + self.assertEqual(posixpath.basename(zi.filename), 'test') + self.assertFalse(zi.is_dir()) + self.assertEqual(zi.file_size, os.path.getsize(__file__)) def test_from_dir(self): dirpath = os.path.dirname(os.path.abspath(__file__)) diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 7f2b43ce1cc848..d7f5beba996e6e 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -479,6 +479,8 @@ def from_file(cls, filename, arcname=None): this will be the same as filename, but without a drive letter and with leading path separators removed). """ + if isinstance(filename, os.PathLike): + filename = os.fspath(filename) st = os.stat(filename) isdir = stat.S_ISDIR(st.st_mode) mtime = time.localtime(st.st_mtime) @@ -1070,6 +1072,8 @@ def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=True): self._comment = b'' # Check if we were passed a file-like object + if isinstance(file, os.PathLike): + file = os.fspath(file) if isinstance(file, str): # No, it's a filename self._filePassed = 0 @@ -1470,11 +1474,10 @@ def extract(self, member, path=None, pwd=None): as possible. `member' may be a filename or a ZipInfo object. You can specify a different directory using `path'. """ - if not isinstance(member, ZipInfo): - member = self.getinfo(member) - if path is None: path = os.getcwd() + else: + path = os.fspath(path) return self._extract_member(member, path, pwd) @@ -1487,8 +1490,13 @@ def extractall(self, path=None, members=None, pwd=None): if members is None: members = self.namelist() + if path is None: + path = os.getcwd() + else: + path = os.fspath(path) + for zipinfo in members: - self.extract(zipinfo, path, pwd) + self._extract_member(zipinfo, path, pwd) @classmethod def _sanitize_windows_name(cls, arcname, pathsep): @@ -1509,6 +1517,9 @@ def _extract_member(self, member, targetpath, pwd): """Extract the ZipInfo object 'member' to a physical file on the path targetpath. """ + if not isinstance(member, ZipInfo): + member = self.getinfo(member) + # build the destination pathname, replacing # forward slashes to platform specific separators. arcname = member.filename.replace('/', os.path.sep) @@ -1801,6 +1812,7 @@ def writepy(self, pathname, basename="", filterfunc=None): If filterfunc(pathname) is given, it is called with every argument. When it is False, the file or directory is skipped. """ + pathname = os.fspath(pathname) if filterfunc and not filterfunc(pathname): if self.debug: label = 'path' if os.path.isdir(pathname) else 'file' diff --git a/Misc/NEWS b/Misc/NEWS index bf3876948f0a26..99ce8c73620714 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -16,6 +16,9 @@ Core and Builtins Library ------- +- bpo-28231: The zipfile module now accepts path-like objects for external + paths. + - bpo-26915: index() and count() methods of collections.abc.Sequence now check identity before checking equality when do comparisons. From 7253aded71df8d4bf8684fc78d11c596079211b3 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 8 Mar 2017 08:19:57 -0800 Subject: [PATCH 0108/2287] bpo-29176: Fix name of the _curses.window class (#52) (#532) Set name to "_curses.window" instead of "_curses.curses window" (with a space!?). (cherry picked from commit 61e2bc74dfab1ceee332d3f480dcf86c478c87c5) --- Modules/_cursesmodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 3bf2ca7ce15392..d88d06e78220ec 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -2082,7 +2082,7 @@ static PyGetSetDef PyCursesWindow_getsets[] = { PyTypeObject PyCursesWindow_Type = { PyVarObject_HEAD_INIT(NULL, 0) - "_curses.curses window", /*tp_name*/ + "_curses.window", /*tp_name*/ sizeof(PyCursesWindowObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ From 51b646a55a4a1c4d0df764c4404a062fbcc6b356 Mon Sep 17 00:00:00 2001 From: "n.d. parker" Date: Wed, 8 Mar 2017 23:27:46 +0100 Subject: [PATCH 0109/2287] Fix the only non-C90 comment to be C90 compatible. (#568) --- Include/pyport.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/pyport.h b/Include/pyport.h index 52a91a0d11d056..426822a81f075a 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -37,7 +37,7 @@ Used in: Py_SAFE_DOWNCAST * integral synonyms. Only define the ones we actually need. */ -// long long is required. Ensure HAVE_LONG_LONG is defined for compatibility. +/* long long is required. Ensure HAVE_LONG_LONG is defined for compatibility. */ #ifndef HAVE_LONG_LONG #define HAVE_LONG_LONG 1 #endif From 9cef253ae3251b22d2fbb475fcb7a28805b78c86 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 9 Mar 2017 10:51:44 +0200 Subject: [PATCH 0110/2287] [3.6] bpo-29768: Fixed compile-time check for expat version. (#576) (cherry picked from commit 22e707fa04476710ba5cc7e2206e4ac66743931b) --- Modules/pyexpat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index b3259d57aa114c..47f70a27f15846 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -1191,7 +1191,7 @@ newxmlparseobject(const char *encoding, const char *namespace_separator, PyObjec Py_DECREF(self); return NULL; } -#if ((XML_MAJOR_VERSION >= 2) && (XML_MINOR_VERSION >= 1)) || defined(XML_HAS_SET_HASH_SALT) +#if XML_COMBINED_VERSION >= 20100 || defined(XML_HAS_SET_HASH_SALT) /* This feature was added upstream in libexpat 2.1.0. Our expat copy * has a backport of this feature where we also define XML_HAS_SET_HASH_SALT * to indicate that we can still use it. */ From 26d013e00f9d4adbcf3e084bbc890c799ff70407 Mon Sep 17 00:00:00 2001 From: orenmn Date: Thu, 9 Mar 2017 16:06:47 +0200 Subject: [PATCH 0111/2287] [3.6] bpo-28298: make array 'Q', 'L' and 'I' accept big intables as elements (#579) --- Lib/test/test_array.py | 39 +++++++++------ Misc/NEWS | 3 ++ Modules/arraymodule.c | 108 +++++++++++++++++++++++------------------ 3 files changed, 89 insertions(+), 61 deletions(-) diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index 1f8967ccff3e7c..d67f9195eba04c 100644 --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -14,14 +14,6 @@ import array from array import _array_reconstructor as array_reconstructor -try: - # Try to determine availability of long long independently - # of the array module under test - struct.calcsize('@q') - have_long_long = True -except struct.error: - have_long_long = False - sizeof_wchar = array.array('u').itemsize @@ -32,9 +24,7 @@ class ArraySubclassWithKwargs(array.array): def __init__(self, typecode, newarg=None): array.array.__init__(self) -typecodes = "ubBhHiIlLfd" -if have_long_long: - typecodes += 'qQ' +typecodes = 'ubBhHiIlLfdqQ' class MiscTest(unittest.TestCase): @@ -1240,7 +1230,26 @@ def test_frombytearray(self): b = array.array(self.typecode, a) self.assertEqual(a, b) -class SignedNumberTest(NumberTest): +class IntegerNumberTest(NumberTest): + def test_type_error(self): + a = array.array(self.typecode) + a.append(42) + with self.assertRaises(TypeError): + a.append(42.0) + with self.assertRaises(TypeError): + a[0] = 42.0 + +class Intable: + def __init__(self, num): + self._num = num + def __int__(self): + return self._num + def __sub__(self, other): + return Intable(int(self) - int(other)) + def __add__(self, other): + return Intable(int(self) + int(other)) + +class SignedNumberTest(IntegerNumberTest): example = [-1, 0, 1, 42, 0x7f] smallerexample = [-1, 0, 1, 42, 0x7e] biggerexample = [-1, 0, 1, 43, 0x7f] @@ -1251,8 +1260,9 @@ def test_overflow(self): lower = -1 * int(pow(2, a.itemsize * 8 - 1)) upper = int(pow(2, a.itemsize * 8 - 1)) - 1 self.check_overflow(lower, upper) + self.check_overflow(Intable(lower), Intable(upper)) -class UnsignedNumberTest(NumberTest): +class UnsignedNumberTest(IntegerNumberTest): example = [0, 1, 17, 23, 42, 0xff] smallerexample = [0, 1, 17, 23, 42, 0xfe] biggerexample = [0, 1, 17, 23, 43, 0xff] @@ -1263,6 +1273,7 @@ def test_overflow(self): lower = 0 upper = int(pow(2, a.itemsize * 8)) - 1 self.check_overflow(lower, upper) + self.check_overflow(Intable(lower), Intable(upper)) def test_bytes_extend(self): s = bytes(self.example) @@ -1314,12 +1325,10 @@ class UnsignedLongTest(UnsignedNumberTest, unittest.TestCase): typecode = 'L' minitemsize = 4 -@unittest.skipIf(not have_long_long, 'need long long support') class LongLongTest(SignedNumberTest, unittest.TestCase): typecode = 'q' minitemsize = 8 -@unittest.skipIf(not have_long_long, 'need long long support') class UnsignedLongLongTest(UnsignedNumberTest, unittest.TestCase): typecode = 'Q' minitemsize = 8 diff --git a/Misc/NEWS b/Misc/NEWS index 99ce8c73620714..299a8388ff6e39 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -16,6 +16,9 @@ Core and Builtins Library ------- +- bpo-28298: Fix a bug that prevented array 'Q', 'L' and 'I' from accepting big + intables (objects that have __int__) as elements. Patch by Oren Milman. + - bpo-28231: The zipfile module now accepts path-like objects for external paths. diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index 2caa8ee5a8e892..d4221fe4c6a163 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -331,35 +331,51 @@ II_getitem(arrayobject *ap, Py_ssize_t i) (unsigned long) ((unsigned int *)ap->ob_item)[i]); } +static PyObject * +get_int_unless_float(PyObject *v) +{ + if (PyFloat_Check(v)) { + PyErr_SetString(PyExc_TypeError, + "array item must be integer"); + return NULL; + } + return (PyObject *)_PyLong_FromNbInt(v); +} + static int II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { unsigned long x; - if (PyLong_Check(v)) { - x = PyLong_AsUnsignedLong(v); - if (x == (unsigned long) -1 && PyErr_Occurred()) + int do_decref = 0; /* if nb_int was called */ + + if (!PyLong_Check(v)) { + v = get_int_unless_float(v); + if (NULL == v) { return -1; + } + do_decref = 1; } - else { - long y; - if (!PyArg_Parse(v, "l;array item must be integer", &y)) - return -1; - if (y < 0) { - PyErr_SetString(PyExc_OverflowError, - "unsigned int is less than minimum"); - return -1; + x = PyLong_AsUnsignedLong(v); + if (x == (unsigned long)-1 && PyErr_Occurred()) { + if (do_decref) { + Py_DECREF(v); } - x = (unsigned long)y; - + return -1; } if (x > UINT_MAX) { PyErr_SetString(PyExc_OverflowError, - "unsigned int is greater than maximum"); + "unsigned int is greater than maximum"); + if (do_decref) { + Py_DECREF(v); + } return -1; } - if (i >= 0) ((unsigned int *)ap->ob_item)[i] = (unsigned int)x; + + if (do_decref) { + Py_DECREF(v); + } return 0; } @@ -390,31 +406,28 @@ static int LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { unsigned long x; - if (PyLong_Check(v)) { - x = PyLong_AsUnsignedLong(v); - if (x == (unsigned long) -1 && PyErr_Occurred()) - return -1; - } - else { - long y; - if (!PyArg_Parse(v, "l;array item must be integer", &y)) - return -1; - if (y < 0) { - PyErr_SetString(PyExc_OverflowError, - "unsigned long is less than minimum"); + int do_decref = 0; /* if nb_int was called */ + + if (!PyLong_Check(v)) { + v = get_int_unless_float(v); + if (NULL == v) { return -1; } - x = (unsigned long)y; - + do_decref = 1; } - if (x > ULONG_MAX) { - PyErr_SetString(PyExc_OverflowError, - "unsigned long is greater than maximum"); + x = PyLong_AsUnsignedLong(v); + if (x == (unsigned long)-1 && PyErr_Occurred()) { + if (do_decref) { + Py_DECREF(v); + } return -1; } - if (i >= 0) ((unsigned long *)ap->ob_item)[i] = x; + + if (do_decref) { + Py_DECREF(v); + } return 0; } @@ -446,25 +459,28 @@ static int QQ_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { unsigned long long x; - if (PyLong_Check(v)) { - x = PyLong_AsUnsignedLongLong(v); - if (x == (unsigned long long) -1 && PyErr_Occurred()) + int do_decref = 0; /* if nb_int was called */ + + if (!PyLong_Check(v)) { + v = get_int_unless_float(v); + if (NULL == v) { return -1; + } + do_decref = 1; } - else { - long long y; - if (!PyArg_Parse(v, "L;array item must be integer", &y)) - return -1; - if (y < 0) { - PyErr_SetString(PyExc_OverflowError, - "unsigned long long is less than minimum"); - return -1; + x = PyLong_AsUnsignedLongLong(v); + if (x == (unsigned long long)-1 && PyErr_Occurred()) { + if (do_decref) { + Py_DECREF(v); } - x = (unsigned long long)y; + return -1; } - if (i >= 0) ((unsigned long long *)ap->ob_item)[i] = x; + + if (do_decref) { + Py_DECREF(v); + } return 0; } From 68d29809405dc766966b2b973b8597212fbc3dbd Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 9 Mar 2017 18:43:39 +0100 Subject: [PATCH 0112/2287] bpo-29619: Convert st_ino using unsigned integer (#557) (#584) bpo-29619: os.stat() and os.DirEntry.inodeo() now convert inode (st_ino) using unsigned integers. (cherry picked from commit 0f6d73343d342c106cda2219ebb8a6f0c4bd9b3c) (Misc/NEWS conflict handled manually.) --- Include/fileutils.h | 2 +- Modules/posixmodule.c | 13 ++++++++----- Python/fileutils.c | 4 ++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Include/fileutils.h b/Include/fileutils.h index b933e985392e73..900c70faad719f 100644 --- a/Include/fileutils.h +++ b/Include/fileutils.h @@ -22,7 +22,7 @@ PyAPI_FUNC(PyObject *) _Py_device_encoding(int); #ifdef MS_WINDOWS struct _Py_stat_struct { unsigned long st_dev; - __int64 st_ino; + uint64_t st_ino; unsigned short st_mode; int st_nlink; int st_uid; diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 8f8ba255ec48f6..2ea5e2def9acff 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1932,11 +1932,13 @@ _pystat_fromstructstat(STRUCT_STAT *st) return NULL; PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long)st->st_mode)); -#ifdef HAVE_LARGEFILE_SUPPORT +#if defined(HAVE_LARGEFILE_SUPPORT) || defined(MS_WINDOWS) + Py_BUILD_ASSERT(sizeof(unsigned long long) >= sizeof(st->st_ino)); PyStructSequence_SET_ITEM(v, 1, - PyLong_FromLongLong((long long)st->st_ino)); + PyLong_FromUnsignedLongLong(st->st_ino)); #else - PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long)st->st_ino)); + Py_BUILD_ASSERT(sizeof(unsigned long) >= sizeof(st->st_ino)); + PyStructSequence_SET_ITEM(v, 1, PyLong_FromUnsignedLong(st->st_ino)); #endif #ifdef MS_WINDOWS PyStructSequence_SET_ITEM(v, 2, PyLong_FromUnsignedLong(st->st_dev)); @@ -11156,7 +11158,7 @@ typedef struct { PyObject *lstat; #ifdef MS_WINDOWS struct _Py_stat_struct win32_lstat; - __int64 win32_file_index; + uint64_t win32_file_index; int got_file_index; #else /* POSIX */ #ifdef HAVE_DIRENT_D_TYPE @@ -11419,7 +11421,8 @@ DirEntry_inode(DirEntry *self) self->win32_file_index = stat.st_ino; self->got_file_index = 1; } - return PyLong_FromLongLong((long long)self->win32_file_index); + Py_BUILD_ASSERT(sizeof(unsigned long long) >= sizeof(self->win32_file_index)); + return PyLong_FromUnsignedLongLong(self->win32_file_index); #else /* POSIX */ #ifdef HAVE_LARGEFILE_SUPPORT return PyLong_FromLongLong((long long)self->d_ino); diff --git a/Python/fileutils.c b/Python/fileutils.c index e84d66e99a473d..f3764e4b3c5a2d 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -583,7 +583,7 @@ _Py_attribute_data_to_stat(BY_HANDLE_FILE_INFORMATION *info, ULONG reparse_tag, FILE_TIME_to_time_t_nsec(&info->ftLastWriteTime, &result->st_mtime, &result->st_mtime_nsec); FILE_TIME_to_time_t_nsec(&info->ftLastAccessTime, &result->st_atime, &result->st_atime_nsec); result->st_nlink = info->nNumberOfLinks; - result->st_ino = (((__int64)info->nFileIndexHigh)<<32) + info->nFileIndexLow; + result->st_ino = (((uint64_t)info->nFileIndexHigh) << 32) + info->nFileIndexLow; if (reparse_tag == IO_REPARSE_TAG_SYMLINK) { /* first clear the S_IFMT bits */ result->st_mode ^= (result->st_mode & S_IFMT); @@ -653,7 +653,7 @@ _Py_fstat_noraise(int fd, struct _Py_stat_struct *status) _Py_attribute_data_to_stat(&info, 0, status); /* specific to fstat() */ - status->st_ino = (((__int64)info.nFileIndexHigh)<<32) + info.nFileIndexLow; + status->st_ino = (((uint64_t)info.nFileIndexHigh) << 32) + info.nFileIndexLow; return 0; #else return fstat(fd, status); From 80dfbe30b734f14f76a4e25c7fa8fdb7bdd3936a Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 9 Mar 2017 21:01:49 +0200 Subject: [PATCH 0113/2287] [3.6] bpo-29773: Add more cases for testing string to float conversion errors. (#586) (cherry picked from commit 9e6ac83acae31de2b072e665e177db9fcdf7c049) --- Lib/test/test_float.py | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py index ac8473db503b76..6491f458c3acc4 100644 --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -119,15 +119,27 @@ def test_float_memoryview(self): self.assertEqual(float(memoryview(b'12.34')[1:4]), 2.3) def test_error_message(self): - testlist = ('\xbd', '123\xbd', ' 123 456 ') - for s in testlist: - try: + def check(s): + with self.assertRaises(ValueError, msg='float(%r)' % (s,)) as cm: float(s) - except ValueError as e: - self.assertIn(s.strip(), e.args[0]) - else: - self.fail("Expected int(%r) to raise a ValueError", s) - + self.assertEqual(str(cm.exception), + 'could not convert string to float: %r' % (s,)) + + check('\xbd') + check('123\xbd') + check(' 123 456 ') + check(b' 123 456 ') + + # non-ascii digits (error came from non-digit '!') + check('\u0663\u0661\u0664!') + # embedded NUL + check('123\x00') + check('123\x00 245') + check('123\x00245') + # byte string with embedded NUL + check(b'123\x00') + # non-UTF-8 byte string + check(b'123\xa0') @support.run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE') def test_float_with_comma(self): From d9b0b8f63c3db38dc547e0c115e9060f13f2dbcf Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Fri, 10 Mar 2017 01:06:43 -0600 Subject: [PATCH 0114/2287] Add Appveyor (GH-324 backport) (GH-491) --- .github/appveyor.yml | 6 ++++++ README.rst | 4 ++++ 2 files changed, 10 insertions(+) create mode 100644 .github/appveyor.yml diff --git a/.github/appveyor.yml b/.github/appveyor.yml new file mode 100644 index 00000000000000..5a40005660b781 --- /dev/null +++ b/.github/appveyor.yml @@ -0,0 +1,6 @@ +version: 3.6.1rc1+.{build} +clone_depth: 5 +build_script: +- cmd: PCbuild\build.bat -e +test_script: +- cmd: PCbuild\rt.bat -q -uall -rwW --slowest --timeout=1200 -j0 diff --git a/README.rst b/README.rst index 242572c5e361db..6b4c2dba306ca5 100644 --- a/README.rst +++ b/README.rst @@ -5,6 +5,10 @@ This is Python version 3.6.1 release candidate 1 :alt: CPython build status on Travis CI :target: https://travis-ci.org/python/cpython +.. image:: https://ci.appveyor.com/api/projects/status/4mew1a93xdkbf5ua/branch/3.6?svg=true + :alt: CPython build status on Appveyor + :target: https://ci.appveyor.com/project/python/cpython/branch/3.6 + .. image:: https://codecov.io/gh/python/cpython/branch/3.6/graph/badge.svg :alt: CPython code coverage on Codecov :target: https://codecov.io/gh/python/cpython From faaa80fb9887950e7068a9506e3517bcd6562ac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= Date: Fri, 10 Mar 2017 05:30:05 -0800 Subject: [PATCH 0115/2287] Ignore Include/pydtrace_probes.h (#596) This is a generated file when --with-dtrace is passed. This entry is present in .hgignore. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ed4ebfbbd9de74..db27597aac57da 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ .gdb_history Doc/build/ Doc/venv/ +Include/pydtrace_probes.h Lib/distutils/command/*.pdb Lib/lib2to3/*.pickle Lib/test/data/* From ff6f3716279e75b2519133a82b9de0c3601963d9 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 10 Mar 2017 09:52:03 -0800 Subject: [PATCH 0116/2287] bpo-28739: Document that f-strings cannot be used as docstring (GH-592) (GH-600) (cherry picked from commit d4e89287b397c7382c12d3f3d9fd901fd8243b3c) --- Doc/reference/lexical_analysis.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index da7017afff0a3d..7f9c66481785c1 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -696,6 +696,17 @@ a temporary variable. >>> f"newline: {newline}" 'newline: 10' +Formatted string literals cannot be used as docstrings, even if they do not +include expressions. + +:: + + >>> def foo(): + ... f"Not a docstring" + ... + >>> foo.__doc__ is None + True + See also :pep:`498` for the proposal that added formatted string literals, and :meth:`str.format`, which uses a related format string mechanism. From 68c5e4c592495f1e0f4f60acb3483beb6aa87be1 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 10 Mar 2017 14:44:48 -0800 Subject: [PATCH 0117/2287] bpo-28810: Document BUILD_TUPLE_UNPACK_WITH_CALL bytecode (GH-605) (cherry picked from commit 7e52c3e7aefb4cdaa0662fc01ff68a5e976b77ca) --- Doc/library/dis.rst | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 1c1e1a2aa5d4b3..686118f5201857 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -807,6 +807,15 @@ All of the following opcodes use their arguments. .. versionadded:: 3.5 +.. opcode:: BUILD_TUPLE_UNPACK_WITH_CALL (count) + + This is similar to :opcode:`BUILD_TUPLE_UNPACK`, + but is used for ``f(*x, *y, *z)`` call syntax. The stack item at position + ``count + 1`` should be the corresponding callable ``f``. + + .. versionadded:: 3.6 + + .. opcode:: BUILD_LIST_UNPACK (count) This is similar to :opcode:`BUILD_TUPLE_UNPACK`, but pushes a list @@ -834,14 +843,16 @@ All of the following opcodes use their arguments. .. versionadded:: 3.5 -.. opcode:: BUILD_MAP_UNPACK_WITH_CALL (oparg) +.. opcode:: BUILD_MAP_UNPACK_WITH_CALL (count) This is similar to :opcode:`BUILD_MAP_UNPACK`, - but is used for ``f(**x, **y, **z)`` call syntax. The lowest byte of - *oparg* is the count of mappings, the relative position of the - corresponding callable ``f`` is encoded in the second byte of *oparg*. + but is used for ``f(**x, **y, **z)`` call syntax. The stack item at + position ``count + 2`` should be the corresponding callable ``f``. .. versionadded:: 3.5 + .. versionchanged:: 3.6 + The position of the callable is determined by adding 2 to the opcode + argument instead of encoding it in the second byte of the argument. .. opcode:: LOAD_ATTR (namei) From 4807fa8386f825d0c71192c59f7e33b99a94bebe Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 10 Mar 2017 15:08:52 -0800 Subject: [PATCH 0118/2287] bpo-28810: Document changes to CALL_FUNCTION opcodes (GH-607) (cherry picked from commit 4b2a2a425a906c8e4eb8daee14ab1793e225f726) --- Doc/library/dis.rst | 69 +++++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 686118f5201857..11d056901b7ad5 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -1009,14 +1009,45 @@ All of the following opcodes use their arguments. .. opcode:: CALL_FUNCTION (argc) - Calls a function. The low byte of *argc* indicates the number of positional - parameters, the high byte the number of keyword parameters. On the stack, the - opcode finds the keyword parameters first. For each keyword argument, the - value is on top of the key. Below the keyword parameters, the positional - parameters are on the stack, with the right-most parameter on top. Below the - parameters, the function object to call is on the stack. Pops all function - arguments, and the function itself off the stack, and pushes the return - value. + Calls a function. *argc* indicates the number of positional arguments. + The positional arguments are on the stack, with the right-most argument + on top. Below the arguments, the function object to call is on the stack. + Pops all function arguments, and the function itself off the stack, and + pushes the return value. + + .. versionchanged:: 3.6 + This opcode is used only for calls with positional arguments. + + +.. opcode:: CALL_FUNCTION_KW (argc) + + Calls a function. *argc* indicates the number of arguments (positional + and keyword). The top element on the stack contains a tuple of keyword + argument names. Below the tuple, keyword arguments are on the stack, in + the order corresponding to the tuple. Below the keyword arguments, the + positional arguments are on the stack, with the right-most parameter on + top. Below the arguments, the function object to call is on the stack. + Pops all function arguments, and the function itself off the stack, and + pushes the return value. + + .. versionchanged:: 3.6 + Keyword arguments are packed in a tuple instead of a dictionary, + *argc* indicates the total number of arguments + + +.. opcode:: CALL_FUNCTION_EX (flags) + + Calls a function. The lowest bit of *flags* indicates whether the + var-keyword argument is placed at the top of the stack. Below the + var-keyword argument, the var-positional argument is on the stack. + Below the arguments, the function object to call is placed. + Pops all function arguments, and the function itself off the stack, and + pushes the return value. Note that this opcode pops at most three items + from the stack. Var-positional and var-keyword arguments are packed + by :opcode:`BUILD_MAP_UNPACK_WITH_CALL` and + :opcode:`BUILD_MAP_UNPACK_WITH_CALL`. + + .. versionadded:: 3.6 .. opcode:: MAKE_FUNCTION (argc) @@ -1049,28 +1080,6 @@ All of the following opcodes use their arguments. two most-significant bytes. -.. opcode:: CALL_FUNCTION_VAR (argc) - - Calls a function. *argc* is interpreted as in :opcode:`CALL_FUNCTION`. The - top element on the stack contains the variable argument list, followed by - keyword and positional arguments. - - -.. opcode:: CALL_FUNCTION_KW (argc) - - Calls a function. *argc* is interpreted as in :opcode:`CALL_FUNCTION`. The - top element on the stack contains the keyword arguments dictionary, followed - by explicit keyword and positional arguments. - - -.. opcode:: CALL_FUNCTION_VAR_KW (argc) - - Calls a function. *argc* is interpreted as in :opcode:`CALL_FUNCTION`. The - top element on the stack contains the keyword arguments dictionary, followed - by the variable-arguments tuple, followed by explicit keyword and positional - arguments. - - .. opcode:: FORMAT_VALUE (flags) Used for implementing formatted literal strings (f-strings). Pops From 701f13ab930b62a634579951dc610f737f461135 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 10 Mar 2017 19:36:26 -0800 Subject: [PATCH 0119/2287] bpo-29784: Fix the reference to shutil.copy in the docs (GH-602) (GH-608) (cherry picked from commit 70ee0cd5c2a3dba82cb8e0c0742c012f9134c040) --- Doc/library/shutil.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index a85bf339ae1bc8..41e5bafa53d468 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -153,7 +153,7 @@ Directory and files operations is true and *src* is a symbolic link, *dst* will be a copy of the file *src* refers to. - :func:`copy` copies the file data and the file's permission + :func:`~shutil.copy` copies the file data and the file's permission mode (see :func:`os.chmod`). Other metadata, like the file's creation and modification times, is not preserved. To preserve all file metadata from the original, use @@ -302,7 +302,7 @@ Directory and files operations *src* and *dst*, and will be used to copy *src* to *dest* if :func:`os.rename` cannot be used. If the source is a directory, :func:`copytree` is called, passing it the :func:`copy_function`. The - default *copy_function* is :func:`copy2`. Using :func:`copy` as the + default *copy_function* is :func:`copy2`. Using :func:`~shutil.copy` as the *copy_function* allows the move to succeed when it is not possible to also copy the metadata, at the expense of not copying any of the metadata. From 16416c22f9b8d9e067506d3a98f661756c80389c Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Sat, 11 Mar 2017 14:07:30 +0800 Subject: [PATCH 0120/2287] bpo-29770: remove outdated PYO related info (GH-590) (GH-612) --- Doc/glossary.rst | 2 +- Doc/library/zipfile.rst | 6 +++--- Doc/library/zipimport.rst | 2 +- Doc/using/cmdline.rst | 4 ++-- Modules/main.c | 2 +- Modules/zipimport.c | 6 +++--- PC/getpathp.c | 4 ++-- PCbuild/rmpyc.py | 20 +++++++------------- PCbuild/rt.bat | 8 ++++---- Python/pylifecycle.c | 2 +- 10 files changed, 25 insertions(+), 31 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 41ee3d83b311fa..e07ab0df2fd68c 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -155,7 +155,7 @@ Glossary bytecode Python source code is compiled into bytecode, the internal representation of a Python program in the CPython interpreter. The bytecode is also - cached in ``.pyc`` and ``.pyo`` files so that executing the same file is + cached in ``.pyc`` files so that executing the same file is faster the second time (recompilation from source to bytecode can be avoided). This "intermediate language" is said to run on a :term:`virtual machine` that executes the machine code corresponding to diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index 4c91759c67f5d4..a5d42118ba5176 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -464,12 +464,12 @@ The :class:`PyZipFile` constructor takes the same parameters as the added to the archive, compiling if necessary. If *pathname* is a file, the filename must end with :file:`.py`, and - just the (corresponding :file:`\*.py[co]`) file is added at the top level + just the (corresponding :file:`\*.pyc`) file is added at the top level (no path information). If *pathname* is a file that does not end with :file:`.py`, a :exc:`RuntimeError` will be raised. If it is a directory, and the directory is not a package directory, then all the files - :file:`\*.py[co]` are added at the top level. If the directory is a - package directory, then all :file:`\*.py[co]` are added under the package + :file:`\*.pyc` are added at the top level. If the directory is a + package directory, then all :file:`\*.pyc` are added under the package name as a file path, and if any subdirectories are package directories, all of these are added recursively. diff --git a/Doc/library/zipimport.rst b/Doc/library/zipimport.rst index 46b8c245f7b3fe..eaae2bb04b7482 100644 --- a/Doc/library/zipimport.rst +++ b/Doc/library/zipimport.rst @@ -9,7 +9,7 @@ -------------- This module adds the ability to import Python modules (:file:`\*.py`, -:file:`\*.py[co]`) and packages from ZIP-format archives. It is usually not +:file:`\*.pyc`) and packages from ZIP-format archives. It is usually not needed to use the :mod:`zipimport` module explicitly; it is automatically used by the built-in :keyword:`import` mechanism for :data:`sys.path` items that are paths to ZIP archives. diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index 195f63f0a319da..08dc311d837be9 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -532,8 +532,8 @@ conflict. .. envvar:: PYTHONDONTWRITEBYTECODE - If this is set to a non-empty string, Python won't try to write ``.pyc`` or - ``.pyo`` files on the import of source modules. This is equivalent to + If this is set to a non-empty string, Python won't try to write ``.pyc`` + files on the import of source modules. This is equivalent to specifying the :option:`-B` option. diff --git a/Modules/main.c b/Modules/main.c index 2e6a60b1673f88..2a0b1b37da69fb 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -53,7 +53,7 @@ static const char usage_1[] = "\ Options and arguments (and corresponding environment variables):\n\ -b : issue warnings about str(bytes_instance), str(bytearray_instance)\n\ and comparing bytes/bytearray with str. (-bb: issue errors)\n\ --B : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x\n\ +-B : don't write .pyc files on import; also PYTHONDONTWRITEBYTECODE=x\n\ -c cmd : program passed in as string (terminates option list)\n\ -d : debug output from parser; also PYTHONDEBUG=x\n\ -E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\ diff --git a/Modules/zipimport.c b/Modules/zipimport.c index 59046aaae41f51..cccc033d2d9fab 100644 --- a/Modules/zipimport.c +++ b/Modules/zipimport.c @@ -1102,7 +1102,7 @@ get_decompress_func(void) _Py_IDENTIFIER(decompress); if (importing_zlib != 0) - /* Someone has a zlib.py[co] in their Zip file; + /* Someone has a zlib.pyc in their Zip file; let's avoid a stack overflow. */ return NULL; importing_zlib = 1; @@ -1261,7 +1261,7 @@ eq_mtime(time_t t1, time_t t2) return d <= 1; } -/* Given the contents of a .py[co] file in a buffer, unmarshal the data +/* Given the contents of a .pyc file in a buffer, unmarshal the data and return the code object. Return None if it the magic word doesn't match (we do this instead of raising an exception as we fall back to .py if available and we don't want to mask other errors). @@ -1403,7 +1403,7 @@ get_mtime_of_source(ZipImporter *self, PyObject *path) PyObject *toc_entry, *stripped; time_t mtime; - /* strip 'c' or 'o' from *.py[co] */ + /* strip 'c' from *.pyc */ if (PyUnicode_READY(path) == -1) return (time_t)-1; stripped = PyUnicode_FromKindAndData(PyUnicode_KIND(path), diff --git a/PC/getpathp.c b/PC/getpathp.c index 1eeebfe9c19451..e7be704a9a78dd 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -185,7 +185,7 @@ exists(wchar_t *filename) may extend 'filename' by one character. */ static int -ismodule(wchar_t *filename, int update_filename) /* Is module -- check for .pyc/.pyo too */ +ismodule(wchar_t *filename, int update_filename) /* Is module -- check for .pyc too */ { size_t n; @@ -196,7 +196,7 @@ ismodule(wchar_t *filename, int update_filename) /* Is module -- check for .pyc/ n = wcsnlen_s(filename, MAXPATHLEN+1); if (n < MAXPATHLEN) { int exist = 0; - filename[n] = Py_OptimizeFlag ? L'o' : L'c'; + filename[n] = L'c'; filename[n + 1] = L'\0'; exist = exists(filename); if (!update_filename) diff --git a/PCbuild/rmpyc.py b/PCbuild/rmpyc.py index a1e75bb7ae5b4b..0b58f687729f7e 100644 --- a/PCbuild/rmpyc.py +++ b/PCbuild/rmpyc.py @@ -1,25 +1,19 @@ -# Remove all the .pyc and .pyo files under ../Lib. +# Remove all the .pyc files under ../Lib. def deltree(root): import os from os.path import join - npyc = npyo = 0 + npyc = 0 for root, dirs, files in os.walk(root): for name in files: - delete = False - if name.endswith('.pyc'): - delete = True + # to be thorough + if name.endswith(('.pyc', '.pyo')): npyc += 1 - elif name.endswith('.pyo'): - delete = True - npyo += 1 - - if delete: os.remove(join(root, name)) - return npyc, npyo + return npyc -npyc, npyo = deltree("../Lib") -print(npyc, ".pyc deleted,", npyo, ".pyo deleted") +npyc = deltree("../Lib") +print(npyc, ".pyc deleted") diff --git a/PCbuild/rt.bat b/PCbuild/rt.bat index 35826727f3fa27..e73ac0457646e9 100644 --- a/PCbuild/rt.bat +++ b/PCbuild/rt.bat @@ -4,8 +4,8 @@ rem Usage: rt [-d] [-O] [-q] [-x64] regrtest_args rem -d Run Debug build (python_d.exe). Else release build. rem -O Run python.exe or python_d.exe (see -d) with -O. rem -q "quick" -- normally the tests are run twice, the first time -rem after deleting all the .py[co] files reachable from Lib/. -rem -q runs the tests just once, and without deleting .py[co] files. +rem after deleting all the .pyc files reachable from Lib/. +rem -q runs the tests just once, and without deleting .pyc files. rem -x64 Run the 64-bit build of python (or python_d if -d was specified) rem from the 'amd64' dir instead of the 32-bit build in this dir. rem All leading instances of these switches are shifted off, and @@ -45,7 +45,7 @@ set exe=%prefix%python%suffix%.exe set cmd="%exe%" %dashO% -Wd -E -bb -m test %regrtestargs% if defined qmode goto Qmode -echo Deleting .pyc/.pyo files ... +echo Deleting .pyc files ... "%exe%" "%pcbuild%rmpyc.py" echo Cleaning _pth files ... @@ -55,7 +55,7 @@ echo on %cmd% @echo off -echo About to run again without deleting .pyc/.pyo first: +echo About to run again without deleting .pyc first: pause :Qmode diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index a4f7f823bc695d..af96d6d5fcb63c 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -88,7 +88,7 @@ int Py_BytesWarningFlag; /* Warn on str(bytes) and str(buffer) */ int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */ int Py_FrozenFlag; /* Needed by getpath.c */ int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */ -int Py_DontWriteBytecodeFlag; /* Suppress writing bytecode files (*.py[co]) */ +int Py_DontWriteBytecodeFlag; /* Suppress writing bytecode files (*.pyc) */ int Py_NoUserSiteDirectory = 0; /* for -s and site.py */ int Py_UnbufferedStdioFlag = 0; /* Unbuffered binary std{in,out,err} */ int Py_HashRandomizationFlag = 0; /* for -R and PYTHONHASHSEED */ From d7a8d32ce2d2b17ea9584759a281235ebfe81a89 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 11 Mar 2017 10:19:51 -0800 Subject: [PATCH 0121/2287] tempfile.rst: Fix some typos (GH-610) (GH-618) (cherry picked from commit d3b8f98696b905367da3975f73b482bac380b51c) --- Doc/library/tempfile.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/tempfile.rst b/Doc/library/tempfile.rst index 665261ffb21f94..c59aca1e189086 100644 --- a/Doc/library/tempfile.rst +++ b/Doc/library/tempfile.rst @@ -245,12 +245,12 @@ The module uses a global variable to store the name of the directory used for temporary files returned by :func:`gettempdir`. It can be set directly to override the selection process, but this is discouraged. All functions in this module take a *dir* argument which can be used -to specify the directory and this is the recommend approach. +to specify the directory and this is the recommended approach. .. data:: tempdir When set to a value other than ``None``, this variable defines the - default value for the *dir* argument to all the functions defined in this + default value for the *dir* argument to the functions defined in this module. If ``tempdir`` is unset or ``None`` at any call to any of the above From b3536df9f8b041142f5e3bf6037c11be06eb7f59 Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Sat, 11 Mar 2017 15:42:25 -0600 Subject: [PATCH 0122/2287] Only trigger AppVeyor on code or config changes (GH-611 backport) (GH-620) --- .github/appveyor.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.github/appveyor.yml b/.github/appveyor.yml index 5a40005660b781..a369e52415bb17 100644 --- a/.github/appveyor.yml +++ b/.github/appveyor.yml @@ -4,3 +4,20 @@ build_script: - cmd: PCbuild\build.bat -e test_script: - cmd: PCbuild\rt.bat -q -uall -rwW --slowest --timeout=1200 -j0 + +# Only trigger AppVeyor if actual code or its configuration changes +only_commits: + files: + - .github/appveyor.yml + - .gitattributes + - Grammar/ + - Include/ + - Lib/ + - Modules/ + - Objects/ + - PC/ + - PCBuild/ + - Parser/ + - Programs/ + - Python/ + - Tools/ From df6f3f6f5743a061d6c3b939136a11ac170ae69e Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Sat, 11 Mar 2017 17:16:34 -0600 Subject: [PATCH 0123/2287] fix subprocess on Windows (GH-391 backport) (GH-623) --- Lib/subprocess.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 822ddb459e2615..0db6571f291dae 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -986,7 +986,7 @@ def _execute_child(self, args, executable, preexec_fn, close_fds, int(not close_fds), creationflags, env, - cwd, + os.fspath(cwd) if cwd is not None else None, startupinfo) finally: # Child is launched. Close the parent's copy of those pipe From 7c6d6e056460753c916348feee0e4916a97d7c86 Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Sat, 11 Mar 2017 22:39:54 -0600 Subject: [PATCH 0124/2287] bpo-29763: Use support.unlink instead of os.unlink (GH-624) (GH-625) support.unlink waits for the files to be removed before returning --- Lib/test/test_site.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index 0620b242766057..342ec9e43d5de3 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -501,15 +501,15 @@ def _create_underpth_exe(self, lines): print(line, file=f) return exe_file except: - os.unlink(_pth_file) - os.unlink(exe_file) + test.support.unlink(_pth_file) + test.support.unlink(exe_file) raise @classmethod def _cleanup_underpth_exe(self, exe_file): _pth_file = os.path.splitext(exe_file)[0] + '._pth' - os.unlink(_pth_file) - os.unlink(exe_file) + test.support.unlink(_pth_file) + test.support.unlink(exe_file) @classmethod def _calc_sys_path_for_underpth_nosite(self, sys_prefix, lines): From 2f386254e2cf054cc7ee5103b54c1cf16d9fa979 Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Sun, 12 Mar 2017 16:17:46 +1000 Subject: [PATCH 0125/2287] bpo-29656: Handle PR branches in 'make patchcheck' (#302) (#626) (cherry picked from commit 482f7a274fa52b7ba34ff308cd9acdcac9f41ba5) --- Tools/scripts/patchcheck.py | 58 +++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/Tools/scripts/patchcheck.py b/Tools/scripts/patchcheck.py index 58b081a9c53ff5..7a04aafa82a8a1 100755 --- a/Tools/scripts/patchcheck.py +++ b/Tools/scripts/patchcheck.py @@ -12,7 +12,6 @@ SRCDIR = sysconfig.get_config_var('srcdir') - def n_files_str(count): """Return 'N file(s)' with the proper plurality on 'file'.""" return "{} file{}".format(count, "s" if count != 1 else "") @@ -46,27 +45,73 @@ def mq_patches_applied(): return st.returncode == 0 and bstdout +def get_git_branch(): + """Get the symbolic name for the current git branch""" + cmd = "git rev-parse --abbrev-ref HEAD".split() + try: + return subprocess.check_output(cmd, stderr=subprocess.DEVNULL) + except subprocess.CalledProcessError: + return None + + +def get_git_upstream_remote(): + """Get the remote name to use for upstream branches + + Uses "upstream" if it exists, "origin" otherwise + """ + cmd = "git remote get-url upstream".split() + try: + subprocess.check_output(cmd, stderr=subprocess.DEVNULL) + except subprocess.CalledProcessError: + return "origin" + return "upstream" + + +@status("Getting base branch for PR", + info=lambda x: x if x is not None else "not a PR branch") +def get_base_branch(): + if not os.path.isdir(os.path.join(SRCDIR, '.git')): + # Not a git checkout, so there's no base branch + return None + version = sys.version_info + if version.releaselevel == 'alpha': + base_branch = "master" + else: + base_branch = "{0.major}.{0.minor}".format(version) + this_branch = get_git_branch() + if this_branch is None or this_branch == base_branch: + # Not on a git PR branch, so there's no base branch + return None + upstream_remote = get_git_upstream_remote() + return upstream_remote + "/" + base_branch + + @status("Getting the list of files that have been added/changed", info=lambda x: n_files_str(len(x))) -def changed_files(): +def changed_files(base_branch=None): """Get the list of changed or added files from Mercurial or git.""" if os.path.isdir(os.path.join(SRCDIR, '.hg')): + if base_branch is not None: + sys.exit('need a git checkout to check PR status') cmd = 'hg status --added --modified --no-status' if mq_patches_applied(): cmd += ' --rev qparent' with subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) as st: return [x.decode().rstrip() for x in st.stdout] elif os.path.isdir(os.path.join(SRCDIR, '.git')): - cmd = 'git status --porcelain' + if base_branch: + cmd = 'git diff --name-status ' + base_branch + else: + cmd = 'git status --porcelain' filenames = [] with subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) as st: for line in st.stdout: line = line.decode().rstrip() - status = set(line[:2]) + status_text, filename = line.split(maxsplit=1) + status = set(status_text) # modified, added or unmerged files if not status.intersection('MAU'): continue - filename = line[3:] if ' -> ' in filename: # file is renamed filename = filename.split(' -> ', 2)[1].strip() @@ -165,7 +210,8 @@ def regenerated_pyconfig_h_in(file_paths): return "not needed" def main(): - file_paths = changed_files() + base_branch = get_base_branch() + file_paths = changed_files(base_branch) python_files = [fn for fn in file_paths if fn.endswith('.py')] c_files = [fn for fn in file_paths if fn.endswith(('.c', '.h'))] doc_files = [fn for fn in file_paths if fn.startswith('Doc') and From 4652d82a51e6530a4f820588a6209d3295963bdb Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 12 Mar 2017 10:05:05 +0200 Subject: [PATCH 0126/2287] bpo-29746: Update marshal docs to Python 3. (#547) (#631) (cherry picked from commit c611a5b1d4fab0123bf622f06c3bfa510221dc32) --- Doc/c-api/marshal.rst | 8 ++++---- Doc/glossary.rst | 7 +++++++ Doc/library/marshal.rst | 19 ++++++++----------- Python/marshal.c | 26 ++++++++++++-------------- 4 files changed, 31 insertions(+), 29 deletions(-) diff --git a/Doc/c-api/marshal.rst b/Doc/c-api/marshal.rst index a6d0f4688d1b78..c6d1d02a2fa510 100644 --- a/Doc/c-api/marshal.rst +++ b/Doc/c-api/marshal.rst @@ -34,7 +34,7 @@ unmarshalling. Version 2 uses a binary format for floating point numbers. .. c:function:: PyObject* PyMarshal_WriteObjectToString(PyObject *value, int version) - Return a string object containing the marshalled representation of *value*. + Return a bytes object containing the marshalled representation of *value*. *version* indicates the file format. @@ -88,10 +88,10 @@ written using these routines? :exc:`TypeError`) and returns *NULL*. -.. c:function:: PyObject* PyMarshal_ReadObjectFromString(const char *string, Py_ssize_t len) +.. c:function:: PyObject* PyMarshal_ReadObjectFromString(const char *data, Py_ssize_t len) - Return a Python object from the data stream in a character buffer - containing *len* bytes pointed to by *string*. + Return a Python object from the data stream in a byte buffer + containing *len* bytes pointed to by *data*. On error, sets the appropriate exception (:exc:`EOFError` or :exc:`TypeError`) and returns *NULL*. diff --git a/Doc/glossary.rst b/Doc/glossary.rst index e07ab0df2fd68c..495934afe74c8b 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -131,6 +131,10 @@ Glossary binary file A :term:`file object` able to read and write :term:`bytes-like objects `. + Examples of binary files are files opened in binary mode (``'rb'``, + ``'wb'`` or ``'rb+'``), :data:`sys.stdin.buffer`, + :data:`sys.stdout.buffer`, and instances of :class:`io.BytesIO` and + :class:`gzip.GzipFile`. .. seealso:: A :term:`text file` reads and writes :class:`str` objects. @@ -966,6 +970,9 @@ Glossary A :term:`file object` able to read and write :class:`str` objects. Often, a text file actually accesses a byte-oriented datastream and handles the :term:`text encoding` automatically. + Examples of text files are files opened in text mode (``'r'`` or ``'w'``), + :data:`sys.stdin`, :data:`sys.stdout`, and instances of + :class:`io.StringIO`. .. seealso:: A :term:`binary file` reads and write :class:`bytes` objects. diff --git a/Doc/library/marshal.rst b/Doc/library/marshal.rst index 1ffc6effc7142d..d65afc20041133 100644 --- a/Doc/library/marshal.rst +++ b/Doc/library/marshal.rst @@ -49,7 +49,7 @@ For format *version* lower than 3, recursive lists, sets and dictionaries cannot be written (see below). There are functions that read/write files as well as functions operating on -strings. +bytes-like objects. The module defines these functions: @@ -57,9 +57,7 @@ The module defines these functions: .. function:: dump(value, file[, version]) Write the value on the open file. The value must be a supported type. The - file must be an open file object such as ``sys.stdout`` or returned by - :func:`open` or :func:`os.popen`. It must be opened in binary mode (``'wb'`` - or ``'w+b'``). + file must be a writeable :term:`binary file`. If the value has (or contains an object that has) an unsupported type, a :exc:`ValueError` exception is raised --- but garbage data will also be written @@ -74,8 +72,7 @@ The module defines these functions: Read one value from the open file and return it. If no valid value is read (e.g. because the data has a different Python version's incompatible marshal format), raise :exc:`EOFError`, :exc:`ValueError` or :exc:`TypeError`. The - file must be an open file object opened in binary mode (``'rb'`` or - ``'r+b'``). + file must be a readable :term:`binary file`. .. note:: @@ -85,7 +82,7 @@ The module defines these functions: .. function:: dumps(value[, version]) - Return the string that would be written to a file by ``dump(value, file)``. The + Return the bytes object that would be written to a file by ``dump(value, file)``. The value must be a supported type. Raise a :exc:`ValueError` exception if value has (or contains an object that has) an unsupported type. @@ -93,11 +90,11 @@ The module defines these functions: (see below). -.. function:: loads(string) +.. function:: loads(bytes) - Convert the string to a value. If no valid value is found, raise - :exc:`EOFError`, :exc:`ValueError` or :exc:`TypeError`. Extra characters in the - string are ignored. + Convert the :term:`bytes-like object` to a value. If no valid value is found, raise + :exc:`EOFError`, :exc:`ValueError` or :exc:`TypeError`. Extra bytes in the + input are ignored. In addition, the following constants are defined: diff --git a/Python/marshal.c b/Python/marshal.c index 87a4b240a41c87..7b12ab7510dcfb 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -549,7 +549,7 @@ w_complex_object(PyObject *v, char flag, WFILE *p) w_object(co->co_lnotab, p); } else if (PyObject_CheckBuffer(v)) { - /* Write unknown bytes-like objects as a byte string */ + /* Write unknown bytes-like objects as a bytes object */ Py_buffer view; if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) { w_byte(TYPE_UNKNOWN, p); @@ -1086,7 +1086,7 @@ r_object(RFILE *p) if (PyErr_Occurred()) break; if (n < 0 || n > SIZE32_MAX) { - PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)"); + PyErr_SetString(PyExc_ValueError, "bad marshal data (bytes object size out of range)"); break; } v = PyBytes_FromStringAndSize((char *)NULL, n); @@ -1110,7 +1110,7 @@ r_object(RFILE *p) if (PyErr_Occurred()) break; if (n < 0 || n > SIZE32_MAX) { - PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)"); + PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)"); break; } goto _read_ascii; @@ -1150,7 +1150,7 @@ r_object(RFILE *p) if (PyErr_Occurred()) break; if (n < 0 || n > SIZE32_MAX) { - PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)"); + PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)"); break; } if (n != 0) { @@ -1612,7 +1612,7 @@ PyMarshal_WriteObjectToString(PyObject *x, int version) if (wf.ptr - base > PY_SSIZE_T_MAX) { Py_DECREF(wf.str); PyErr_SetString(PyExc_OverflowError, - "too much marshal data for a string"); + "too much marshal data for a bytes object"); return NULL; } if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0) @@ -1658,8 +1658,7 @@ PyDoc_STRVAR(dump_doc, "dump(value, file[, version])\n\ \n\ Write the value on the open file. The value must be a supported type.\n\ -The file must be an open file object such as sys.stdout or returned by\n\ -open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\ +The file must be a writeable binary file.\n\ \n\ If the value has (or contains an object that has) an unsupported type, a\n\ ValueError exception is raised - but garbage data will also be written\n\ @@ -1715,8 +1714,7 @@ PyDoc_STRVAR(load_doc, Read one value from the open file and return it. If no valid value is\n\ read (e.g. because the data has a different Python version's\n\ incompatible marshal format), raise EOFError, ValueError or TypeError.\n\ -The file must be an open file object opened in binary mode ('rb' or\n\ -'r+b').\n\ +The file must be a readable binary file.\n\ \n\ Note: If an object containing an unsupported type was marshalled with\n\ dump(), load() will substitute None for the unmarshallable type."); @@ -1735,7 +1733,7 @@ marshal_dumps(PyObject *self, PyObject *args) PyDoc_STRVAR(dumps_doc, "dumps(value[, version])\n\ \n\ -Return the string that would be written to a file by dump(value, file).\n\ +Return the bytes object that would be written to a file by dump(value, file).\n\ The value must be a supported type. Raise a ValueError exception if\n\ value has (or contains an object that has) an unsupported type.\n\ \n\ @@ -1771,8 +1769,8 @@ marshal_loads(PyObject *self, PyObject *args) PyDoc_STRVAR(loads_doc, "loads(bytes)\n\ \n\ -Convert the bytes object to a value. If no valid value is found, raise\n\ -EOFError, ValueError or TypeError. Extra characters in the input are\n\ +Convert the bytes-like object to a value. If no valid value is found,\n\ +raise EOFError, ValueError or TypeError. Extra bytes in the input are\n\ ignored."); static PyMethodDef marshal_methods[] = { @@ -1810,8 +1808,8 @@ Functions:\n\ \n\ dump() -- write value to a file\n\ load() -- read value from a file\n\ -dumps() -- write value to a string\n\ -loads() -- read value from a string"); +dumps() -- marshal value as a bytes object\n\ +loads() -- read value from a bytes-like object"); From 61a82a5fbf1a674b91764652ab70f5dbb9ba50f2 Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Sun, 12 Mar 2017 20:00:20 +1000 Subject: [PATCH 0127/2287] bpo-29798: Handle git worktree in `make patchcheck` (#629) (#633) In git worktree directories, `.git` is a configuration file rather than a subdirectory (cherry picked from commit 6a6d090612dd7deaac2bc0399fad743e5e2db606) --- Tools/scripts/patchcheck.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Tools/scripts/patchcheck.py b/Tools/scripts/patchcheck.py index 7a04aafa82a8a1..f4ec7d8a30ea23 100755 --- a/Tools/scripts/patchcheck.py +++ b/Tools/scripts/patchcheck.py @@ -98,7 +98,10 @@ def changed_files(base_branch=None): cmd += ' --rev qparent' with subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) as st: return [x.decode().rstrip() for x in st.stdout] - elif os.path.isdir(os.path.join(SRCDIR, '.git')): + elif os.path.exists(os.path.join(SRCDIR, '.git')): + # We just use an existence check here as: + # directory = normal git checkout/clone + # file = git worktree directory if base_branch: cmd = 'git diff --name-status ' + base_branch else: From c60948464fb0ec116ea227f6bce8a4bb8fb75257 Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Sun, 12 Mar 2017 21:34:22 +1000 Subject: [PATCH 0128/2287] [3.6] bpo-29723: Consistently configure sys.path[0] (#636) Directory and zipfile execution previously added the parent directory of the directory or zipfile as sys.path[0] and then subsequently overwrote it with the directory or zipfile itself. This caused problems in isolated mode, as it overwrote the "stdlib as a zip archive" entry in sys.path, as the parent directory was never added. The attempted fix to that issue in bpo-29319 created the opposite problem in *non*-isolated mode, by potentially leaving the parent directory on sys.path instead of overwriting it. This change fixes the root cause of the problem by removing the whole "add-and-overwrite" dance for sys.path[0], and instead simply never adds the parent directory to sys.path in the first place. (cherry picked from commit d2977a3ae2cc6802921b1e3b6e9d13fcfbda872d) --- Lib/test/test_cmd_line_script.py | 67 +++++++++++++++++++++++++++++ Misc/NEWS | 8 ++++ Modules/main.c | 72 +++++++++++++++++++------------- 3 files changed, 119 insertions(+), 28 deletions(-) diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index e058ecd086df3c..1587daf8f582dd 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -572,6 +572,73 @@ def test_syntaxerror_indented_caret_position(self): self.assertNotIn("\f", text) self.assertIn("\n 1 + 1 = 2\n ^", text) + def test_consistent_sys_path_for_direct_execution(self): + # This test case ensures that the following all give the same + # sys.path configuration: + # + # ./python -s script_dir/__main__.py + # ./python -s script_dir + # ./python -I script_dir + script = textwrap.dedent("""\ + import sys + for entry in sys.path: + print(entry) + """) + # Always show full path diffs on errors + self.maxDiff = None + with support.temp_dir() as work_dir, support.temp_dir() as script_dir: + script_name = _make_test_script(script_dir, '__main__', script) + # Reference output comes from directly executing __main__.py + # We omit PYTHONPATH and user site to align with isolated mode + p = spawn_python("-Es", script_name, cwd=work_dir) + out_by_name = kill_python(p).decode().splitlines() + self.assertEqual(out_by_name[0], script_dir) + self.assertNotIn(work_dir, out_by_name) + # Directory execution should give the same output + p = spawn_python("-Es", script_dir, cwd=work_dir) + out_by_dir = kill_python(p).decode().splitlines() + self.assertEqual(out_by_dir, out_by_name) + # As should directory execution in isolated mode + p = spawn_python("-I", script_dir, cwd=work_dir) + out_by_dir_isolated = kill_python(p).decode().splitlines() + self.assertEqual(out_by_dir_isolated, out_by_dir, out_by_name) + + def test_consistent_sys_path_for_module_execution(self): + # This test case ensures that the following both give the same + # sys.path configuration: + # ./python -sm script_pkg.__main__ + # ./python -sm script_pkg + # + # And that this fails as unable to find the package: + # ./python -Im script_pkg + script = textwrap.dedent("""\ + import sys + for entry in sys.path: + print(entry) + """) + # Always show full path diffs on errors + self.maxDiff = None + with support.temp_dir() as work_dir: + script_dir = os.path.join(work_dir, "script_pkg") + os.mkdir(script_dir) + script_name = _make_test_script(script_dir, '__main__', script) + # Reference output comes from `-m script_pkg.__main__` + # We omit PYTHONPATH and user site to better align with the + # direct execution test cases + p = spawn_python("-sm", "script_pkg.__main__", cwd=work_dir) + out_by_module = kill_python(p).decode().splitlines() + self.assertEqual(out_by_module[0], '') + self.assertNotIn(script_dir, out_by_module) + # Package execution should give the same output + p = spawn_python("-sm", "script_pkg", cwd=work_dir) + out_by_package = kill_python(p).decode().splitlines() + self.assertEqual(out_by_package, out_by_module) + # Isolated mode should fail with an import error + exitcode, stdout, stderr = assert_python_failure( + "-Im", "script_pkg", cwd=work_dir + ) + traceback_lines = stderr.decode().splitlines() + self.assertIn("No module named script_pkg", traceback_lines[-1]) def test_main(): support.run_unittest(CmdLineTest) diff --git a/Misc/NEWS b/Misc/NEWS index 299a8388ff6e39..640c783ed7f4be 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,14 @@ What's New in Python 3.6.1 final? Core and Builtins ----------------- +- bpo-29723: The ``sys.path[0]`` initialization change for bpo-29139 caused a + regression by revealing an inconsistency in how sys.path is initialized when + executing ``__main__`` from a zipfile, directory, or other import location. + The interpreter now consistently avoids ever adding the import location's + parent directory to ``sys.path``, and ensures no other ``sys.path`` entries + are inadvertently modified when inserting the import location named on the + command line. + - bpo-29714: Fix a regression that bytes format may fail when containing zero bytes inside. diff --git a/Modules/main.c b/Modules/main.c index 2a0b1b37da69fb..475a2fdc36db9b 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -225,55 +225,60 @@ static int RunModule(wchar_t *modname, int set_argv0) return 0; } -static int -RunMainFromImporter(wchar_t *filename) +static PyObject * +AsImportPathEntry(wchar_t *filename) { - PyObject *argv0 = NULL, *importer, *sys_path, *sys_path0; - int sts; + PyObject *sys_path0 = NULL, *importer; - argv0 = PyUnicode_FromWideChar(filename, wcslen(filename)); - if (argv0 == NULL) + sys_path0 = PyUnicode_FromWideChar(filename, wcslen(filename)); + if (sys_path0 == NULL) goto error; - importer = PyImport_GetImporter(argv0); + importer = PyImport_GetImporter(sys_path0); if (importer == NULL) goto error; if (importer == Py_None) { - Py_DECREF(argv0); + Py_DECREF(sys_path0); Py_DECREF(importer); - return -1; + return NULL; } Py_DECREF(importer); + return sys_path0; + +error: + Py_XDECREF(sys_path0); + PySys_WriteStderr("Failed checking if argv[0] is an import path entry\n"); + PyErr_Print(); + PyErr_Clear(); + return NULL; +} + + +static int +RunMainFromImporter(PyObject *sys_path0) +{ + PyObject *sys_path; + int sts; - /* argv0 is usable as an import source, so put it in sys.path[0] - and import __main__ */ + /* Assume sys_path0 has already been checked by AsImportPathEntry, + * so put it in sys.path[0] and import __main__ */ sys_path = PySys_GetObject("path"); if (sys_path == NULL) { PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path"); goto error; } - sys_path0 = PyList_GetItem(sys_path, 0); - sts = 0; - if (!sys_path0) { - PyErr_Clear(); - sts = PyList_Append(sys_path, argv0); - } else if (PyObject_IsTrue(sys_path0)) { - sts = PyList_Insert(sys_path, 0, argv0); - } else { - sts = PyList_SetItem(sys_path, 0, argv0); - } + sts = PyList_Insert(sys_path, 0, sys_path0); if (sts) { - argv0 = NULL; + sys_path0 = NULL; goto error; } - Py_INCREF(argv0); sts = RunModule(L"__main__", 0); return sts != 0; error: - Py_XDECREF(argv0); + Py_XDECREF(sys_path0); PyErr_Print(); return 1; } @@ -358,6 +363,7 @@ Py_Main(int argc, wchar_t **argv) int saw_unbuffered_flag = 0; char *opt; PyCompilerFlags cf; + PyObject *main_importer_path = NULL; PyObject *warning_option = NULL; PyObject *warning_options = NULL; @@ -714,7 +720,17 @@ Py_Main(int argc, wchar_t **argv) argv[_PyOS_optind] = L"-m"; } - PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind); + if (filename != NULL) { + main_importer_path = AsImportPathEntry(filename); + } + + if (main_importer_path != NULL) { + /* Let RunMainFromImporter adjust sys.path[0] later */ + PySys_SetArgvEx(argc-_PyOS_optind, argv+_PyOS_optind, 0); + } else { + /* Use config settings to decide whether or not to update sys.path[0] */ + PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind); + } if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) && isatty(fileno(stdin)) && @@ -744,11 +760,11 @@ Py_Main(int argc, wchar_t **argv) sts = -1; /* keep track of whether we've already run __main__ */ - if (filename != NULL) { - sts = RunMainFromImporter(filename); + if (main_importer_path != NULL) { + sts = RunMainFromImporter(main_importer_path); } - if (sts==-1 && filename!=NULL) { + if (sts==-1 && filename != NULL) { fp = _Py_wfopen(filename, L"r"); if (fp == NULL) { char *cfilename_buffer; From aac875fa2f03cab61ceeaa2621c4c5534c7bcfc2 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 12 Mar 2017 21:52:17 +0200 Subject: [PATCH 0129/2287] [3.6] bpo-8256: Fixed possible failing or crashing input() (#641) if attributes "encoding" or "errors" of sys.stdin or sys.stdout are not set or are not strings. --- Misc/NEWS | 3 +++ Python/bltinmodule.c | 21 ++++++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 640c783ed7f4be..eef4dfa3352286 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -24,6 +24,9 @@ Core and Builtins Library ------- +- bpo-8256: Fixed possible failing or crashing input() if attributes "encoding" + or "errors" of sys.stdin or sys.stdout are not set or are not strings. + - bpo-28298: Fix a bug that prevented array 'Q', 'L' and 'I' from accepting big intables (objects that have __int__) as elements. Patch by Oren Milman. diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index ef5a34cae900b6..597e26ec69a95a 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -1927,12 +1927,15 @@ builtin_input_impl(PyObject *module, PyObject *prompt) PyObject *result; size_t len; + /* stdin is a text stream, so it must have an encoding. */ stdin_encoding = _PyObject_GetAttrId(fin, &PyId_encoding); stdin_errors = _PyObject_GetAttrId(fin, &PyId_errors); - if (!stdin_encoding || !stdin_errors) - /* stdin is a text stream, so it must have an - encoding. */ + if (!stdin_encoding || !stdin_errors || + !PyUnicode_Check(stdin_encoding) || + !PyUnicode_Check(stdin_errors)) { + tty = 0; goto _readline_errors; + } stdin_encoding_str = PyUnicode_AsUTF8(stdin_encoding); stdin_errors_str = PyUnicode_AsUTF8(stdin_errors); if (!stdin_encoding_str || !stdin_errors_str) @@ -1948,8 +1951,12 @@ builtin_input_impl(PyObject *module, PyObject *prompt) PyObject *stringpo; stdout_encoding = _PyObject_GetAttrId(fout, &PyId_encoding); stdout_errors = _PyObject_GetAttrId(fout, &PyId_errors); - if (!stdout_encoding || !stdout_errors) + if (!stdout_encoding || !stdout_errors || + !PyUnicode_Check(stdout_encoding) || + !PyUnicode_Check(stdout_errors)) { + tty = 0; goto _readline_errors; + } stdout_encoding_str = PyUnicode_AsUTF8(stdout_encoding); stdout_errors_str = PyUnicode_AsUTF8(stdout_errors); if (!stdout_encoding_str || !stdout_errors_str) @@ -2003,13 +2010,17 @@ builtin_input_impl(PyObject *module, PyObject *prompt) Py_XDECREF(po); PyMem_FREE(s); return result; + _readline_errors: Py_XDECREF(stdin_encoding); Py_XDECREF(stdout_encoding); Py_XDECREF(stdin_errors); Py_XDECREF(stdout_errors); Py_XDECREF(po); - return NULL; + if (tty) + return NULL; + + PyErr_Clear(); } /* Fallback if we're not interactive */ From fa448de97de85d242491d7ad259ade0732f05db8 Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Sun, 12 Mar 2017 17:04:06 -0400 Subject: [PATCH 0130/2287] Fix wrapping into StopIteration of return values in generators and coroutines (#644) (#647) --- Lib/test/test_coroutines.py | 15 +++++++++++++++ Misc/NEWS | 2 ++ Objects/genobject.c | 3 +-- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index b4c7b5be6e208c..a69583b5f95ae6 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -1103,6 +1103,21 @@ async def waiter(coro): "coroutine is being awaited already"): waiter(coro).send(None) + def test_await_16(self): + # See https://bugs.python.org/issue29600 for details. + + async def f(): + return ValueError() + + async def g(): + try: + raise KeyError + except: + return await f() + + _, result = run_async(g()) + self.assertIsNone(result.__context__) + def test_with_1(self): class Manager: def __init__(self, name): diff --git a/Misc/NEWS b/Misc/NEWS index eef4dfa3352286..504b977bc87b4b 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ What's New in Python 3.6.1 final? Core and Builtins ----------------- +- bpo-29600: Fix wrapping coroutine return values in StopIteration. + - bpo-29723: The ``sys.path[0]`` initialization change for bpo-29139 caused a regression by revealing an inconsistency in how sys.path is initialized when executing ``__main__`` from a zipfile, directory, or other import location. diff --git a/Objects/genobject.c b/Objects/genobject.c index 2680ab0e129da4..1c29e296afe2a8 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -575,8 +575,7 @@ _PyGen_SetStopIterationValue(PyObject *value) PyObject *e; if (value == NULL || - (!PyTuple_Check(value) && - !PyObject_TypeCheck(value, (PyTypeObject *) PyExc_StopIteration))) + (!PyTuple_Check(value) && !PyExceptionInstance_Check(value))) { /* Delay exception instantiation if we can */ PyErr_SetObject(PyExc_StopIteration, value); From 99f8d33a94c8951fd6b2d5f079d20be698150993 Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Sun, 12 Mar 2017 17:06:16 -0400 Subject: [PATCH 0131/2287] bpo-29742: asyncio get_extra_info() throws exception (#525) (#645) --- Lib/asyncio/sslproto.py | 4 +++- Lib/test/test_asyncio/test_sslproto.py | 12 ++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index 7ad28d6aa0089a..ab7ff0bf93d076 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -543,8 +543,10 @@ def eof_received(self): def _get_extra_info(self, name, default=None): if name in self._extra: return self._extra[name] - else: + elif self._transport is not None: return self._transport.get_extra_info(name, default) + else: + return default def _start_shutdown(self): if self._in_shutdown: diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index 59ff0f6967e5b5..f1771c5561afea 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -95,5 +95,17 @@ def test_connection_lost(self): test_utils.run_briefly(self.loop) self.assertIsInstance(waiter.exception(), ConnectionAbortedError) + def test_get_extra_info_on_closed_connection(self): + waiter = asyncio.Future(loop=self.loop) + ssl_proto = self.ssl_protocol(waiter) + self.assertIsNone(ssl_proto._get_extra_info('socket')) + default = object() + self.assertIs(ssl_proto._get_extra_info('socket', default), default) + self.connection_made(ssl_proto) + self.assertIsNotNone(ssl_proto._get_extra_info('socket')) + ssl_proto.connection_lost(None) + self.assertIsNone(ssl_proto._get_extra_info('socket')) + + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS index 504b977bc87b4b..25a24f52008a6f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -26,6 +26,9 @@ Core and Builtins Library ------- +- bpo-29742: get_extra_info() raises exception if get called on closed ssl transport. + Patch by Nikolay Kim. + - bpo-8256: Fixed possible failing or crashing input() if attributes "encoding" or "errors" of sys.stdin or sys.stdout are not set or are not strings. From 7927abba3449e12d0ae3518b722fdfeb383b4039 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Mon, 13 Mar 2017 10:36:34 +0800 Subject: [PATCH 0132/2287] fix the name of argument to ftplib.FTP.set_pasv and fix wording (GH-653) (GH-654) --- Doc/library/ftplib.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst index b8c1dcfef2d98e..1153ce77ddabcb 100644 --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -255,9 +255,9 @@ followed by ``lines`` for the text version or ``binary`` for the binary version. prints the line to ``sys.stdout``. -.. method:: FTP.set_pasv(boolean) +.. method:: FTP.set_pasv(val) - Enable "passive" mode if *boolean* is true, other disable passive mode. + Enable "passive" mode if *val* is true, otherwise disable passive mode. Passive mode is on by default. From 388e2568fc919a177df2d2949b575c553aea84ac Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Mon, 13 Mar 2017 11:03:36 +0800 Subject: [PATCH 0133/2287] ftplib.FTP.retrbinary callback gets a bytes, not a str (GH-652) (GH-657) --- Doc/library/ftplib.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst index 1153ce77ddabcb..7291dfe84811c6 100644 --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -235,7 +235,7 @@ followed by ``lines`` for the text version or ``binary`` for the binary version. Retrieve a file in binary transfer mode. *cmd* should be an appropriate ``RETR`` command: ``'RETR filename'``. The *callback* function is called for - each block of data received, with a single string argument giving the data + each block of data received, with a single bytes argument giving the data block. The optional *blocksize* argument specifies the maximum chunk size to read on the low-level socket object created to do the actual transfer (which will also be the largest size of the data blocks passed to *callback*). A From faa2cc63e45bc7d7ffab84bebe5a9f4fe065bd96 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Tue, 14 Mar 2017 15:27:01 +0800 Subject: [PATCH 0134/2287] bpo-28856: Let %b format for bytes support objects that follow the buffer protocol (GH-664) --- Lib/test/test_format.py | 8 ++++++-- Misc/NEWS | 3 +++ Objects/bytesobject.c | 15 ++++++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py index 83eb29faf88d6c..b6ba2e566b295f 100644 --- a/Lib/test/test_format.py +++ b/Lib/test/test_format.py @@ -315,10 +315,12 @@ def __bytes__(self): testcommon(b"%b", b"abc", b"abc") testcommon(b"%b", bytearray(b"def"), b"def") testcommon(b"%b", fb, b"123") + testcommon(b"%b", memoryview(b"abc"), b"abc") # # %s is an alias for %b -- should only be used for Py2/3 code testcommon(b"%s", b"abc", b"abc") testcommon(b"%s", bytearray(b"def"), b"def") testcommon(b"%s", fb, b"123") + testcommon(b"%s", memoryview(b"abc"), b"abc") # %a will give the equivalent of # repr(some_obj).encode('ascii', 'backslashreplace') testcommon(b"%a", 3.14, b"3.14") @@ -377,9 +379,11 @@ def test_exc(formatstr, args, exception, excmsg): test_exc(b"%c", 3.14, TypeError, "%c requires an integer in range(256) or a single byte") test_exc(b"%b", "Xc", TypeError, - "%b requires bytes, or an object that implements __bytes__, not 'str'") + "%b requires a bytes-like object, " + "or an object that implements __bytes__, not 'str'") test_exc(b"%s", "Wd", TypeError, - "%b requires bytes, or an object that implements __bytes__, not 'str'") + "%b requires a bytes-like object, " + "or an object that implements __bytes__, not 'str'") if maxsize == 2**31-1: # crashes 2.2.1 and earlier: diff --git a/Misc/NEWS b/Misc/NEWS index 25a24f52008a6f..284a2031eeafc8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ Core and Builtins - bpo-29600: Fix wrapping coroutine return values in StopIteration. +- bpo-28856: Fix an oversight that %b format for bytes should support objects + follow the buffer protocol. + - bpo-29723: The ``sys.path[0]`` initialization change for bpo-29139 caused a regression by revealing an inconsistency in how sys.path is initialized when executing ``__main__`` from a zipfile, directory, or other import location. diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 801711f7e6ccaa..30c1a7e24532da 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -528,6 +528,8 @@ byte_converter(PyObject *arg, char *p) return 0; } +static PyObject *_PyBytes_FromBuffer(PyObject *x); + static PyObject * format_obj(PyObject *v, const char **pbuf, Py_ssize_t *plen) { @@ -564,8 +566,19 @@ format_obj(PyObject *v, const char **pbuf, Py_ssize_t *plen) *plen = PyBytes_GET_SIZE(result); return result; } + /* does it support buffer protocol? */ + if (PyObject_CheckBuffer(v)) { + /* maybe we can avoid making a copy of the buffer object here? */ + result = _PyBytes_FromBuffer(v); + if (result == NULL) + return NULL; + *pbuf = PyBytes_AS_STRING(result); + *plen = PyBytes_GET_SIZE(result); + return result; + } PyErr_Format(PyExc_TypeError, - "%%b requires bytes, or an object that implements __bytes__, not '%.100s'", + "%%b requires a bytes-like object, " + "or an object that implements __bytes__, not '%.100s'", Py_TYPE(v)->tp_name); return NULL; } From 53b2667dcf2a7d13af466a5fb91844f5125a920d Mon Sep 17 00:00:00 2001 From: Michael Seifert Date: Wed, 15 Mar 2017 08:42:02 +0100 Subject: [PATCH 0135/2287] bpo-29800: Fix crashes in partial.__repr__ if the keys of partial.keywords are not strings (#649) (#671) --- Lib/test/test_functools.py | 26 ++++++++++++++++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ Modules/_functoolsmodule.c | 5 ++++- 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index b7d648d0b15a55..cd4664cec08745 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -402,6 +402,32 @@ def test_attributes_unwritable(self): else: self.fail('partial object allowed __dict__ to be deleted') + def test_manually_adding_non_string_keyword(self): + p = self.partial(capture) + # Adding a non-string/unicode keyword to partial kwargs + p.keywords[1234] = 'value' + r = repr(p) + self.assertIn('1234', r) + self.assertIn("'value'", r) + with self.assertRaises(TypeError): + p() + + def test_keystr_replaces_value(self): + p = self.partial(capture) + + class MutatesYourDict(object): + def __str__(self): + p.keywords[self] = ['sth2'] + return 'astr' + + # Raplacing the value during key formatting should keep the original + # value alive (at least long enough). + p.keywords[MutatesYourDict()] = ['sth'] + r = repr(p) + self.assertIn('astr', r) + self.assertIn("['sth']", r) + + class TestPartialPy(TestPartial, unittest.TestCase): partial = py_functools.partial diff --git a/Misc/ACKS b/Misc/ACKS index c3b29a42a34f75..03afeb8f3876ee 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1371,6 +1371,7 @@ Federico Schwindt Barry Scott Steven Scott Nick Seidenman +Michael Seifert Žiga Seilnacht Yury Selivanov Fred Sells diff --git a/Misc/NEWS b/Misc/NEWS index 284a2031eeafc8..4c5efefb659378 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -29,6 +29,9 @@ Core and Builtins Library ------- +- bpo-29800: Fix crashes in partial.__repr__ if the keys of partial.keywords + are not strings. Patch by Michael Seifert. + - bpo-29742: get_extra_info() raises exception if get called on closed ssl transport. Patch by Nikolay Kim. diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index 7abc9f464027f7..1bcf16a7e00f53 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -250,8 +250,11 @@ partial_repr(partialobject *pto) /* Pack keyword arguments */ assert (PyDict_Check(pto->kw)); for (i = 0; PyDict_Next(pto->kw, &i, &key, &value);) { - Py_SETREF(arglist, PyUnicode_FromFormat("%U, %U=%R", arglist, + /* Prevent key.__str__ from deleting the value. */ + Py_INCREF(value); + Py_SETREF(arglist, PyUnicode_FromFormat("%U, %S=%R", arglist, key, value)); + Py_DECREF(value); if (arglist == NULL) goto done; } From 02c6fa573a0a7f417e21ad9e81bcff3ac61a9fa8 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Wed, 15 Mar 2017 14:12:22 +0300 Subject: [PATCH 0136/2287] Delete duplicate entry in Misc/NEWS (#673) It has already been added in the build section. --- Misc/NEWS | 2 -- 1 file changed, 2 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 4c5efefb659378..03f70dc885d818 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -73,8 +73,6 @@ Core and Builtins - Issue #28598: Support __rmod__ for subclasses of str being called before str.__mod__. Patch by Martijn Pieters. -- bpo-29572: Update Windows build and OS X installers to use OpenSSL 1.0.2k. - - bpo-29607: Fix stack_effect computation for CALL_FUNCTION_EX. Patch by Matthieu Dartiailh. From 78add3309b53d68c2c5c118ec63f7485bbf93c9a Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Wed, 15 Mar 2017 14:12:53 +0300 Subject: [PATCH 0137/2287] Change assertRaises to assertRaisesRegex in test_xmlrpc (#481) (#674) (cherry picked from commit c6b448b36d22769c684bb3276f85c1b47d15ab63) --- Lib/test/test_xmlrpc.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py index 69de08e9c3b252..30025e388ddf2e 100644 --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -412,7 +412,7 @@ def test_registered_func_is_none(self): dispatcher = xmlrpc.server.SimpleXMLRPCDispatcher() dispatcher.register_function(None, name='method') - with self.assertRaises(Exception, expected_regex='method'): + with self.assertRaisesRegex(Exception, 'method'): dispatcher._dispatch('method', ('param',)) def test_instance_has_no_func(self): @@ -420,14 +420,14 @@ def test_instance_has_no_func(self): dispatcher = xmlrpc.server.SimpleXMLRPCDispatcher() dispatcher.register_instance(object()) - with self.assertRaises(Exception, expected_regex='method'): + with self.assertRaisesRegex(Exception, 'method'): dispatcher._dispatch('method', ('param',)) def test_cannot_locate_func(self): """Calls a function that the dispatcher cannot locate""" dispatcher = xmlrpc.server.SimpleXMLRPCDispatcher() - with self.assertRaises(Exception, expected_regex='method'): + with self.assertRaisesRegex(Exception, 'method'): dispatcher._dispatch('method', ('param',)) From 0dfd18a1e14e08b0d6459c2dd1898e5bb38020c5 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Thu, 16 Mar 2017 16:22:35 +0300 Subject: [PATCH 0138/2287] Fix stderr bug in json.tool test (#346) (#676) See https://github.com/python/cpython/pull/201#discussion_r103229425.(cherry picked from commit b4e9087e7b77e8f76feac76f9c1ab21b49c0c766) --- Lib/test/test_json/test_tool.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_json/test_tool.py b/Lib/test/test_json/test_tool.py index 15f373664e1278..9d93f931ca3958 100644 --- a/Lib/test/test_json/test_tool.py +++ b/Lib/test/test_json/test_tool.py @@ -2,7 +2,7 @@ import sys import textwrap import unittest -import subprocess +from subprocess import Popen, PIPE from test import support from test.support.script_helper import assert_python_ok @@ -61,12 +61,11 @@ class TestTool(unittest.TestCase): """) def test_stdin_stdout(self): - with subprocess.Popen( - (sys.executable, '-m', 'json.tool'), - stdin=subprocess.PIPE, stdout=subprocess.PIPE) as proc: + args = sys.executable, '-m', 'json.tool' + with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: out, err = proc.communicate(self.data.encode()) self.assertEqual(out.splitlines(), self.expect.encode().splitlines()) - self.assertEqual(err, None) + self.assertEqual(err, b'') def _create_infile(self): infile = support.TESTFN From 9cd5e87bac51d7b901e3c36bf22728bb1693da59 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Thu, 16 Mar 2017 11:03:03 -0700 Subject: [PATCH 0139/2287] Takes vcruntime140.dll from the correct source. (#684) --- Tools/msi/make_zip.proj | 9 +++------ Tools/nuget/make_pkg.proj | 8 +++----- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/Tools/msi/make_zip.proj b/Tools/msi/make_zip.proj index f78e6ffa28fb72..b3588b7a0bae90 100644 --- a/Tools/msi/make_zip.proj +++ b/Tools/msi/make_zip.proj @@ -17,15 +17,12 @@ rmdir /q/s "$(IntermediateOutputPath)\zip_$(ArchName)" "$(PythonExe)" "$(MSBuildThisFileDirectory)\make_zip.py" $(Arguments) -e -o "$(TargetPath)" -t "$(IntermediateOutputPath)\zip_$(ArchName)" -a $(ArchName) - set DOC_FILENAME=python$(PythonVersion).chm -set VCREDIST_PATH=$(VS140COMNTOOLS)\..\..\VC\redist\$(Platform)\Microsoft.VC140.CRT + set DOC_FILENAME=python$(PythonVersion).chm + $(Environment)%0D%0Aset VCREDIST_PATH=$(CRTRedist)\$(Platform) - + diff --git a/Tools/nuget/make_pkg.proj b/Tools/nuget/make_pkg.proj index d7e932cee54d3c..464ef0456af47a 100644 --- a/Tools/nuget/make_pkg.proj +++ b/Tools/nuget/make_pkg.proj @@ -34,9 +34,8 @@ $(NugetArguments) -Version "$(NuspecVersion)" $(NugetArguments) -NoPackageAnalysis -NonInteractive - setlocal -set DOC_FILENAME=python$(PythonVersion).chm -set VCREDIST_PATH=$(VS140COMNTOOLS)\..\..\VC\redist\$(Platform)\Microsoft.VC140.CRT + set DOC_FILENAME=python$(PythonVersion).chm + $(Environment)%0D%0Aset VCREDIST_PATH=$(CRTRedist)\$(Platform) @@ -45,8 +44,7 @@ set VCREDIST_PATH=$(VS140COMNTOOLS)\..\..\VC\redist\$(Platform)\Microsoft.VC140. - + From 3fce38c540681a736b7e5ca7611758f7bc159c9e Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 16 Mar 2017 19:56:56 -0700 Subject: [PATCH 0140/2287] bpo-29820: othergui.rst: Remove outdated information (GH-685) (GH-688) (cherry picked from commit 1bb0f3762ec5104014aeed0ae6e9d64598d8fcac) --- Doc/library/othergui.rst | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/Doc/library/othergui.rst b/Doc/library/othergui.rst index ee1ce50b6bd5e1..d40abe167653b7 100644 --- a/Doc/library/othergui.rst +++ b/Doc/library/othergui.rst @@ -9,14 +9,15 @@ available for Python: .. seealso:: `PyGObject `_ - provides introspection bindings for C libraries using + PyGObject provides introspection bindings for C libraries using `GObject `_. One of these libraries is the `GTK+ 3 `_ widget set. GTK+ comes with many more widgets than Tkinter provides. An online `Python GTK+ 3 Tutorial `_ is available. - `PyGTK `_ provides bindings for an older version + `PyGTK `_ + PyGTK provides bindings for an older version of the library, GTK+ 2. It provides an object oriented interface that is slightly higher level than the C one. There are also bindings to `GNOME `_. An online `tutorial @@ -27,15 +28,10 @@ available for Python: extensive C++ GUI application development framework that is available for Unix, Windows and Mac OS X. :program:`sip` is a tool for generating bindings for C++ libraries as Python classes, and - is specifically designed for Python. The *PyQt3* bindings have a - book, `GUI Programming with Python: QT Edition - `_ by Boudewijn - Rempt. The *PyQt4* bindings also have a book, `Rapid GUI Programming - with Python and Qt `_, by Mark - Summerfield. + is specifically designed for Python. `PySide `_ - is a newer binding to the Qt toolkit, provided by Nokia. + PySide is a newer binding to the Qt toolkit, provided by Nokia. Compared to PyQt, its licensing scheme is friendlier to non-open source applications. @@ -49,9 +45,7 @@ available for Python: documentation and context sensitive help, printing, HTML viewing, low-level device context drawing, drag and drop, system clipboard access, an XML-based resource format and more, including an ever growing library - of user-contributed modules. wxPython has a book, `wxPython in Action - `_, by Noel Rappin and - Robin Dunn. + of user-contributed modules. PyGTK, PyQt, and wxPython, all have a modern look and feel and more widgets than Tkinter. In addition, there are many other GUI toolkits for From 4ac01f0ff3e3c9c02f5cc8c55f2fbe4639808f5e Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 16 Mar 2017 20:58:42 -0700 Subject: [PATCH 0141/2287] update test_socket AEAD test for kernel 4.9 and up (GH-133) (GH-548) (cherry picked from commit 9764c151c51480a7ca6042b1ccd69be2620ff360) --- Lib/test/test_socket.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 5315d475df2218..1508f20c9f0598 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -5479,7 +5479,7 @@ def test_aes_cbc(self): self.assertEqual(len(dec), msglen * multiplier) self.assertEqual(dec, msg * multiplier) - @support.requires_linux_version(4, 3) # see test_aes_cbc + @support.requires_linux_version(4, 9) # see issue29324 def test_aead_aes_gcm(self): key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c') iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2') @@ -5502,8 +5502,7 @@ def test_aead_aes_gcm(self): op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv, assoclen=assoclen, flags=socket.MSG_MORE) op.sendall(assoc, socket.MSG_MORE) - op.sendall(plain, socket.MSG_MORE) - op.sendall(b'\x00' * taglen) + op.sendall(plain) res = op.recv(assoclen + len(plain) + taglen) self.assertEqual(expected_ct, res[assoclen:-taglen]) self.assertEqual(expected_tag, res[-taglen:]) @@ -5511,7 +5510,7 @@ def test_aead_aes_gcm(self): # now with msg op, _ = algo.accept() with op: - msg = assoc + plain + b'\x00' * taglen + msg = assoc + plain op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv, assoclen=assoclen) res = op.recv(assoclen + len(plain) + taglen) @@ -5522,7 +5521,7 @@ def test_aead_aes_gcm(self): pack_uint32 = struct.Struct('I').pack op, _ = algo.accept() with op: - msg = assoc + plain + b'\x00' * taglen + msg = assoc + plain op.sendmsg( [msg], ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)], @@ -5530,7 +5529,7 @@ def test_aead_aes_gcm(self): [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)], ) ) - res = op.recv(len(msg)) + res = op.recv(len(msg) + taglen) self.assertEqual(expected_ct, res[assoclen:-taglen]) self.assertEqual(expected_tag, res[-taglen:]) @@ -5540,8 +5539,8 @@ def test_aead_aes_gcm(self): msg = assoc + expected_ct + expected_tag op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv, assoclen=assoclen) - res = op.recv(len(msg)) - self.assertEqual(plain, res[assoclen:-taglen]) + res = op.recv(len(msg) - taglen) + self.assertEqual(plain, res[assoclen:]) @support.requires_linux_version(4, 3) # see test_aes_cbc def test_drbg_pr_sha256(self): From 7c2081122c2a6b8ea27c3111da7f19f7824fe18a Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 16 Mar 2017 20:59:36 -0700 Subject: [PATCH 0142/2287] Add sockaddr_alg to sock_addr_t (GH-234) (GH-533) (cherry picked from commit d37c068e695f8ec72b5c1b5a5a5ece2337fda768) --- Modules/socketmodule.c | 30 ------------------------------ Modules/socketmodule.h | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index f4edc062fd6539..f3654c97e76ce9 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -288,36 +288,6 @@ if_indextoname(index) -- return the corresponding interface name\n\ #include #endif -#ifdef HAVE_SOCKADDR_ALG -#include -#ifndef AF_ALG -#define AF_ALG 38 -#endif -#ifndef SOL_ALG -#define SOL_ALG 279 -#endif - -/* Linux 3.19 */ -#ifndef ALG_SET_AEAD_ASSOCLEN -#define ALG_SET_AEAD_ASSOCLEN 4 -#endif -#ifndef ALG_SET_AEAD_AUTHSIZE -#define ALG_SET_AEAD_AUTHSIZE 5 -#endif -/* Linux 4.8 */ -#ifndef ALG_SET_PUBKEY -#define ALG_SET_PUBKEY 6 -#endif - -#ifndef ALG_OP_SIGN -#define ALG_OP_SIGN 2 -#endif -#ifndef ALG_OP_VERIFY -#define ALG_OP_VERIFY 3 -#endif - -#endif /* HAVE_SOCKADDR_ALG */ - /* Generic socket object definitions and includes */ #define PySocket_BUILDING_SOCKET #include "socketmodule.h" diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h index 3cce927e0b35f0..03f982b91083f3 100644 --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -98,6 +98,37 @@ typedef int socklen_t; #include #endif +#ifdef HAVE_SOCKADDR_ALG +#include +#ifndef AF_ALG +#define AF_ALG 38 +#endif +#ifndef SOL_ALG +#define SOL_ALG 279 +#endif + +/* Linux 3.19 */ +#ifndef ALG_SET_AEAD_ASSOCLEN +#define ALG_SET_AEAD_ASSOCLEN 4 +#endif +#ifndef ALG_SET_AEAD_AUTHSIZE +#define ALG_SET_AEAD_AUTHSIZE 5 +#endif +/* Linux 4.8 */ +#ifndef ALG_SET_PUBKEY +#define ALG_SET_PUBKEY 6 +#endif + +#ifndef ALG_OP_SIGN +#define ALG_OP_SIGN 2 +#endif +#ifndef ALG_OP_VERIFY +#define ALG_OP_VERIFY 3 +#endif + +#endif /* HAVE_SOCKADDR_ALG */ + + #ifndef Py__SOCKET_H #define Py__SOCKET_H #ifdef __cplusplus @@ -159,6 +190,9 @@ typedef union sock_addr { #ifdef HAVE_SYS_KERN_CONTROL_H struct sockaddr_ctl ctl; #endif +#ifdef HAVE_SOCKADDR_ALG + struct sockaddr_alg alg; +#endif } sock_addr_t; /* The object holding a socket. It holds some extra information, From 948171bf999cf8b3e12048851041d2e04ae3a78c Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Fri, 17 Mar 2017 14:59:16 +0300 Subject: [PATCH 0143/2287] bpo-16355: Clarify when inspect.getcomments() returns None (#428) (#690) Initial patch by Vajrasky Kok. (cherry picked from commit 3f2155ffe683080f2a1b28408fa48d43ba92f943) --- Doc/library/inspect.rst | 4 +++- Lib/test/test_inspect.py | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index 3fa44a0c99891c..4ff2187b45f8eb 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -442,7 +442,9 @@ Retrieving source code Return in a single string any lines of comments immediately preceding the object's source code (for a class, function, or method), or at the top of the - Python source file (if the object is a module). + Python source file (if the object is a module). If the object's source code + is unavailable, return ``None``. This could happen if the object has been + defined in C or the interactive shell. .. function:: getfile(object) diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 88eaabe6765ab2..cfea281c70db11 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -387,6 +387,11 @@ def test_cleandoc(self): def test_getcomments(self): self.assertEqual(inspect.getcomments(mod), '# line 1\n') self.assertEqual(inspect.getcomments(mod.StupidGit), '# line 20\n') + # If the object source file is not available, return None. + co = compile('x=1', '_non_existing_filename.py', 'exec') + self.assertIsNone(inspect.getcomments(co)) + # If the object has been defined in C, return None. + self.assertIsNone(inspect.getcomments(list)) def test_getmodule(self): # Check actual module From 46e81d3345b979f835740a228857906dca0f59c0 Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Fri, 17 Mar 2017 19:52:56 +0000 Subject: [PATCH 0144/2287] bpo-29808: Do not fail in SysLogHandler constructor if syslog isn't available. (#696) bpo-29808: SysLogHandler: Do not fail if initial connect to syslog failed. (cherry picked from commit 1b038e073807ecb6fd176edaf3386a8e3205416e) --- Lib/logging/handlers.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index 7d779734f37b0d..2356f8d3d2d8ce 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -815,7 +815,14 @@ def __init__(self, address=('localhost', SYSLOG_UDP_PORT), if isinstance(address, str): self.unixsocket = True - self._connect_unixsocket(address) + # Syslog server may be unavailable during handler initialisation. + # C's openlog() function also ignores connection errors. + # Moreover, we ignore these errors while logging, so it not worse + # to ignore it also here. + try: + self._connect_unixsocket(address) + except OSError: + pass else: self.unixsocket = False if socktype is None: From 49fc153342f98e0d4ae5a96b88f3e91e4c5861d7 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 17 Mar 2017 15:41:35 -0700 Subject: [PATCH 0145/2287] Combine the C++ header CI build into the main C build (GH-697) (GH-704) This will eliminate one of the builds in Travis, allowing for CI overall to complete faster. (cherry picked from commit 993d4b3440f2282976901ce66879037c4443868a) --- .travis.yml | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 27b63c6c08b376..36961e38790a4d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -64,15 +64,6 @@ matrix: # Make the `coverage` command available to Codecov w/ a version of Python that can parse all source files. - source ./venv/bin/activate - bash <(curl -s https://codecov.io/bash) - - os: linux - language: cpp - compiler: clang - env: - - TESTING="C++ header compatibility" - before_script: - - ./configure - script: - - echo '#include "Python.h"' > test.cc && $CXX -c test.cc -o /dev/null -I ./Include -I . # Travis provides only 2 cores, so don't overdue the parallelism and waste memory. before_script: @@ -88,6 +79,8 @@ before_script: script: # `-r -w` implicitly provided through `make buildbottest`. - make buildbottest TESTOPTS="-j4" + # Test for C++ header compatibility. + - echo '#include "Python.h"' > test.cc && $CXX -c test.cc -o /dev/null -I ./Include -I . notifications: email: false From b044120f048571030552eefab8ba2329a9e76ceb Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Sun, 19 Mar 2017 10:03:39 -0700 Subject: [PATCH 0146/2287] Drop C++ header compatibility test (#718) (#719) The $CXX environment variable is not exported under the 'c' language on Travis. (cherry picked from commit 77ed11552da3e01dd235b7d68988076866b1f604) --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 36961e38790a4d..66f03dc7161a7f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -79,8 +79,6 @@ before_script: script: # `-r -w` implicitly provided through `make buildbottest`. - make buildbottest TESTOPTS="-j4" - # Test for C++ header compatibility. - - echo '#include "Python.h"' > test.cc && $CXX -c test.cc -o /dev/null -I ./Include -I . notifications: email: false From 69eab3123ed1de4bed4b7dedecabe415f6139bb6 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 19 Mar 2017 20:26:26 +0200 Subject: [PATCH 0147/2287] bpo-28749: Fixed the documentation of the mapping codec APIs. (#487) (#714) Added the documentation for PyUnicode_Translate(). (cherry picked from commit c85a26628ceb9624c96c3064e8b99033c026d8a3) --- Doc/c-api/unicode.rst | 95 +++++++++++++++++++++-------------------- Include/unicodeobject.h | 45 ++++++++----------- 2 files changed, 66 insertions(+), 74 deletions(-) diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 02f7ada7be7ee4..6e91576ee8f004 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -1393,77 +1393,78 @@ Character Map Codecs This codec is special in that it can be used to implement many different codecs (and this is in fact what was done to obtain most of the standard codecs included in the :mod:`encodings` package). The codec uses mapping to encode and -decode characters. - -Decoding mappings must map single string characters to single Unicode -characters, integers (which are then interpreted as Unicode ordinals) or ``None`` -(meaning "undefined mapping" and causing an error). - -Encoding mappings must map single Unicode characters to single string -characters, integers (which are then interpreted as Latin-1 ordinals) or ``None`` -(meaning "undefined mapping" and causing an error). - -The mapping objects provided must only support the __getitem__ mapping -interface. - -If a character lookup fails with a LookupError, the character is copied as-is -meaning that its ordinal value will be interpreted as Unicode or Latin-1 ordinal -resp. Because of this, mappings only need to contain those mappings which map -characters to different code points. +decode characters. The mapping objects provided must support the +:meth:`__getitem__` mapping interface; dictionaries and sequences work well. These are the mapping codec APIs: -.. c:function:: PyObject* PyUnicode_DecodeCharmap(const char *s, Py_ssize_t size, \ +.. c:function:: PyObject* PyUnicode_DecodeCharmap(const char *data, Py_ssize_t size, \ PyObject *mapping, const char *errors) - Create a Unicode object by decoding *size* bytes of the encoded string *s* using - the given *mapping* object. Return *NULL* if an exception was raised by the - codec. If *mapping* is *NULL* latin-1 decoding will be done. Else it can be a - dictionary mapping byte or a unicode string, which is treated as a lookup table. - Byte values greater that the length of the string and U+FFFE "characters" are - treated as "undefined mapping". + Create a Unicode object by decoding *size* bytes of the encoded string *s* + using the given *mapping* object. Return *NULL* if an exception was raised + by the codec. + + If *mapping* is *NULL*, Latin-1 decoding will be applied. Else + *mapping* must map bytes ordinals (integers in the range from 0 to 255) + to Unicode strings, integers (which are then interpreted as Unicode + ordinals) or ``None``. Unmapped data bytes -- ones which cause a + :exc:`LookupError`, as well as ones which get mapped to ``None``, + ``0xFFFE`` or ``'\ufffe'``, are treated as undefined mappings and cause + an error. .. c:function:: PyObject* PyUnicode_AsCharmapString(PyObject *unicode, PyObject *mapping) - Encode a Unicode object using the given *mapping* object and return the result - as Python string object. Error handling is "strict". Return *NULL* if an + Encode a Unicode object using the given *mapping* object and return the + result as a bytes object. Error handling is "strict". Return *NULL* if an exception was raised by the codec. -The following codec API is special in that maps Unicode to Unicode. - + The *mapping* object must map Unicode ordinal integers to bytes objects, + integers in the range from 0 to 255 or ``None``. Unmapped character + ordinals (ones which cause a :exc:`LookupError`) as well as mapped to + ``None`` are treated as "undefined mapping" and cause an error. -.. c:function:: PyObject* PyUnicode_TranslateCharmap(const Py_UNICODE *s, Py_ssize_t size, \ - PyObject *table, const char *errors) - - Translate a :c:type:`Py_UNICODE` buffer of the given *size* by applying a - character mapping *table* to it and return the resulting Unicode object. Return - *NULL* when an exception was raised by the codec. - The *mapping* table must map Unicode ordinal integers to Unicode ordinal - integers or ``None`` (causing deletion of the character). +.. c:function:: PyObject* PyUnicode_EncodeCharmap(const Py_UNICODE *s, Py_ssize_t size, \ + PyObject *mapping, const char *errors) - Mapping tables need only provide the :meth:`__getitem__` interface; dictionaries - and sequences work well. Unmapped character ordinals (ones which cause a - :exc:`LookupError`) are left untouched and are copied as-is. + Encode the :c:type:`Py_UNICODE` buffer of the given *size* using the given + *mapping* object and return the result as a bytes object. Return *NULL* if + an exception was raised by the codec. .. deprecated-removed:: 3.3 4.0 Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using - :c:func:`PyUnicode_Translate`. or :ref:`generic codec based API - ` + :c:func:`PyUnicode_AsCharmapString` or + :c:func:`PyUnicode_AsEncodedString`. -.. c:function:: PyObject* PyUnicode_EncodeCharmap(const Py_UNICODE *s, Py_ssize_t size, \ +The following codec API is special in that maps Unicode to Unicode. + +.. c:function:: PyObject* PyUnicode_Translate(PyObject *unicode, \ PyObject *mapping, const char *errors) - Encode the :c:type:`Py_UNICODE` buffer of the given *size* using the given - *mapping* object and return a Python string object. Return *NULL* if an - exception was raised by the codec. + Translate a Unicode object using the given *mapping* object and return the + resulting Unicode object. Return *NULL* if an exception was raised by the + codec. + + The *mapping* object must map Unicode ordinal integers to Unicode strings, + integers (which are then interpreted as Unicode ordinals) or ``None`` + (causing deletion of the character). Unmapped character ordinals (ones + which cause a :exc:`LookupError`) are left untouched and are copied as-is. + + +.. c:function:: PyObject* PyUnicode_TranslateCharmap(const Py_UNICODE *s, Py_ssize_t size, \ + PyObject *mapping, const char *errors) + + Translate a :c:type:`Py_UNICODE` buffer of the given *size* by applying a + character *mapping* table to it and return the resulting Unicode object. + Return *NULL* when an exception was raised by the codec. .. deprecated-removed:: 3.3 4.0 Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using - :c:func:`PyUnicode_AsCharmapString` or - :c:func:`PyUnicode_AsEncodedString`. + :c:func:`PyUnicode_Translate`. or :ref:`generic codec based API + ` MBCS codecs for Windows diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index 587cf03e3697eb..2d0d77e804d9d8 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -1609,50 +1609,41 @@ PyAPI_FUNC(PyObject*) PyUnicode_EncodeASCII( This codec uses mappings to encode and decode characters. - Decoding mappings must map single string characters to single - Unicode characters, integers (which are then interpreted as Unicode - ordinals) or None (meaning "undefined mapping" and causing an - error). - - Encoding mappings must map single Unicode characters to single - string characters, integers (which are then interpreted as Latin-1 - ordinals) or None (meaning "undefined mapping" and causing an - error). - - If a character lookup fails with a LookupError, the character is - copied as-is meaning that its ordinal value will be interpreted as - Unicode or Latin-1 ordinal resp. Because of this mappings only need - to contain those mappings which map characters to different code - points. + Decoding mappings must map byte ordinals (integers in the range from 0 to + 255) to Unicode strings, integers (which are then interpreted as Unicode + ordinals) or None. Unmapped data bytes (ones which cause a LookupError) + as well as mapped to None, 0xFFFE or '\ufffe' are treated as "undefined + mapping" and cause an error. + + Encoding mappings must map Unicode ordinal integers to bytes objects, + integers in the range from 0 to 255 or None. Unmapped character + ordinals (ones which cause a LookupError) as well as mapped to + None are treated as "undefined mapping" and cause an error. */ PyAPI_FUNC(PyObject*) PyUnicode_DecodeCharmap( const char *string, /* Encoded string */ Py_ssize_t length, /* size of string */ - PyObject *mapping, /* character mapping - (char ordinal -> unicode ordinal) */ + PyObject *mapping, /* decoding mapping */ const char *errors /* error handling */ ); PyAPI_FUNC(PyObject*) PyUnicode_AsCharmapString( PyObject *unicode, /* Unicode object */ - PyObject *mapping /* character mapping - (unicode ordinal -> char ordinal) */ + PyObject *mapping /* encoding mapping */ ); #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject*) PyUnicode_EncodeCharmap( const Py_UNICODE *data, /* Unicode char buffer */ Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ - PyObject *mapping, /* character mapping - (unicode ordinal -> char ordinal) */ + PyObject *mapping, /* encoding mapping */ const char *errors /* error handling */ ); PyAPI_FUNC(PyObject*) _PyUnicode_EncodeCharmap( PyObject *unicode, /* Unicode object */ - PyObject *mapping, /* character mapping - (unicode ordinal -> char ordinal) */ + PyObject *mapping, /* encoding mapping */ const char *errors /* error handling */ ); #endif @@ -1661,8 +1652,8 @@ PyAPI_FUNC(PyObject*) _PyUnicode_EncodeCharmap( character mapping table to it and return the resulting Unicode object. - The mapping table must map Unicode ordinal integers to Unicode - ordinal integers or None (causing deletion of the character). + The mapping table must map Unicode ordinal integers to Unicode strings, + Unicode ordinal integers or None (causing deletion of the character). Mapping tables may be dictionaries or sequences. Unmapped character ordinals (ones which cause a LookupError) are left untouched and @@ -1960,8 +1951,8 @@ PyAPI_FUNC(PyObject*) PyUnicode_RSplit( /* Translate a string by applying a character mapping table to it and return the resulting Unicode object. - The mapping table must map Unicode ordinal integers to Unicode - ordinal integers or None (causing deletion of the character). + The mapping table must map Unicode ordinal integers to Unicode strings, + Unicode ordinal integers or None (causing deletion of the character). Mapping tables may be dictionaries or sequences. Unmapped character ordinals (ones which cause a LookupError) are left untouched and From fca705d533970011e50b3f278aab81cead39b00d Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 19 Mar 2017 20:27:16 +0200 Subject: [PATCH 0148/2287] bpo-25455: Fixed crashes in repr of recursive buffered file-like objects. (#514) (#722) (cherry picked from commit a5af6e1af77ee0f9294c5776478a9c24d9fbab94) --- Lib/test/test_fileio.py | 8 +- Lib/test/test_io.py | 20 + Misc/NEWS | 800 +++++++++++++++++++++++++++++++++++++++ Modules/_io/bufferedio.c | 14 +- Modules/_io/fileio.c | 16 +- Modules/_io/textio.c | 23 +- 6 files changed, 872 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py index 3da210ae1997ad..57a02656206ff4 100644 --- a/Lib/test/test_fileio.py +++ b/Lib/test/test_fileio.py @@ -10,7 +10,7 @@ from functools import wraps from test.support import (TESTFN, TESTFN_UNICODE, check_warnings, run_unittest, - make_bad_fd, cpython_only) + make_bad_fd, cpython_only, swap_attr) from collections import UserList import _io # C implementation of io @@ -176,6 +176,12 @@ def testReprNoCloseFD(self): finally: os.close(fd) + def testRecursiveRepr(self): + # Issue #25455 + with swap_attr(self.f, 'name', self.f): + with self.assertRaises(RuntimeError): + repr(self.f) # Should not crash + def testErrors(self): f = self.f self.assertFalse(f.isatty()) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index aaa64eadffe1ea..8f895fe0bfb885 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -1014,6 +1014,16 @@ def test_repr(self): raw.name = b"dummy" self.assertEqual(repr(b), "<%s name=b'dummy'>" % clsname) + def test_recursive_repr(self): + # Issue #25455 + raw = self.MockRawIO() + b = self.tp(raw) + with support.swap_attr(raw, 'name', b): + try: + repr(b) # Should not crash + except RuntimeError: + pass + def test_flush_error_on_close(self): # Test that buffered file is closed despite failed flush # and that flush() is called before file closed. @@ -2424,6 +2434,16 @@ def test_repr(self): t.buffer.detach() repr(t) # Should not raise an exception + def test_recursive_repr(self): + # Issue #25455 + raw = self.BytesIO() + t = self.TextIOWrapper(raw) + with support.swap_attr(raw, 'name', t): + try: + repr(t) # Should not crash + except RuntimeError: + pass + def test_line_buffering(self): r = self.BytesIO() b = self.BufferedWriter(r, 1000) diff --git a/Misc/NEWS b/Misc/NEWS index 03f70dc885d818..310e982d78f03a 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -25,6 +25,806 @@ Core and Builtins - bpo-29714: Fix a regression that bytes format may fail when containing zero bytes inside. +- bpo-29568: Escaped percent "%%" in the format string for classic string + formatting no longer allows any characters between two percents. + +- bpo-29714: Fix a regression that bytes format may fail when containing zero + bytes inside. + +- bpo-29695: bool(), float(), list() and tuple() no longer take keyword arguments. + The first argument of int() can now be passes only as positional argument. + +- bpo-20087: Prefer glibc's list of locale aliases to the X11 ones. + +- bpo-28893: Set correct __cause__ for errors about invalid awaitables + returned from __aiter__ and __anext__. + +- bpo-29683: Fixes to memory allocation in _PyCode_SetExtra. Patch by + Brian Coleman. + +- bpo-29684: Fix minor regression of PyEval_CallObjectWithKeywords. + It should raise TypeError when kwargs is not a dict. But it might + cause segv when args=NULL and kwargs is not a dict. + +- bpo-28598: Support __rmod__ for subclasses of str being called before + str.__mod__. Patch by Martijn Pieters. + +- bpo-29607: Fix stack_effect computation for CALL_FUNCTION_EX. + Patch by Matthieu Dartiailh. + +- bpo-29602: Fix incorrect handling of signed zeros in complex constructor for + complex subclasses and for inputs having a __complex__ method. Patch + by Serhiy Storchaka. + +- bpo-29347: Fixed possibly dereferencing undefined pointers + when creating weakref objects. + +- bpo-29463: Add ``docstring`` field to Module, ClassDef, FunctionDef, + and AsyncFunctionDef ast nodes. docstring is not first stmt in their body + anymore. It affects ``co_firstlineno`` and ``co_lnotab`` of code object + for module and class. + +- bpo-29438: Fixed use-after-free problem in key sharing dict. + +- bpo-29546: Set the 'path' and 'name' attribute on ImportError for ``from ... import ...``. + +- bpo-29546: Improve from-import error message with location + +- Issue #29319: Prevent RunMainFromImporter overwriting sys.path[0]. + +- Issue #29337: Fixed possible BytesWarning when compare the code objects. + Warnings could be emitted at compile time. + +- Issue #29327: Fixed a crash when pass the iterable keyword argument to + sorted(). + +- Issue #29034: Fix memory leak and use-after-free in os module (path_converter). + +- Issue #29159: Fix regression in bytes(x) when x.__index__() raises Exception. + +- Issue #29049: Call _PyObject_GC_TRACK() lazily when calling Python function. + Calling function is up to 5% faster. + +- Issue #28927: bytes.fromhex() and bytearray.fromhex() now ignore all ASCII + whitespace, not only spaces. Patch by Robert Xiao. + +- Issue #28932: Do not include if it does not exist. + +- Issue #25677: Correct the positioning of the syntax error caret for + indented blocks. Based on patch by Michael Layzell. + +- Issue #29000: Fixed bytes formatting of octals with zero padding in alternate + form. + +- Issue #18896: Python function can now have more than 255 parameters. + collections.namedtuple() now supports tuples with more than 255 elements. + +- Issue #28596: The preferred encoding is UTF-8 on Android. Patch written by + Chi Hsuan Yen. + +- Issue #26919: On Android, operating system data is now always encoded/decoded + to/from UTF-8, instead of the locale encoding to avoid inconsistencies with + os.fsencode() and os.fsdecode() which are already using UTF-8. + +- Issue #28991: functools.lru_cache() was susceptible to an obscure reentrancy + bug triggerable by a monkey-patched len() function. + +- Issue #28147: Fix a memory leak in split-table dictionaries: setattr() + must not convert combined table into split table. Patch written by INADA + Naoki. + +- Issue #28739: f-string expressions are no longer accepted as docstrings and + by ast.literal_eval() even if they do not include expressions. + +- Issue #28512: Fixed setting the offset attribute of SyntaxError by + PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject(). + +- Issue #28918: Fix the cross compilation of xxlimited when Python has been + built with Py_DEBUG defined. + +- Issue #23722: Rather than silently producing a class that doesn't support + zero-argument ``super()`` in methods, failing to pass the new + ``__classcell__`` namespace entry up to ``type.__new__`` now results in a + ``DeprecationWarning`` and a class that supports zero-argument ``super()``. + +- Issue #28797: Modifying the class __dict__ inside the __set_name__ method of + a descriptor that is used inside that class no longer prevents calling the + __set_name__ method of other descriptors. + +- Issue #28799: Remove the ``PyEval_GetCallStats()`` function and deprecate + the untested and undocumented ``sys.callstats()`` function. Remove the + ``CALL_PROFILE`` special build: use the :func:`sys.setprofile` function, + :mod:`cProfile` or :mod:`profile` to profile function calls. + +- Issue #12844: More than 255 arguments can now be passed to a function. + +- Issue #28782: Fix a bug in the implementation ``yield from`` when checking + if the next instruction is YIELD_FROM. Regression introduced by WORDCODE + (issue #26647). + +- Issue #28774: Fix error position of the unicode error in ASCII and Latin1 + encoders when a string returned by the error handler contains multiple + non-encodable characters (non-ASCII for the ASCII codec, characters out + of the U+0000-U+00FF range for Latin1). + +- Issue #28731: Optimize _PyDict_NewPresized() to create correct size dict. + Improve speed of dict literal with constant keys up to 30%. + +- Issue #28532: Show sys.version when -V option is supplied twice. + +- Issue #27100: The with-statement now checks for __enter__ before it + checks for __exit__. This gives less confusing error messages when + both methods are missing. Patch by Jonathan Ellington. + +- Issue #28746: Fix the set_inheritable() file descriptor method on platforms + that do not have the ioctl FIOCLEX and FIONCLEX commands. + +- Issue #26920: Fix not getting the locale's charset upon initializing the + interpreter, on platforms that do not have langinfo. + +- Issue #28648: Fixed crash in Py_DecodeLocale() in debug build on Mac OS X + when decode astral characters. Patch by Xiang Zhang. + +- Issue #28665: Improve speed of the STORE_DEREF opcode by 40%. + +- Issue #19398: Extra slash no longer added to sys.path components in case of + empty compile-time PYTHONPATH components. + +- Issue #28621: Sped up converting int to float by reusing faster bits counting + implementation. Patch by Adrian Wielgosik. + +- Issue #28580: Optimize iterating split table values. + Patch by Xiang Zhang. + +- Issue #28583: PyDict_SetDefault didn't combine split table when needed. + Patch by Xiang Zhang. + +- Issue #28128: Deprecation warning for invalid str and byte escape + sequences now prints better information about where the error + occurs. Patch by Serhiy Storchaka and Eric Smith. + +- Issue #28509: dict.update() no longer allocate unnecessary large memory. + +- Issue #28426: Fixed potential crash in PyUnicode_AsDecodedObject() in debug + build. + +- Issue #28517: Fixed of-by-one error in the peephole optimizer that caused + keeping unreachable code. + +- Issue #28214: Improved exception reporting for problematic __set_name__ + attributes. + +- Issue #23782: Fixed possible memory leak in _PyTraceback_Add() and exception + loss in PyTraceBack_Here(). + +- Issue #28183: Optimize and cleanup dict iteration. + +- Issue #26081: Added C implementation of asyncio.Future. + Original patch by Yury Selivanov. + +- Issue #28379: Added sanity checks and tests for PyUnicode_CopyCharacters(). + Patch by Xiang Zhang. + +- Issue #28376: The type of long range iterator is now registered as Iterator. + Patch by Oren Milman. + +- Issue #28376: Creating instances of range_iterator by calling range_iterator + type now is disallowed. Calling iter() on range instance is the only way. + Patch by Oren Milman. + +- Issue #26906: Resolving special methods of uninitialized type now causes + implicit initialization of the type instead of a fail. + +- Issue #18287: PyType_Ready() now checks that tp_name is not NULL. + Original patch by Niklas Koep. + +- Issue #24098: Fixed possible crash when AST is changed in process of + compiling it. + +- Issue #28201: Dict reduces possibility of 2nd conflict in hash table when + hashes have same lower bits. + +- Issue #28350: String constants with null character no longer interned. + +- Issue #26617: Fix crash when GC runs during weakref callbacks. + +- Issue #27942: String constants now interned recursively in tuples and frozensets. + +- Issue #28289: ImportError.__init__ now resets not specified attributes. + +- Issue #21578: Fixed misleading error message when ImportError called with + invalid keyword args. + +- Issue #28203: Fix incorrect type in complex(1.0, {2:3}) error message. + Patch by Soumya Sharma. + +- Issue #28086: Single var-positional argument of tuple subtype was passed + unscathed to the C-defined function. Now it is converted to exact tuple. + +- Issue #28214: Now __set_name__ is looked up on the class instead of the + instance. + +- Issue #27955: Fallback on reading /dev/urandom device when the getrandom() + syscall fails with EPERM, for example when blocked by SECCOMP. + +- Issue #28192: Don't import readline in isolated mode. + +- Issue #27441: Remove some redundant assignments to ob_size in longobject.c. + Thanks Oren Milman. + +- Issue #27222: Clean up redundant code in long_rshift function. Thanks + Oren Milman. + +- Upgrade internal unicode databases to Unicode version 9.0.0. + +- Issue #28131: Fix a regression in zipimport's compile_source(). zipimport + should use the same optimization level as the interpreter. + +- Issue #28126: Replace Py_MEMCPY with memcpy(). Visual Studio can properly + optimize memcpy(). + +- Issue #28120: Fix dict.pop() for splitted dictionary when trying to remove a + "pending key" (Not yet inserted in split-table). Patch by Xiang Zhang. + +- Issue #26182: Raise DeprecationWarning when async and await keywords are + used as variable/attribute/class/function name. + +- Issue #26182: Fix a refleak in code that raises DeprecationWarning. + +- Issue #28721: Fix asynchronous generators aclose() and athrow() to + handle StopAsyncIteration propagation properly. + +- Issue #26110: Speed-up method calls: add LOAD_METHOD and CALL_METHOD + opcodes. + +Extension Modules +----------------- + +- Issue #29169: Update zlib to 1.2.11. + +Library +------- + +- bpo-25455: Fixed crashes in repr of recursive buffered file-like objects. + +- bpo-29800: Fix crashes in partial.__repr__ if the keys of partial.keywords + are not strings. Patch by Michael Seifert. + +- bpo-8256: Fixed possible failing or crashing input() if attributes "encoding" + or "errors" of sys.stdin or sys.stdout are not set or are not strings. + +- bpo-28692: Using non-integer value for selecting a plural form in gettext is + now deprecated. + +- bpo-26121: Use C library implementation for math functions erf() and erfc(). + +- bpo-29619: os.stat() and os.DirEntry.inode() now convert inode (st_ino) using + unsigned integers. + +- bpo-28298: Fix a bug that prevented array 'Q', 'L' and 'I' from accepting big + intables (objects that have __int__) as elements. + +- bpo-29645: Speed up importing the webbrowser module. webbrowser.register() + is now thread-safe. + +- bpo-28231: The zipfile module now accepts path-like objects for external + paths. + +- bpo-26915: index() and count() methods of collections.abc.Sequence now + check identity before checking equality when do comparisons. + +- bpo-28682: Added support for bytes paths in os.fwalk(). + +- bpo-29623: Allow use of path-like object as a single argument in + ConfigParser.read(). Patch by David Ellis. + +- bpo-9303: Migrate sqlite3 module to _v2 API. Patch by Aviv Palivoda. + +- bpo-28963: Fix out of bound iteration in asyncio.Future.remove_done_callback + implemented in C. + +- bpo-29704: asyncio.subprocess.SubprocessStreamProtocol no longer closes before + all pipes are closed. + +- bpo-29271: Fix Task.current_task and Task.all_tasks implemented in C + to accept None argument as their pure Python implementation. + +- bpo-29703: Fix asyncio to support instantiation of new event loops + in child processes. + +- bpo-29615: SimpleXMLRPCDispatcher no longer chains KeyError (or any other + exception) to exception(s) raised in the dispatched methods. + Patch by Petr Motejlek. + +- bpo-7769: Method register_function() of xmlrpc.server.SimpleXMLRPCDispatcher + and its subclasses can now be used as a decorator. + +- bpo-29376: Fix assertion error in threading._DummyThread.is_alive(). + +- bpo-28624: Add a test that checks that cwd parameter of Popen() accepts + PathLike objects. Patch by Sayan Chowdhury. + +- bpo-28518: Start a transaction implicitly before a DML statement. + Patch by Aviv Palivoda. + +- bpo-29742: get_extra_info() raises exception if get called on closed ssl transport. + Patch by Nikolay Kim. + +- Issue #16285: urrlib.parse.quote is now based on RFC 3986 and hence includes + '~' in the set of characters that is not quoted by default. Patch by + Christian Theune and Ratnadeep Debnath. + +- bpo-29532: Altering a kwarg dictionary passed to functools.partial() + no longer affects a partial object after creation. + +- bpo-29110: Fix file object leak in aifc.open() when file is given as a + filesystem path and is not in valid AIFF format. Patch by Anthony Zhang. + +- bpo-22807: Add uuid.SafeUUID and uuid.UUID.is_safe to relay information from + the platform about whether generated UUIDs are generated with a + multiprocessing safe method. + +- bpo-29576: Improve some deprecations in importlib. Some deprecated methods + now emit DeprecationWarnings and have better descriptive messages. + +- bpo-29534: Fixed different behaviour of Decimal.from_float() + for _decimal and _pydecimal. Thanks Andrew Nester. + +- Issue #28556: Various updates to typing module: typing.Counter, typing.ChainMap, + improved ABC caching, etc. Original PRs by Jelle Zijlstra, Ivan Levkivskyi, + Manuel Krebber, and Łukasz Langa. + +- Issue #29100: Fix datetime.fromtimestamp() regression introduced in Python + 3.6.0: check minimum and maximum years. + +- Issue #29416: Prevent infinite loop in pathlib.Path.mkdir + +- Issue #29444: Fixed out-of-bounds buffer access in the group() method of + the match object. Based on patch by WGH. + +- Issue #29377: Add SlotWrapperType, MethodWrapperType, and + MethodDescriptorType built-in types to types module. + Original patch by Manuel Krebber. + +- Issue #29218: Unused install_misc command is now removed. It has been + documented as unused since 2000. Patch by Eric N. Vander Weele. + +- Issue #29368: The extend() method is now called instead of the append() + method when unpickle collections.deque and other list-like objects. + This can speed up unpickling to 2 times. + +- Issue #29338: The help of a builtin or extension class now includes the + constructor signature if __text_signature__ is provided for the class. + +- Issue #29335: Fix subprocess.Popen.wait() when the child process has + exited to a stopped instead of terminated state (ex: when under ptrace). + +- Issue #29290: Fix a regression in argparse that help messages would wrap at + non-breaking spaces. + +- Issue #28735: Fixed the comparison of mock.MagickMock with mock.ANY. + +- Issue #29197: Removed deprecated function ntpath.splitunc(). + +- Issue #29210: Removed support of deprecated argument "exclude" in + tarfile.TarFile.add(). + +- Issue #29219: Fixed infinite recursion in the repr of uninitialized + ctypes.CDLL instances. + +- Issue #29192: Removed deprecated features in the http.cookies module. + +- Issue #29193: A format string argument for string.Formatter.format() + is now positional-only. + +- Issue #29195: Removed support of deprecated undocumented keyword arguments + in methods of regular expression objects. + +- Issue #28969: Fixed race condition in C implementation of functools.lru_cache. + KeyError could be raised when cached function with full cache was + simultaneously called from differen threads with the same uncached arguments. + +- Issue #20804: The unittest.mock.sentinel attributes now preserve their + identity when they are copied or pickled. + +- Issue #29142: In urllib.request, suffixes in no_proxy environment variable with + leading dots could match related hostnames again (e.g. .b.c matches a.b.c). + Patch by Milan Oberkirch. + +- Issue #28961: Fix unittest.mock._Call helper: don't ignore the name parameter + anymore. Patch written by Jiajun Huang. + +- Issue #15812: inspect.getframeinfo() now correctly shows the first line of + a context. Patch by Sam Breese. + +- Issue #28985: Update authorizer constants in sqlite3 module. + Patch by Dingyuan Wang. + +- Issue #29094: Offsets in a ZIP file created with extern file object and modes + "w" and "x" now are relative to the start of the file. + +- Issue #29079: Prevent infinite loop in pathlib.resolve() on Windows + +- Issue #13051: Fixed recursion errors in large or resized + curses.textpad.Textbox. Based on patch by Tycho Andersen. + +- Issue #9770: curses.ascii predicates now work correctly with negative + integers. + +- Issue #28427: old keys should not remove new values from + WeakValueDictionary when collecting from another thread. + +- Issue 28923: Remove editor artifacts from Tix.py. + +- Issue #28871: Fixed a crash when deallocate deep ElementTree. + +- Issue #19542: Fix bugs in WeakValueDictionary.setdefault() and + WeakValueDictionary.pop() when a GC collection happens in another + thread. + +- Issue #20191: Fixed a crash in resource.prlimit() when passing a sequence that + doesn't own its elements as limits. + +- Issue #16255: subprocess.Popen uses /system/bin/sh on Android as the shell, + instead of /bin/sh. + +- Issue #28779: multiprocessing.set_forkserver_preload() would crash the + forkserver process if a preloaded module instantiated some + multiprocessing objects such as locks. + +- Issue #26937: The chown() method of the tarfile.TarFile class does not fail + now when the grp module cannot be imported, as for example on Android + platforms. + +- Issue #28847: dbm.dumb now supports reading read-only files and no longer + writes the index file when it is not changed. A deprecation warning is now + emitted if the index file is missed and recreated in the 'r' and 'w' modes + (will be an error in future Python releases). + +- Issue #27030: Unknown escapes consisting of ``'\'`` and an ASCII letter in + re.sub() replacement templates regular expressions now are errors. + +- Issue #28835: Fix a regression introduced in warnings.catch_warnings(): + call warnings.showwarning() if it was overriden inside the context manager. + +- Issue #27172: To assist with upgrades from 2.7, the previously documented + deprecation of ``inspect.getfullargspec()`` has been reversed. This decision + may be revisited again after the Python 2.7 branch is no longer officially + supported. + +- Issue #28740: Add sys.getandroidapilevel(): return the build time API version + of Android as an integer. Function only available on Android. + +- Issue #26273: Add new :data:`socket.TCP_CONGESTION` (Linux 2.6.13) and + :data:`socket.TCP_USER_TIMEOUT` (Linux 2.6.37) constants. Patch written by + Omar Sandoval. + +- Issue #28752: Restored the __reduce__() methods of datetime objects. + +- Issue #28727: Regular expression patterns, _sre.SRE_Pattern objects created + by re.compile(), become comparable (only x==y and x!=y operators). This + change should fix the issue #18383: don't duplicate warning filters when the + warnings module is reloaded (thing usually only done in unit tests). + +- Issue #20572: Remove the subprocess.Popen.wait endtime parameter. It was + deprecated in 3.4 and undocumented prior to that. + +- Issue #25659: In ctypes, prevent a crash calling the from_buffer() and + from_buffer_copy() methods on abstract classes like Array. + +- Issue #28548: In the "http.server" module, parse the protocol version if + possible, to avoid using HTTP 0.9 in some error responses. + +- Issue #19717: Makes Path.resolve() succeed on paths that do not exist. + Patch by Vajrasky Kok + +- Issue #28563: Fixed possible DoS and arbitrary code execution when handle + plural form selections in the gettext module. The expression parser now + supports exact syntax supported by GNU gettext. + +- Issue #28387: Fixed possible crash in _io.TextIOWrapper deallocator when + the garbage collector is invoked in other thread. Based on patch by + Sebastian Cufre. + +- Issue #27517: LZMA compressor and decompressor no longer raise exceptions if + given empty data twice. Patch by Benjamin Fogle. + +- Issue #28549: Fixed segfault in curses's addch() with ncurses6. + +- Issue #28449: tarfile.open() with mode "r" or "r:" now tries to open a tar + file with compression before trying to open it without compression. Otherwise + it had 50% chance failed with ignore_zeros=True. + +- Issue #23262: The webbrowser module now supports Firefox 36+ and derived + browsers. Based on patch by Oleg Broytman. + +- Issue #24241: The webbrowser in an X environment now prefers using the + default browser directly. Also, the webbrowser register() function now has + a documented 'preferred' argument, to specify browsers to be returned by + get() with no arguments. Patch by David Steele + +- Issue #27939: Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused + by representing the scale as float value internally in Tk. tkinter.IntVar + now works if float value is set to underlying Tk variable. + +- Issue #28255: calendar.TextCalendar.prweek() no longer prints a space after + a weeks's calendar. calendar.TextCalendar.pryear() no longer prints redundant + newline after a year's calendar. Based on patch by Xiang Zhang. + +- Issue #28255: calendar.TextCalendar.prmonth() no longer prints a space + at the start of new line after printing a month's calendar. Patch by + Xiang Zhang. + +- Issue #20491: The textwrap.TextWrapper class now honors non-breaking spaces. + Based on patch by Kaarle Ritvanen. + +- Issue #28353: os.fwalk() no longer fails on broken links. + +- Issue #28430: Fix iterator of C implemented asyncio.Future doesn't accept + non-None value is passed to it.send(val). + +- Issue #27025: Generated names for Tkinter widgets now start by the "!" prefix + for readability (was "`"). + +- Issue #25464: Fixed HList.header_exists() in tkinter.tix module by addin + a workaround to Tix library bug. + +- Issue #28488: shutil.make_archive() no longer adds entry "./" to ZIP archive. + +- Issue #25953: re.sub() now raises an error for invalid numerical group + reference in replacement template even if the pattern is not found in + the string. Error message for invalid group reference now includes the + group index and the position of the reference. + Based on patch by SilentGhost. + +- Issue #28469: timeit now uses the sequence 1, 2, 5, 10, 20, 50,... instead + of 1, 10, 100,... for autoranging. + +- Issue #28115: Command-line interface of the zipfile module now uses argparse. + Added support of long options. + +- Issue #18219: Optimize csv.DictWriter for large number of columns. + Patch by Mariatta Wijaya. + +- Issue #28448: Fix C implemented asyncio.Future didn't work on Windows. + +- Issue #23214: In the "io" module, the argument to BufferedReader and + BytesIO's read1() methods is now optional and can be -1, matching the + BufferedIOBase specification. + +- Issue #28480: Fix error building socket module when multithreading is + disabled. + +- Issue #28240: timeit: remove ``-c/--clock`` and ``-t/--time`` command line + options which were deprecated since Python 3.3. + +- Issue #28240: timeit now repeats the benchmarks 5 times instead of only 3 + to make benchmarks more reliable. + +- Issue #28240: timeit autorange now uses a single loop iteration if the + benchmark takes less than 10 seconds, instead of 10 iterations. + "python3 -m timeit -s 'import time' 'time.sleep(1)'" now takes 4 seconds + instead of 40 seconds. + +- Distutils.sdist now looks for README and setup.py files with case + sensitivity. This behavior matches that found in Setuptools 6.0 and + later. See `setuptools 100 + `_ for rationale. + +- Issue #24452: Make webbrowser support Chrome on Mac OS X. Patch by + Ned Batchelder. + +- Issue #20766: Fix references leaked by pdb in the handling of SIGINT + handlers. + +- Issue #27998: Fixed bytes path support in os.scandir() on Windows. + Patch by Eryk Sun. + +- Issue #28317: The disassembler now decodes FORMAT_VALUE argument. + +- Issue #26293: Fixed writing ZIP files that starts not from the start of the + file. Offsets in ZIP file now are relative to the start of the archive in + conforming to the specification. + +- Issue #28380: unittest.mock Mock autospec functions now properly support + assert_called, assert_not_called, and assert_called_once. + +- Issue #28229: lzma module now supports pathlib. + +- Issue #28321: Fixed writing non-BMP characters with binary format in plistlib. + +- Issue #28225: bz2 module now supports pathlib. Initial patch by Ethan Furman. + +- Issue #28227: gzip now supports pathlib. Patch by Ethan Furman. + +- Issue #28332: Deprecated silent truncations in socket.htons and socket.ntohs. + Original patch by Oren Milman. + +- Issue #27358: Optimized merging var-keyword arguments and improved error + message when passing a non-mapping as a var-keyword argument. + +- Issue #28257: Improved error message when passing a non-iterable as + a var-positional argument. Added opcode BUILD_TUPLE_UNPACK_WITH_CALL. + +- Issue #28322: Fixed possible crashes when unpickle itertools objects from + incorrect pickle data. Based on patch by John Leitch. + +- Issue #28228: imghdr now supports pathlib. + +- Issue #28226: compileall now supports pathlib. + +- Issue #28314: Fix function declaration (C flags) for the getiterator() method + of xml.etree.ElementTree.Element. + +- Issue #28148: Stop using localtime() and gmtime() in the time + module. + + Introduced platform independent _PyTime_localtime API that is + similar to POSIX localtime_r, but available on all platforms. Patch + by Ed Schouten. + +- Issue #28253: Fixed calendar functions for extreme months: 0001-01 + and 9999-12. + + Methods itermonthdays() and itermonthdays2() are reimplemented so + that they don't call itermonthdates() which can cause datetime.date + under/overflow. + +- Issue #28275: Fixed possible use after free in the decompress() + methods of the LZMADecompressor and BZ2Decompressor classes. + Original patch by John Leitch. + +- Issue #27897: Fixed possible crash in sqlite3.Connection.create_collation() + if pass invalid string-like object as a name. Patch by Xiang Zhang. + +- Issue #18844: random.choices() now has k as a keyword-only argument + to improve the readability of common cases and come into line + with the signature used in other languages. + +- Issue #18893: Fix invalid exception handling in Lib/ctypes/macholib/dyld.py. + Patch by Madison May. + +- Issue #27611: Fixed support of default root window in the tkinter.tix module. + Added the master parameter in the DisplayStyle constructor. + +- Issue #27348: In the traceback module, restore the formatting of exception + messages like "Exception: None". This fixes a regression introduced in + 3.5a2. + +- Issue #25651: Allow falsy values to be used for msg parameter of subTest(). + +- Issue #27778: Fix a memory leak in os.getrandom() when the getrandom() is + interrupted by a signal and a signal handler raises a Python exception. + +- Issue #28200: Fix memory leak on Windows in the os module (fix + path_converter() function). + +- Issue #25400: RobotFileParser now correctly returns default values for + crawl_delay and request_rate. Initial patch by Peter Wirtz. + +- Issue #27932: Prevent memory leak in win32_ver(). + +- Fix UnboundLocalError in socket._sendfile_use_sendfile. + +- Issue #28075: Check for ERROR_ACCESS_DENIED in Windows implementation of + os.stat(). Patch by Eryk Sun. + +- Issue #22493: Warning message emitted by using inline flags in the middle of + regular expression now contains a (truncated) regex pattern. + Patch by Tim Graham. + +- Issue #25270: Prevent codecs.escape_encode() from raising SystemError when + an empty bytestring is passed. + +- Issue #28181: Get antigravity over HTTPS. Patch by Kaartic Sivaraam. + +- Issue #25895: Enable WebSocket URL schemes in urllib.parse.urljoin. + Patch by Gergely Imreh and Markus Holtermann. + +- Issue #28114: Fix a crash in parse_envlist() when env contains byte strings. + Patch by Eryk Sun. + +- Issue #27599: Fixed buffer overrun in binascii.b2a_qp() and binascii.a2b_qp(). + +- Issue #27906: Fix socket accept exhaustion during high TCP traffic. + Patch by Kevin Conway. + +- Issue #28174: Handle when SO_REUSEPORT isn't properly supported. + Patch by Seth Michael Larson. + +- Issue #26654: Inspect functools.partial in asyncio.Handle.__repr__. + Patch by iceboy. + +- Issue #26909: Fix slow pipes IO in asyncio. + Patch by INADA Naoki. + +- Issue #28176: Fix callbacks race in asyncio.SelectorLoop.sock_connect. + +- Issue #27759: Fix selectors incorrectly retain invalid file descriptors. + Patch by Mark Williams. + +- Issue #28325: Remove vestigial MacOS 9 macurl2path module and its tests. + +- Issue #28368: Refuse monitoring processes if the child watcher has + no loop attached. + Patch by Vincent Michel. + +- Issue #28369: Raise RuntimeError when transport's FD is used with + add_reader, add_writer, etc. + +- Issue #28370: Speedup asyncio.StreamReader.readexactly. + Patch by Коренберг Марк. + +- Issue #28371: Deprecate passing asyncio.Handles to run_in_executor. + +- Issue #28372: Fix asyncio to support formatting of non-python coroutines. + +- Issue #28399: Remove UNIX socket from FS before binding. + Patch by Коренберг Марк. + +- Issue #27972: Prohibit Tasks to await on themselves. + +- Issue #24142: Reading a corrupt config file left configparser in an + invalid state. Original patch by Florian Höch. + +- Issue #29581: ABCMeta.__new__ now accepts **kwargs, allowing abstract base + classes to use keyword parameters in __init_subclass__. Patch by Nate Soares. + +Windows +------- + +- bpo-29579: Removes readme.txt from the installer. + +- Issue #25778: winreg does not truncate string correctly (Patch by Eryk Sun) + +- Issue #28896: Deprecate WindowsRegistryFinder and disable it by default + +- Issue #28522: Fixes mishandled buffer reallocation in getpathp.c + +- Issue #28402: Adds signed catalog files for stdlib on Windows. + +- Issue #28333: Enables Unicode for ps1/ps2 and input() prompts. (Patch by + Eryk Sun) + +- Issue #28251: Improvements to help manuals on Windows. + +- Issue #28110: launcher.msi has different product codes between 32-bit and + 64-bit + +- Issue #28161: Opening CON for write access fails + +- Issue #28162: WindowsConsoleIO readall() fails if first line starts with + Ctrl+Z + +- Issue #28163: WindowsConsoleIO fileno() passes wrong flags to + _open_osfhandle + +- Issue #28164: _PyIO_get_console_type fails for various paths + +- Issue #28137: Renames Windows path file to ._pth + +- Issue #28138: Windows ._pth file should allow import site + +C API +----- + +- Issue #27867: Function PySlice_GetIndicesEx() is deprecated and replaced with + a macro if Py_LIMITED_API is not set or set to the value between 0x03050400 + and 0x03060000 (not including) or 0x03060100 or higher. Added functions + PySlice_Unpack() and PySlice_AdjustIndices(). + +- Issue #29083: Fixed the declaration of some public API functions. + PyArg_VaParse() and PyArg_VaParseTupleAndKeywords() were not available in + limited API. PyArg_ValidateKeywordArguments(), PyArg_UnpackTuple() and + Py_BuildValue() were not available in limited API of version < 3.3 when + PY_SSIZE_T_CLEAN is defined. + +- Issue #28769: The result of PyUnicode_AsUTF8AndSize() and PyUnicode_AsUTF8() + is now of type ``const char *`` rather of ``char *``. + +- Issue #29058: All stable API extensions added after Python 3.2 are now + available only when Py_LIMITED_API is set to the PY_VERSION_HEX value of + the minimum Python version supporting this API. Library ------- diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index cbe7425eaefa65..efc7d05b7d01b9 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -1416,8 +1416,18 @@ buffered_repr(buffered *self) res = PyUnicode_FromFormat("<%s>", Py_TYPE(self)->tp_name); } else { - res = PyUnicode_FromFormat("<%s name=%R>", - Py_TYPE(self)->tp_name, nameobj); + int status = Py_ReprEnter((PyObject *)self); + res = NULL; + if (status == 0) { + res = PyUnicode_FromFormat("<%s name=%R>", + Py_TYPE(self)->tp_name, nameobj); + Py_ReprLeave((PyObject *)self); + } + else if (status > 0) { + PyErr_Format(PyExc_RuntimeError, + "reentrant call inside %s.__repr__", + Py_TYPE(self)->tp_name); + } Py_DECREF(nameobj); } return res; diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c index 7f3bcab9625ef5..833ea8e7b50894 100644 --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -1082,9 +1082,19 @@ fileio_repr(fileio *self) self->fd, mode_string(self), self->closefd ? "True" : "False"); } else { - res = PyUnicode_FromFormat( - "<_io.FileIO name=%R mode='%s' closefd=%s>", - nameobj, mode_string(self), self->closefd ? "True" : "False"); + int status = Py_ReprEnter((PyObject *)self); + res = NULL; + if (status == 0) { + res = PyUnicode_FromFormat( + "<_io.FileIO name=%R mode='%s' closefd=%s>", + nameobj, mode_string(self), self->closefd ? "True" : "False"); + Py_ReprLeave((PyObject *)self); + } + else if (status > 0) { + PyErr_Format(PyExc_RuntimeError, + "reentrant call inside %s.__repr__", + Py_TYPE(self)->tp_name); + } Py_DECREF(nameobj); } return res; diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 4df55626d4bc23..bc8d11efa5258c 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -2483,6 +2483,7 @@ static PyObject * textiowrapper_repr(textio *self) { PyObject *nameobj, *modeobj, *res, *s; + int status; CHECK_INITIALIZED(self); @@ -2490,6 +2491,15 @@ textiowrapper_repr(textio *self) if (res == NULL) return NULL; + status = Py_ReprEnter((PyObject *)self); + if (status != 0) { + if (status > 0) { + PyErr_Format(PyExc_RuntimeError, + "reentrant call inside %s.__repr__", + Py_TYPE(self)->tp_name); + } + goto error; + } nameobj = _PyObject_GetAttrId((PyObject *) self, &PyId_name); if (nameobj == NULL) { if (PyErr_ExceptionMatches(PyExc_Exception)) @@ -2504,7 +2514,7 @@ textiowrapper_repr(textio *self) goto error; PyUnicode_AppendAndDel(&res, s); if (res == NULL) - return NULL; + goto error; } modeobj = _PyObject_GetAttrId((PyObject *) self, &PyId_mode); if (modeobj == NULL) { @@ -2520,14 +2530,21 @@ textiowrapper_repr(textio *self) goto error; PyUnicode_AppendAndDel(&res, s); if (res == NULL) - return NULL; + goto error; } s = PyUnicode_FromFormat("%U encoding=%R>", res, self->encoding); Py_DECREF(res); + if (status == 0) { + Py_ReprLeave((PyObject *)self); + } return s; -error: + + error: Py_XDECREF(res); + if (status == 0) { + Py_ReprLeave((PyObject *)self); + } return NULL; } From da88596a19d2cad0e85a2b3c3290b5b1d97a793d Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 19 Mar 2017 20:53:42 +0200 Subject: [PATCH 0149/2287] bpo-29845: Mark tests that use _testcapi as CPython-only (#711) (#725) (cherry picked from commit 24c738a9e91b8f46da6166663d8ce7ec18cec784) --- Lib/ctypes/test/test_structures.py | 5 ++++- Lib/test/test_atexit.py | 1 + Lib/test/test_coroutines.py | 1 + Lib/test/test_socket.py | 1 + Lib/test/test_tracemalloc.py | 1 + 5 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py index 3eded7749ed95e..2e778fb1b43740 100644 --- a/Lib/ctypes/test/test_structures.py +++ b/Lib/ctypes/test/test_structures.py @@ -2,8 +2,8 @@ from ctypes import * from ctypes.test import need_symbol from struct import calcsize -import _testcapi import _ctypes_test +import test.support class SubclassesTest(unittest.TestCase): def test_subclass(self): @@ -202,7 +202,10 @@ class X(Structure): "_pack_": -1} self.assertRaises(ValueError, type(Structure), "X", (Structure,), d) + @test.support.cpython_only + def test_packed_c_limits(self): # Issue 15989 + import _testcapi d = {"_fields_": [("a", c_byte)], "_pack_": _testcapi.INT_MAX + 1} self.assertRaises(ValueError, type(Structure), "X", (Structure,), d) diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py index 172bd25419cea7..c761076c4a0225 100644 --- a/Lib/test/test_atexit.py +++ b/Lib/test/test_atexit.py @@ -143,6 +143,7 @@ def test_bound_methods(self): self.assertEqual(l, [5]) +@support.cpython_only class SubinterpreterTest(unittest.TestCase): def test_callbacks_leak(self): diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index a69583b5f95ae6..2b79a17ea703f5 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -2117,6 +2117,7 @@ def wrap(gen): sys.set_coroutine_wrapper(None) +@support.cpython_only class CAPITest(unittest.TestCase): def test_tp_await_1(self): diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 1508f20c9f0598..2497e47c668bc3 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -906,6 +906,7 @@ def testNtoH(self): self.assertEqual(swapped & mask, mask) self.assertRaises(OverflowError, func, 1<<34) + @support.cpython_only def testNtoHErrors(self): good_values = [ 1, 2, 3, 1, 2, 3 ] bad_values = [ -1, -2, -3, -1, -2, -3 ] diff --git a/Lib/test/test_tracemalloc.py b/Lib/test/test_tracemalloc.py index 790ab7ee606d60..742259b4396b98 100644 --- a/Lib/test/test_tracemalloc.py +++ b/Lib/test/test_tracemalloc.py @@ -865,6 +865,7 @@ def test_sys_xoptions_invalid(self): b'number of frames', stderr) + @unittest.skipIf(_testcapi is None, 'need _testcapi') def test_pymem_alloc0(self): # Issue #21639: Check that PyMem_Malloc(0) with tracemalloc enabled # does not crash. From 3d258b1eb453bcbc412d6b252f5bdceae0303f07 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 19 Mar 2017 21:06:29 +0200 Subject: [PATCH 0150/2287] bpo-29116: Fix error messages for concatenating bytes and bytearray with unsupported type. (#709) (#723) (cherry picked from commit 6b5a9ec4788770c652bac3bf5d5a0a3b710b82ae) --- Objects/bytearrayobject.c | 2 +- Objects/bytesobject.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index a8d69802508736..d456678d462f2f 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -254,7 +254,7 @@ PyByteArray_Concat(PyObject *a, PyObject *b) if (PyObject_GetBuffer(a, &va, PyBUF_SIMPLE) != 0 || PyObject_GetBuffer(b, &vb, PyBUF_SIMPLE) != 0) { PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s", - Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name); + Py_TYPE(b)->tp_name, Py_TYPE(a)->tp_name); goto done; } diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 30c1a7e24532da..c95a46d1846649 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -1438,7 +1438,7 @@ bytes_concat(PyObject *a, PyObject *b) if (PyObject_GetBuffer(a, &va, PyBUF_SIMPLE) != 0 || PyObject_GetBuffer(b, &vb, PyBUF_SIMPLE) != 0) { PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s", - Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name); + Py_TYPE(b)->tp_name, Py_TYPE(a)->tp_name); goto done; } From d1f566f6bddc67e9870eaa75ae477208b9a199be Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 19 Mar 2017 20:55:16 -0700 Subject: [PATCH 0151/2287] bpo-29856: Fix typo in curses documentation (GH-730) (GH-731) From Shifted Dxit -> Shifted Exit in Doc/library/curses.rst (cherry picked from commit 64508780d72769e4c7afc67a511c057261c578f6) --- Doc/library/curses.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst index d746eafaea9b5c..d51085506c2a96 100644 --- a/Doc/library/curses.rst +++ b/Doc/library/curses.rst @@ -1443,7 +1443,7 @@ The exact keycaps available are system dependent. +-------------------+--------------------------------------------+ | ``KEY_SEOL`` | Shifted Clear line | +-------------------+--------------------------------------------+ -| ``KEY_SEXIT`` | Shifted Dxit | +| ``KEY_SEXIT`` | Shifted Exit | +-------------------+--------------------------------------------+ | ``KEY_SFIND`` | Shifted Find | +-------------------+--------------------------------------------+ From 6fad4090ec9a27f8572bb00661b9890f01fb62f7 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 20 Mar 2017 09:13:47 +0200 Subject: [PATCH 0152/2287] bpo-28876: bool of large range raises OverflowError (#699) (#734) (cherry picked from commit e46fb8611867fa3b407a813f53137929b7cb4a10) --- Lib/test/test_range.py | 17 +++++++++++++---- Misc/NEWS | 3 +++ Objects/rangeobject.c | 12 +++++++++++- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_range.py b/Lib/test/test_range.py index 9e11e518f61e1f..679759ec6d676a 100644 --- a/Lib/test/test_range.py +++ b/Lib/test/test_range.py @@ -99,20 +99,24 @@ def test_large_operands(self): x = range(10**20+10, 10**20, 3) self.assertEqual(len(x), 0) self.assertEqual(len(list(x)), 0) + self.assertFalse(x) x = range(10**20, 10**20+10, -3) self.assertEqual(len(x), 0) self.assertEqual(len(list(x)), 0) + self.assertFalse(x) x = range(10**20+10, 10**20, -3) self.assertEqual(len(x), 4) self.assertEqual(len(list(x)), 4) + self.assertTrue(x) # Now test range() with longs - self.assertEqual(list(range(-2**100)), []) - self.assertEqual(list(range(0, -2**100)), []) - self.assertEqual(list(range(0, 2**100, -1)), []) - self.assertEqual(list(range(0, 2**100, -1)), []) + for x in [range(-2**100), + range(0, -2**100), + range(0, 2**100, -1)]: + self.assertEqual(list(x), []) + self.assertFalse(x) a = int(10 * sys.maxsize) b = int(100 * sys.maxsize) @@ -153,6 +157,7 @@ def _range_len(x): step = x[1] - x[0] length = 1 + ((x[-1] - x[0]) // step) return length + a = -sys.maxsize b = sys.maxsize expected_len = b - a @@ -160,6 +165,7 @@ def _range_len(x): self.assertIn(a, x) self.assertNotIn(b, x) self.assertRaises(OverflowError, len, x) + self.assertTrue(x) self.assertEqual(_range_len(x), expected_len) self.assertEqual(x[0], a) idx = sys.maxsize+1 @@ -177,6 +183,7 @@ def _range_len(x): self.assertIn(a, x) self.assertNotIn(b, x) self.assertRaises(OverflowError, len, x) + self.assertTrue(x) self.assertEqual(_range_len(x), expected_len) self.assertEqual(x[0], a) idx = sys.maxsize+1 @@ -195,6 +202,7 @@ def _range_len(x): self.assertIn(a, x) self.assertNotIn(b, x) self.assertRaises(OverflowError, len, x) + self.assertTrue(x) self.assertEqual(_range_len(x), expected_len) self.assertEqual(x[0], a) idx = sys.maxsize+1 @@ -213,6 +221,7 @@ def _range_len(x): self.assertIn(a, x) self.assertNotIn(b, x) self.assertRaises(OverflowError, len, x) + self.assertTrue(x) self.assertEqual(_range_len(x), expected_len) self.assertEqual(x[0], a) idx = sys.maxsize+1 diff --git a/Misc/NEWS b/Misc/NEWS index 310e982d78f03a..7e87a28145780b 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -39,6 +39,9 @@ Core and Builtins - bpo-28893: Set correct __cause__ for errors about invalid awaitables returned from __aiter__ and __anext__. +- bpo-28876: ``bool(range)`` works even if ``len(range)`` + raises :exc:`OverflowError`. + - bpo-29683: Fixes to memory allocation in _PyCode_SetExtra. Patch by Brian Coleman. diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index 8449fc7a24d394..8f5fc434bd4955 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -668,6 +668,16 @@ static PyMappingMethods range_as_mapping = { (objobjargproc)0, /* mp_ass_subscript */ }; +static int +range_bool(rangeobject* self) +{ + return PyObject_IsTrue(self->length); +} + +static PyNumberMethods range_as_number = { + .nb_bool = (inquiry)range_bool, +}; + static PyObject * range_iter(PyObject *seq); static PyObject * range_reverse(PyObject *seq); @@ -707,7 +717,7 @@ PyTypeObject PyRange_Type = { 0, /* tp_setattr */ 0, /* tp_reserved */ (reprfunc)range_repr, /* tp_repr */ - 0, /* tp_as_number */ + &range_as_number, /* tp_as_number */ &range_as_sequence, /* tp_as_sequence */ &range_as_mapping, /* tp_as_mapping */ (hashfunc)range_hash, /* tp_hash */ From fcd79ada4e4cf335372538b34c8eb89cf09f84b2 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 20 Mar 2017 14:54:52 +0200 Subject: [PATCH 0153/2287] Fix "NotImplentedError" typo in constants documentation (#692) (#739) `NotImplentedError` --> `NotImplementedError` (cherry picked from commit 05f53735c8912f8df1077e897f052571e13c3496) --- Doc/library/constants.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/constants.rst b/Doc/library/constants.rst index f0742cee55bd55..469a3eed606ff0 100644 --- a/Doc/library/constants.rst +++ b/Doc/library/constants.rst @@ -46,7 +46,7 @@ A small number of constants live in the built-in namespace. They are: .. note:: - ``NotImplentedError`` and ``NotImplemented`` are not interchangeable, + ``NotImplementedError`` and ``NotImplemented`` are not interchangeable, even though they have similar names and purposes. See :exc:`NotImplementedError` for details on when to use it. From e9213d929d7b0075539e87416f6a6fb86c27454b Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 21 Mar 2017 00:35:08 -0400 Subject: [PATCH 0154/2287] bpo-27593: Revise git SCM build info. (#744) (#745) Use --short form of git hash. Use output from "git describe" for tag. Expected outputs: 1. previous hg 2. previous git 3. updated git Release (tagged) build: 1. Python 3.7.0a0 (v3.7.0a0:4def2a2901a5, ... 2. Python 3.7.0a0 (v3.7.0a0^0:05f53735c8912f8df1077e897f052571e13c3496, ... 3. Python 3.7.0a0 (v3.7.0a0:05f53735c8, ... Development build: 1. Python 3.7.0a0 (default:41df79263a11, ... 2. Python 3.7.0a0 (master:05f53735c8912f8df1077e897f052571e13c3496, ... 3. Python 3.7.0a0 (heads/master-dirty:05f53735c8, ... "dirty" means the working tree has uncommitted changes. See "git help describe" for more info. (cherry picked from commit 554626ada769abf82a5dabe6966afa4265acb6a6) --- PCbuild/pythoncore.vcxproj | 4 ++-- configure | 4 ++-- configure.ac | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index d7e9473638cbb2..6ea184877f99cd 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -414,8 +414,8 @@ - - + + $([System.IO.File]::ReadAllText('$(IntDir)gitbranch.txt').Trim()) $([System.IO.File]::ReadAllText('$(IntDir)gitversion.txt').Trim()) diff --git a/configure b/configure index d4eccb1d68d856..abe1dc5abd4e1c 100755 --- a/configure +++ b/configure @@ -2743,8 +2743,8 @@ HAS_GIT=no-repository fi if test $HAS_GIT = found then - GITVERSION="git -C \$(srcdir) rev-parse HEAD" - GITTAG="git -C \$(srcdir) name-rev --tags --name-only HEAD" + GITVERSION="git -C \$(srcdir) rev-parse --short HEAD" + GITTAG="git -C \$(srcdir) describe --all --always --dirty" GITBRANCH="git -C \$(srcdir) name-rev --name-only HEAD" else GITVERSION="" diff --git a/configure.ac b/configure.ac index f00a2a6fa498f7..9eacf52559e8c2 100644 --- a/configure.ac +++ b/configure.ac @@ -37,8 +37,8 @@ HAS_GIT=no-repository fi if test $HAS_GIT = found then - GITVERSION="git -C \$(srcdir) rev-parse HEAD" - GITTAG="git -C \$(srcdir) name-rev --tags --name-only HEAD" + GITVERSION="git -C \$(srcdir) rev-parse --short HEAD" + GITTAG="git -C \$(srcdir) describe --all --always --dirty" GITBRANCH="git -C \$(srcdir) name-rev --name-only HEAD" else GITVERSION="" From 6efc812280b9303d37f51fbd061f7c31379fb72e Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Sun, 5 Mar 2017 19:58:06 -0800 Subject: [PATCH 0155/2287] Fixes the upload script to purge the CDN correctly and display success output. (#466) (#497) (cherry picked from commit e544b40faa5ab61b6aba691577d90b2b641f664d) --- Tools/msi/uploadrelease.proj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Tools/msi/uploadrelease.proj b/Tools/msi/uploadrelease.proj index 305e84fc2d4b28..75840f2f851ecd 100644 --- a/Tools/msi/uploadrelease.proj +++ b/Tools/msi/uploadrelease.proj @@ -8,6 +8,7 @@ $(TARGET) /srv/www.python.org/ftp/python true + true false false @@ -91,6 +92,7 @@ echo." /> + From 0acdea79cba3883c5e7035c7336fb0ce54435c03 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Mon, 6 Mar 2017 17:24:28 +0900 Subject: [PATCH 0156/2287] bpo-29719: Remove Date and Release field in whatsnew/3.6 (GH-500) (cherry picked from commit 2225ddaa9e64c086b2b6997b0c9ac50921f7aa85) (cherry picked from commit 4e1a065c20856a00d0fe88ce022b249170608058) --- Doc/whatsnew/3.6.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index 96fd256b991b76..a696af4a999c84 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -2,8 +2,6 @@ What's New In Python 3.6 **************************** -:Release: |release| -:Date: |today| :Editors: Elvis Pranskevichus , Yury Selivanov .. Rules for maintenance: From 07e6cbd7b9e5b6047a608cedd5cc9b20891a3972 Mon Sep 17 00:00:00 2001 From: "n.d. parker" Date: Wed, 8 Mar 2017 23:27:46 +0100 Subject: [PATCH 0157/2287] Fix the only non-C90 comment to be C90 compatible. (#568) (cherry picked from commit 51b646a55a4a1c4d0df764c4404a062fbcc6b356) --- Include/pyport.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/pyport.h b/Include/pyport.h index 52a91a0d11d056..426822a81f075a 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -37,7 +37,7 @@ Used in: Py_SAFE_DOWNCAST * integral synonyms. Only define the ones we actually need. */ -// long long is required. Ensure HAVE_LONG_LONG is defined for compatibility. +/* long long is required. Ensure HAVE_LONG_LONG is defined for compatibility. */ #ifndef HAVE_LONG_LONG #define HAVE_LONG_LONG 1 #endif From 75345c552d0889f4f63039d6063f371846c8f41f Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Sun, 12 Mar 2017 21:34:22 +1000 Subject: [PATCH 0158/2287] [3.6] bpo-29723: Consistently configure sys.path[0] (#636) Directory and zipfile execution previously added the parent directory of the directory or zipfile as sys.path[0] and then subsequently overwrote it with the directory or zipfile itself. This caused problems in isolated mode, as it overwrote the "stdlib as a zip archive" entry in sys.path, as the parent directory was never added. The attempted fix to that issue in bpo-29319 created the opposite problem in *non*-isolated mode, by potentially leaving the parent directory on sys.path instead of overwriting it. This change fixes the root cause of the problem by removing the whole "add-and-overwrite" dance for sys.path[0], and instead simply never adds the parent directory to sys.path in the first place. (cherry picked from commit d2977a3ae2cc6802921b1e3b6e9d13fcfbda872d) (cherry picked from commit c60948464fb0ec116ea227f6bce8a4bb8fb75257) --- Lib/test/test_cmd_line_script.py | 67 +++++++++++++++++++++++++++++ Misc/NEWS | 36 ++++++++++++++++ Modules/main.c | 72 +++++++++++++++++++------------- 3 files changed, 147 insertions(+), 28 deletions(-) diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index e058ecd086df3c..1587daf8f582dd 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -572,6 +572,73 @@ def test_syntaxerror_indented_caret_position(self): self.assertNotIn("\f", text) self.assertIn("\n 1 + 1 = 2\n ^", text) + def test_consistent_sys_path_for_direct_execution(self): + # This test case ensures that the following all give the same + # sys.path configuration: + # + # ./python -s script_dir/__main__.py + # ./python -s script_dir + # ./python -I script_dir + script = textwrap.dedent("""\ + import sys + for entry in sys.path: + print(entry) + """) + # Always show full path diffs on errors + self.maxDiff = None + with support.temp_dir() as work_dir, support.temp_dir() as script_dir: + script_name = _make_test_script(script_dir, '__main__', script) + # Reference output comes from directly executing __main__.py + # We omit PYTHONPATH and user site to align with isolated mode + p = spawn_python("-Es", script_name, cwd=work_dir) + out_by_name = kill_python(p).decode().splitlines() + self.assertEqual(out_by_name[0], script_dir) + self.assertNotIn(work_dir, out_by_name) + # Directory execution should give the same output + p = spawn_python("-Es", script_dir, cwd=work_dir) + out_by_dir = kill_python(p).decode().splitlines() + self.assertEqual(out_by_dir, out_by_name) + # As should directory execution in isolated mode + p = spawn_python("-I", script_dir, cwd=work_dir) + out_by_dir_isolated = kill_python(p).decode().splitlines() + self.assertEqual(out_by_dir_isolated, out_by_dir, out_by_name) + + def test_consistent_sys_path_for_module_execution(self): + # This test case ensures that the following both give the same + # sys.path configuration: + # ./python -sm script_pkg.__main__ + # ./python -sm script_pkg + # + # And that this fails as unable to find the package: + # ./python -Im script_pkg + script = textwrap.dedent("""\ + import sys + for entry in sys.path: + print(entry) + """) + # Always show full path diffs on errors + self.maxDiff = None + with support.temp_dir() as work_dir: + script_dir = os.path.join(work_dir, "script_pkg") + os.mkdir(script_dir) + script_name = _make_test_script(script_dir, '__main__', script) + # Reference output comes from `-m script_pkg.__main__` + # We omit PYTHONPATH and user site to better align with the + # direct execution test cases + p = spawn_python("-sm", "script_pkg.__main__", cwd=work_dir) + out_by_module = kill_python(p).decode().splitlines() + self.assertEqual(out_by_module[0], '') + self.assertNotIn(script_dir, out_by_module) + # Package execution should give the same output + p = spawn_python("-sm", "script_pkg", cwd=work_dir) + out_by_package = kill_python(p).decode().splitlines() + self.assertEqual(out_by_package, out_by_module) + # Isolated mode should fail with an import error + exitcode, stdout, stderr = assert_python_failure( + "-Im", "script_pkg", cwd=work_dir + ) + traceback_lines = stderr.decode().splitlines() + self.assertIn("No module named script_pkg", traceback_lines[-1]) def test_main(): support.run_unittest(CmdLineTest) diff --git a/Misc/NEWS b/Misc/NEWS index d715d306a34bc3..653510bb411791 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2,6 +2,42 @@ Python News +++++++++++ +What's New in Python 3.6.1 final? +================================= + +*Release date: XXXX-XX-XX* + +Core and Builtins +----------------- + +- bpo-29723: The ``sys.path[0]`` initialization change for bpo-29139 caused a + regression by revealing an inconsistency in how sys.path is initialized when + executing ``__main__`` from a zipfile, directory, or other import location. + The interpreter now consistently avoids ever adding the import location's + parent directory to ``sys.path``, and ensures no other ``sys.path`` entries + are inadvertently modified when inserting the import location named on the + command line. + +- bpo-29714: Fix a regression that bytes format may fail when containing zero + bytes inside. + +Library +------- + +- bpo-28298: Fix a bug that prevented array 'Q', 'L' and 'I' from accepting big + intables (objects that have __int__) as elements. Patch by Oren Milman. + +- bpo-28231: The zipfile module now accepts path-like objects for external + paths. + +- bpo-26915: index() and count() methods of collections.abc.Sequence now + check identity before checking equality when do comparisons. + +- bpo-29615: SimpleXMLRPCDispatcher no longer chains KeyError (or any other + exception) to exception(s) raised in the dispatched methods. + Patch by Petr Motejlek. + + What's New in Python 3.6.1 release candidate 1 ============================================== diff --git a/Modules/main.c b/Modules/main.c index 2e6a60b1673f88..dd502119d985e9 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -225,55 +225,60 @@ static int RunModule(wchar_t *modname, int set_argv0) return 0; } -static int -RunMainFromImporter(wchar_t *filename) +static PyObject * +AsImportPathEntry(wchar_t *filename) { - PyObject *argv0 = NULL, *importer, *sys_path, *sys_path0; - int sts; + PyObject *sys_path0 = NULL, *importer; - argv0 = PyUnicode_FromWideChar(filename, wcslen(filename)); - if (argv0 == NULL) + sys_path0 = PyUnicode_FromWideChar(filename, wcslen(filename)); + if (sys_path0 == NULL) goto error; - importer = PyImport_GetImporter(argv0); + importer = PyImport_GetImporter(sys_path0); if (importer == NULL) goto error; if (importer == Py_None) { - Py_DECREF(argv0); + Py_DECREF(sys_path0); Py_DECREF(importer); - return -1; + return NULL; } Py_DECREF(importer); + return sys_path0; + +error: + Py_XDECREF(sys_path0); + PySys_WriteStderr("Failed checking if argv[0] is an import path entry\n"); + PyErr_Print(); + PyErr_Clear(); + return NULL; +} + + +static int +RunMainFromImporter(PyObject *sys_path0) +{ + PyObject *sys_path; + int sts; - /* argv0 is usable as an import source, so put it in sys.path[0] - and import __main__ */ + /* Assume sys_path0 has already been checked by AsImportPathEntry, + * so put it in sys.path[0] and import __main__ */ sys_path = PySys_GetObject("path"); if (sys_path == NULL) { PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path"); goto error; } - sys_path0 = PyList_GetItem(sys_path, 0); - sts = 0; - if (!sys_path0) { - PyErr_Clear(); - sts = PyList_Append(sys_path, argv0); - } else if (PyObject_IsTrue(sys_path0)) { - sts = PyList_Insert(sys_path, 0, argv0); - } else { - sts = PyList_SetItem(sys_path, 0, argv0); - } + sts = PyList_Insert(sys_path, 0, sys_path0); if (sts) { - argv0 = NULL; + sys_path0 = NULL; goto error; } - Py_INCREF(argv0); sts = RunModule(L"__main__", 0); return sts != 0; error: - Py_XDECREF(argv0); + Py_XDECREF(sys_path0); PyErr_Print(); return 1; } @@ -358,6 +363,7 @@ Py_Main(int argc, wchar_t **argv) int saw_unbuffered_flag = 0; char *opt; PyCompilerFlags cf; + PyObject *main_importer_path = NULL; PyObject *warning_option = NULL; PyObject *warning_options = NULL; @@ -714,7 +720,17 @@ Py_Main(int argc, wchar_t **argv) argv[_PyOS_optind] = L"-m"; } - PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind); + if (filename != NULL) { + main_importer_path = AsImportPathEntry(filename); + } + + if (main_importer_path != NULL) { + /* Let RunMainFromImporter adjust sys.path[0] later */ + PySys_SetArgvEx(argc-_PyOS_optind, argv+_PyOS_optind, 0); + } else { + /* Use config settings to decide whether or not to update sys.path[0] */ + PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind); + } if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) && isatty(fileno(stdin)) && @@ -744,11 +760,11 @@ Py_Main(int argc, wchar_t **argv) sts = -1; /* keep track of whether we've already run __main__ */ - if (filename != NULL) { - sts = RunMainFromImporter(filename); + if (main_importer_path != NULL) { + sts = RunMainFromImporter(main_importer_path); } - if (sts==-1 && filename!=NULL) { + if (sts==-1 && filename != NULL) { fp = _Py_wfopen(filename, L"r"); if (fp == NULL) { char *cfilename_buffer; From 360c49b9cf3c164fa1ee3228e1a68282d77c5e4e Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Thu, 16 Mar 2017 11:03:03 -0700 Subject: [PATCH 0159/2287] Takes vcruntime140.dll from the correct source. (#684) (cherry picked from commit 9cd5e87bac51d7b901e3c36bf22728bb1693da59) --- Tools/msi/make_zip.proj | 9 +++------ Tools/nuget/make_pkg.proj | 8 +++----- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/Tools/msi/make_zip.proj b/Tools/msi/make_zip.proj index f78e6ffa28fb72..b3588b7a0bae90 100644 --- a/Tools/msi/make_zip.proj +++ b/Tools/msi/make_zip.proj @@ -17,15 +17,12 @@ rmdir /q/s "$(IntermediateOutputPath)\zip_$(ArchName)" "$(PythonExe)" "$(MSBuildThisFileDirectory)\make_zip.py" $(Arguments) -e -o "$(TargetPath)" -t "$(IntermediateOutputPath)\zip_$(ArchName)" -a $(ArchName) - set DOC_FILENAME=python$(PythonVersion).chm -set VCREDIST_PATH=$(VS140COMNTOOLS)\..\..\VC\redist\$(Platform)\Microsoft.VC140.CRT + set DOC_FILENAME=python$(PythonVersion).chm + $(Environment)%0D%0Aset VCREDIST_PATH=$(CRTRedist)\$(Platform) - + diff --git a/Tools/nuget/make_pkg.proj b/Tools/nuget/make_pkg.proj index d7e932cee54d3c..464ef0456af47a 100644 --- a/Tools/nuget/make_pkg.proj +++ b/Tools/nuget/make_pkg.proj @@ -34,9 +34,8 @@ $(NugetArguments) -Version "$(NuspecVersion)" $(NugetArguments) -NoPackageAnalysis -NonInteractive - setlocal -set DOC_FILENAME=python$(PythonVersion).chm -set VCREDIST_PATH=$(VS140COMNTOOLS)\..\..\VC\redist\$(Platform)\Microsoft.VC140.CRT + set DOC_FILENAME=python$(PythonVersion).chm + $(Environment)%0D%0Aset VCREDIST_PATH=$(CRTRedist)\$(Platform) @@ -45,8 +44,7 @@ set VCREDIST_PATH=$(VS140COMNTOOLS)\..\..\VC\redist\$(Platform)\Microsoft.VC140. - + From 8c18fbeed1c7721b67f1726a6e9c41acef823135 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 21 Mar 2017 00:35:08 -0400 Subject: [PATCH 0160/2287] bpo-27593: Revise git SCM build info. (#744) (#745) Use --short form of git hash. Use output from "git describe" for tag. Expected outputs: 1. previous hg 2. previous git 3. updated git Release (tagged) build: 1. Python 3.7.0a0 (v3.7.0a0:4def2a2901a5, ... 2. Python 3.7.0a0 (v3.7.0a0^0:05f53735c8912f8df1077e897f052571e13c3496, ... 3. Python 3.7.0a0 (v3.7.0a0:05f53735c8, ... Development build: 1. Python 3.7.0a0 (default:41df79263a11, ... 2. Python 3.7.0a0 (master:05f53735c8912f8df1077e897f052571e13c3496, ... 3. Python 3.7.0a0 (heads/master-dirty:05f53735c8, ... "dirty" means the working tree has uncommitted changes. See "git help describe" for more info. (cherry picked from commit 554626ada769abf82a5dabe6966afa4265acb6a6) (cherry picked from commit e9213d929d7b0075539e87416f6a6fb86c27454b) --- PCbuild/pythoncore.vcxproj | 4 ++-- configure | 4 ++-- configure.ac | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index d7e9473638cbb2..6ea184877f99cd 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -414,8 +414,8 @@ - - + + $([System.IO.File]::ReadAllText('$(IntDir)gitbranch.txt').Trim()) $([System.IO.File]::ReadAllText('$(IntDir)gitversion.txt').Trim()) diff --git a/configure b/configure index d4eccb1d68d856..abe1dc5abd4e1c 100755 --- a/configure +++ b/configure @@ -2743,8 +2743,8 @@ HAS_GIT=no-repository fi if test $HAS_GIT = found then - GITVERSION="git -C \$(srcdir) rev-parse HEAD" - GITTAG="git -C \$(srcdir) name-rev --tags --name-only HEAD" + GITVERSION="git -C \$(srcdir) rev-parse --short HEAD" + GITTAG="git -C \$(srcdir) describe --all --always --dirty" GITBRANCH="git -C \$(srcdir) name-rev --name-only HEAD" else GITVERSION="" diff --git a/configure.ac b/configure.ac index f00a2a6fa498f7..9eacf52559e8c2 100644 --- a/configure.ac +++ b/configure.ac @@ -37,8 +37,8 @@ HAS_GIT=no-repository fi if test $HAS_GIT = found then - GITVERSION="git -C \$(srcdir) rev-parse HEAD" - GITTAG="git -C \$(srcdir) name-rev --tags --name-only HEAD" + GITVERSION="git -C \$(srcdir) rev-parse --short HEAD" + GITTAG="git -C \$(srcdir) describe --all --always --dirty" GITBRANCH="git -C \$(srcdir) name-rev --name-only HEAD" else GITVERSION="" From 69c0db5050f623e8895b72dfe970392b1f9a0e2e Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 21 Mar 2017 02:32:38 -0400 Subject: [PATCH 0161/2287] Update docs and patchlevel for 3.6.1 final --- Include/patchlevel.h | 6 +++--- Misc/NEWS | 26 +++++++------------------- README.rst | 4 ++-- 3 files changed, 12 insertions(+), 24 deletions(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index b42a0db2f82007..54a9ab6ff78896 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -19,11 +19,11 @@ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 6 #define PY_MICRO_VERSION 1 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA -#define PY_RELEASE_SERIAL 1 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL +#define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.6.1rc1" +#define PY_VERSION "3.6.1" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Misc/NEWS b/Misc/NEWS index 653510bb411791..4807bd0fcc3b3f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2,10 +2,10 @@ Python News +++++++++++ -What's New in Python 3.6.1 final? -================================= +What's New in Python 3.6.1? +=========================== -*Release date: XXXX-XX-XX* +*Release date: 2017-03-21* Core and Builtins ----------------- @@ -18,24 +18,12 @@ Core and Builtins are inadvertently modified when inserting the import location named on the command line. -- bpo-29714: Fix a regression that bytes format may fail when containing zero - bytes inside. - -Library -------- - -- bpo-28298: Fix a bug that prevented array 'Q', 'L' and 'I' from accepting big - intables (objects that have __int__) as elements. Patch by Oren Milman. - -- bpo-28231: The zipfile module now accepts path-like objects for external - paths. +Build +----- -- bpo-26915: index() and count() methods of collections.abc.Sequence now - check identity before checking equality when do comparisons. +- bpo-27593: fix format of git information used in sys.version -- bpo-29615: SimpleXMLRPCDispatcher no longer chains KeyError (or any other - exception) to exception(s) raised in the dispatched methods. - Patch by Petr Motejlek. +- Fix incompatible comment in python.h What's New in Python 3.6.1 release candidate 1 diff --git a/README.rst b/README.rst index 242572c5e361db..9ea036066877c9 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.6.1 release candidate 1 -================================================ +This is Python version 3.6.1 +============================ .. image:: https://travis-ci.org/python/cpython.svg?branch=3.6 :alt: CPython build status on Travis CI From fe30339534c602af1123e1402e44a1463f91f2e5 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Wed, 22 Mar 2017 03:46:26 +0900 Subject: [PATCH 0162/2287] bpo-29859: Fix error messages from return codes for pthread_* calls (GH-753) (cherry picked from commit d7fa6b259e00fca04dbf816bfcf4115fdda14bb7) --- Misc/NEWS | 3 +++ Python/thread_pthread.h | 24 +++++++++++++----------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 7e87a28145780b..aad92480693e6a 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.6.1 final? Core and Builtins ----------------- +- bpo-29859: Show correct error messages when any of the pthread_* calls in + thread_pthread.h fails. + - bpo-29600: Fix wrapping coroutine return values in StopIteration. - bpo-28856: Fix an oversight that %b format for bytes should support objects diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 27e0dc84bcb52e..ba7393f03de6ae 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -143,6 +143,8 @@ typedef struct { } pthread_lock; #define CHECK_STATUS(name) if (status != 0) { perror(name); error = 1; } +#define CHECK_STATUS_PTHREAD(name) if (status != 0) { fprintf(stderr, \ + "%s: %s\n", name, strerror(status)); error = 1; } /* * Initialization. @@ -417,7 +419,7 @@ PyThread_allocate_lock(void) status = pthread_mutex_init(&lock->mut, pthread_mutexattr_default); - CHECK_STATUS("pthread_mutex_init"); + CHECK_STATUS_PTHREAD("pthread_mutex_init"); /* Mark the pthread mutex underlying a Python mutex as pure happens-before. We can't simply mark the Python-level mutex as a mutex because it can be @@ -427,7 +429,7 @@ PyThread_allocate_lock(void) status = pthread_cond_init(&lock->lock_released, pthread_condattr_default); - CHECK_STATUS("pthread_cond_init"); + CHECK_STATUS_PTHREAD("pthread_cond_init"); if (error) { PyMem_RawFree((void *)lock); @@ -452,10 +454,10 @@ PyThread_free_lock(PyThread_type_lock lock) * and must have the cond destroyed first. */ status = pthread_cond_destroy( &thelock->lock_released ); - CHECK_STATUS("pthread_cond_destroy"); + CHECK_STATUS_PTHREAD("pthread_cond_destroy"); status = pthread_mutex_destroy( &thelock->mut ); - CHECK_STATUS("pthread_mutex_destroy"); + CHECK_STATUS_PTHREAD("pthread_mutex_destroy"); PyMem_RawFree((void *)thelock); } @@ -472,7 +474,7 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds, lock, microseconds, intr_flag)); status = pthread_mutex_lock( &thelock->mut ); - CHECK_STATUS("pthread_mutex_lock[1]"); + CHECK_STATUS_PTHREAD("pthread_mutex_lock[1]"); if (thelock->locked == 0) { success = PY_LOCK_ACQUIRED; @@ -494,13 +496,13 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds, &thelock->mut, &ts); if (status == ETIMEDOUT) break; - CHECK_STATUS("pthread_cond_timed_wait"); + CHECK_STATUS_PTHREAD("pthread_cond_timed_wait"); } else { status = pthread_cond_wait( &thelock->lock_released, &thelock->mut); - CHECK_STATUS("pthread_cond_wait"); + CHECK_STATUS_PTHREAD("pthread_cond_wait"); } if (intr_flag && status == 0 && thelock->locked) { @@ -518,7 +520,7 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds, } if (success == PY_LOCK_ACQUIRED) thelock->locked = 1; status = pthread_mutex_unlock( &thelock->mut ); - CHECK_STATUS("pthread_mutex_unlock[1]"); + CHECK_STATUS_PTHREAD("pthread_mutex_unlock[1]"); if (error) success = PY_LOCK_FAILURE; dprintf(("PyThread_acquire_lock_timed(%p, %lld, %d) -> %d\n", @@ -536,16 +538,16 @@ PyThread_release_lock(PyThread_type_lock lock) dprintf(("PyThread_release_lock(%p) called\n", lock)); status = pthread_mutex_lock( &thelock->mut ); - CHECK_STATUS("pthread_mutex_lock[3]"); + CHECK_STATUS_PTHREAD("pthread_mutex_lock[3]"); thelock->locked = 0; /* wake up someone (anyone, if any) waiting on the lock */ status = pthread_cond_signal( &thelock->lock_released ); - CHECK_STATUS("pthread_cond_signal"); + CHECK_STATUS_PTHREAD("pthread_cond_signal"); status = pthread_mutex_unlock( &thelock->mut ); - CHECK_STATUS("pthread_mutex_unlock[3]"); + CHECK_STATUS_PTHREAD("pthread_mutex_unlock[3]"); } #endif /* USE_SEMAPHORES */ From 677df6ecade6ff503d3c3c93cf157ed12fec9386 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 21 Mar 2017 20:21:49 -0400 Subject: [PATCH 0163/2287] Revert and fix Misc/NEWS after merge error in fca705d53397. (#755) --- Misc/NEWS | 805 +----------------------------------------------------- 1 file changed, 3 insertions(+), 802 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index aad92480693e6a..2e0f00be111427 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,9 @@ Core and Builtins - bpo-29859: Show correct error messages when any of the pthread_* calls in thread_pthread.h fails. +- bpo-28876: ``bool(range)`` works even if ``len(range)`` + raises :exc:`OverflowError`. + - bpo-29600: Fix wrapping coroutine return values in StopIteration. - bpo-28856: Fix an oversight that %b format for bytes should support objects @@ -28,813 +31,12 @@ Core and Builtins - bpo-29714: Fix a regression that bytes format may fail when containing zero bytes inside. -- bpo-29568: Escaped percent "%%" in the format string for classic string - formatting no longer allows any characters between two percents. - -- bpo-29714: Fix a regression that bytes format may fail when containing zero - bytes inside. - -- bpo-29695: bool(), float(), list() and tuple() no longer take keyword arguments. - The first argument of int() can now be passes only as positional argument. - -- bpo-20087: Prefer glibc's list of locale aliases to the X11 ones. - -- bpo-28893: Set correct __cause__ for errors about invalid awaitables - returned from __aiter__ and __anext__. - -- bpo-28876: ``bool(range)`` works even if ``len(range)`` - raises :exc:`OverflowError`. - -- bpo-29683: Fixes to memory allocation in _PyCode_SetExtra. Patch by - Brian Coleman. - -- bpo-29684: Fix minor regression of PyEval_CallObjectWithKeywords. - It should raise TypeError when kwargs is not a dict. But it might - cause segv when args=NULL and kwargs is not a dict. - -- bpo-28598: Support __rmod__ for subclasses of str being called before - str.__mod__. Patch by Martijn Pieters. - -- bpo-29607: Fix stack_effect computation for CALL_FUNCTION_EX. - Patch by Matthieu Dartiailh. - -- bpo-29602: Fix incorrect handling of signed zeros in complex constructor for - complex subclasses and for inputs having a __complex__ method. Patch - by Serhiy Storchaka. - -- bpo-29347: Fixed possibly dereferencing undefined pointers - when creating weakref objects. - -- bpo-29463: Add ``docstring`` field to Module, ClassDef, FunctionDef, - and AsyncFunctionDef ast nodes. docstring is not first stmt in their body - anymore. It affects ``co_firstlineno`` and ``co_lnotab`` of code object - for module and class. - -- bpo-29438: Fixed use-after-free problem in key sharing dict. - -- bpo-29546: Set the 'path' and 'name' attribute on ImportError for ``from ... import ...``. - -- bpo-29546: Improve from-import error message with location - -- Issue #29319: Prevent RunMainFromImporter overwriting sys.path[0]. - -- Issue #29337: Fixed possible BytesWarning when compare the code objects. - Warnings could be emitted at compile time. - -- Issue #29327: Fixed a crash when pass the iterable keyword argument to - sorted(). - -- Issue #29034: Fix memory leak and use-after-free in os module (path_converter). - -- Issue #29159: Fix regression in bytes(x) when x.__index__() raises Exception. - -- Issue #29049: Call _PyObject_GC_TRACK() lazily when calling Python function. - Calling function is up to 5% faster. - -- Issue #28927: bytes.fromhex() and bytearray.fromhex() now ignore all ASCII - whitespace, not only spaces. Patch by Robert Xiao. - -- Issue #28932: Do not include if it does not exist. - -- Issue #25677: Correct the positioning of the syntax error caret for - indented blocks. Based on patch by Michael Layzell. - -- Issue #29000: Fixed bytes formatting of octals with zero padding in alternate - form. - -- Issue #18896: Python function can now have more than 255 parameters. - collections.namedtuple() now supports tuples with more than 255 elements. - -- Issue #28596: The preferred encoding is UTF-8 on Android. Patch written by - Chi Hsuan Yen. - -- Issue #26919: On Android, operating system data is now always encoded/decoded - to/from UTF-8, instead of the locale encoding to avoid inconsistencies with - os.fsencode() and os.fsdecode() which are already using UTF-8. - -- Issue #28991: functools.lru_cache() was susceptible to an obscure reentrancy - bug triggerable by a monkey-patched len() function. - -- Issue #28147: Fix a memory leak in split-table dictionaries: setattr() - must not convert combined table into split table. Patch written by INADA - Naoki. - -- Issue #28739: f-string expressions are no longer accepted as docstrings and - by ast.literal_eval() even if they do not include expressions. - -- Issue #28512: Fixed setting the offset attribute of SyntaxError by - PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject(). - -- Issue #28918: Fix the cross compilation of xxlimited when Python has been - built with Py_DEBUG defined. - -- Issue #23722: Rather than silently producing a class that doesn't support - zero-argument ``super()`` in methods, failing to pass the new - ``__classcell__`` namespace entry up to ``type.__new__`` now results in a - ``DeprecationWarning`` and a class that supports zero-argument ``super()``. - -- Issue #28797: Modifying the class __dict__ inside the __set_name__ method of - a descriptor that is used inside that class no longer prevents calling the - __set_name__ method of other descriptors. - -- Issue #28799: Remove the ``PyEval_GetCallStats()`` function and deprecate - the untested and undocumented ``sys.callstats()`` function. Remove the - ``CALL_PROFILE`` special build: use the :func:`sys.setprofile` function, - :mod:`cProfile` or :mod:`profile` to profile function calls. - -- Issue #12844: More than 255 arguments can now be passed to a function. - -- Issue #28782: Fix a bug in the implementation ``yield from`` when checking - if the next instruction is YIELD_FROM. Regression introduced by WORDCODE - (issue #26647). - -- Issue #28774: Fix error position of the unicode error in ASCII and Latin1 - encoders when a string returned by the error handler contains multiple - non-encodable characters (non-ASCII for the ASCII codec, characters out - of the U+0000-U+00FF range for Latin1). - -- Issue #28731: Optimize _PyDict_NewPresized() to create correct size dict. - Improve speed of dict literal with constant keys up to 30%. - -- Issue #28532: Show sys.version when -V option is supplied twice. - -- Issue #27100: The with-statement now checks for __enter__ before it - checks for __exit__. This gives less confusing error messages when - both methods are missing. Patch by Jonathan Ellington. - -- Issue #28746: Fix the set_inheritable() file descriptor method on platforms - that do not have the ioctl FIOCLEX and FIONCLEX commands. - -- Issue #26920: Fix not getting the locale's charset upon initializing the - interpreter, on platforms that do not have langinfo. - -- Issue #28648: Fixed crash in Py_DecodeLocale() in debug build on Mac OS X - when decode astral characters. Patch by Xiang Zhang. - -- Issue #28665: Improve speed of the STORE_DEREF opcode by 40%. - -- Issue #19398: Extra slash no longer added to sys.path components in case of - empty compile-time PYTHONPATH components. - -- Issue #28621: Sped up converting int to float by reusing faster bits counting - implementation. Patch by Adrian Wielgosik. - -- Issue #28580: Optimize iterating split table values. - Patch by Xiang Zhang. - -- Issue #28583: PyDict_SetDefault didn't combine split table when needed. - Patch by Xiang Zhang. - -- Issue #28128: Deprecation warning for invalid str and byte escape - sequences now prints better information about where the error - occurs. Patch by Serhiy Storchaka and Eric Smith. - -- Issue #28509: dict.update() no longer allocate unnecessary large memory. - -- Issue #28426: Fixed potential crash in PyUnicode_AsDecodedObject() in debug - build. - -- Issue #28517: Fixed of-by-one error in the peephole optimizer that caused - keeping unreachable code. - -- Issue #28214: Improved exception reporting for problematic __set_name__ - attributes. - -- Issue #23782: Fixed possible memory leak in _PyTraceback_Add() and exception - loss in PyTraceBack_Here(). - -- Issue #28183: Optimize and cleanup dict iteration. - -- Issue #26081: Added C implementation of asyncio.Future. - Original patch by Yury Selivanov. - -- Issue #28379: Added sanity checks and tests for PyUnicode_CopyCharacters(). - Patch by Xiang Zhang. - -- Issue #28376: The type of long range iterator is now registered as Iterator. - Patch by Oren Milman. - -- Issue #28376: Creating instances of range_iterator by calling range_iterator - type now is disallowed. Calling iter() on range instance is the only way. - Patch by Oren Milman. - -- Issue #26906: Resolving special methods of uninitialized type now causes - implicit initialization of the type instead of a fail. - -- Issue #18287: PyType_Ready() now checks that tp_name is not NULL. - Original patch by Niklas Koep. - -- Issue #24098: Fixed possible crash when AST is changed in process of - compiling it. - -- Issue #28201: Dict reduces possibility of 2nd conflict in hash table when - hashes have same lower bits. - -- Issue #28350: String constants with null character no longer interned. - -- Issue #26617: Fix crash when GC runs during weakref callbacks. - -- Issue #27942: String constants now interned recursively in tuples and frozensets. - -- Issue #28289: ImportError.__init__ now resets not specified attributes. - -- Issue #21578: Fixed misleading error message when ImportError called with - invalid keyword args. - -- Issue #28203: Fix incorrect type in complex(1.0, {2:3}) error message. - Patch by Soumya Sharma. - -- Issue #28086: Single var-positional argument of tuple subtype was passed - unscathed to the C-defined function. Now it is converted to exact tuple. - -- Issue #28214: Now __set_name__ is looked up on the class instead of the - instance. - -- Issue #27955: Fallback on reading /dev/urandom device when the getrandom() - syscall fails with EPERM, for example when blocked by SECCOMP. - -- Issue #28192: Don't import readline in isolated mode. - -- Issue #27441: Remove some redundant assignments to ob_size in longobject.c. - Thanks Oren Milman. - -- Issue #27222: Clean up redundant code in long_rshift function. Thanks - Oren Milman. - -- Upgrade internal unicode databases to Unicode version 9.0.0. - -- Issue #28131: Fix a regression in zipimport's compile_source(). zipimport - should use the same optimization level as the interpreter. - -- Issue #28126: Replace Py_MEMCPY with memcpy(). Visual Studio can properly - optimize memcpy(). - -- Issue #28120: Fix dict.pop() for splitted dictionary when trying to remove a - "pending key" (Not yet inserted in split-table). Patch by Xiang Zhang. - -- Issue #26182: Raise DeprecationWarning when async and await keywords are - used as variable/attribute/class/function name. - -- Issue #26182: Fix a refleak in code that raises DeprecationWarning. - -- Issue #28721: Fix asynchronous generators aclose() and athrow() to - handle StopAsyncIteration propagation properly. - -- Issue #26110: Speed-up method calls: add LOAD_METHOD and CALL_METHOD - opcodes. - -Extension Modules ------------------ - -- Issue #29169: Update zlib to 1.2.11. Library ------- - bpo-25455: Fixed crashes in repr of recursive buffered file-like objects. -- bpo-29800: Fix crashes in partial.__repr__ if the keys of partial.keywords - are not strings. Patch by Michael Seifert. - -- bpo-8256: Fixed possible failing or crashing input() if attributes "encoding" - or "errors" of sys.stdin or sys.stdout are not set or are not strings. - -- bpo-28692: Using non-integer value for selecting a plural form in gettext is - now deprecated. - -- bpo-26121: Use C library implementation for math functions erf() and erfc(). - -- bpo-29619: os.stat() and os.DirEntry.inode() now convert inode (st_ino) using - unsigned integers. - -- bpo-28298: Fix a bug that prevented array 'Q', 'L' and 'I' from accepting big - intables (objects that have __int__) as elements. - -- bpo-29645: Speed up importing the webbrowser module. webbrowser.register() - is now thread-safe. - -- bpo-28231: The zipfile module now accepts path-like objects for external - paths. - -- bpo-26915: index() and count() methods of collections.abc.Sequence now - check identity before checking equality when do comparisons. - -- bpo-28682: Added support for bytes paths in os.fwalk(). - -- bpo-29623: Allow use of path-like object as a single argument in - ConfigParser.read(). Patch by David Ellis. - -- bpo-9303: Migrate sqlite3 module to _v2 API. Patch by Aviv Palivoda. - -- bpo-28963: Fix out of bound iteration in asyncio.Future.remove_done_callback - implemented in C. - -- bpo-29704: asyncio.subprocess.SubprocessStreamProtocol no longer closes before - all pipes are closed. - -- bpo-29271: Fix Task.current_task and Task.all_tasks implemented in C - to accept None argument as their pure Python implementation. - -- bpo-29703: Fix asyncio to support instantiation of new event loops - in child processes. - -- bpo-29615: SimpleXMLRPCDispatcher no longer chains KeyError (or any other - exception) to exception(s) raised in the dispatched methods. - Patch by Petr Motejlek. - -- bpo-7769: Method register_function() of xmlrpc.server.SimpleXMLRPCDispatcher - and its subclasses can now be used as a decorator. - -- bpo-29376: Fix assertion error in threading._DummyThread.is_alive(). - -- bpo-28624: Add a test that checks that cwd parameter of Popen() accepts - PathLike objects. Patch by Sayan Chowdhury. - -- bpo-28518: Start a transaction implicitly before a DML statement. - Patch by Aviv Palivoda. - -- bpo-29742: get_extra_info() raises exception if get called on closed ssl transport. - Patch by Nikolay Kim. - -- Issue #16285: urrlib.parse.quote is now based on RFC 3986 and hence includes - '~' in the set of characters that is not quoted by default. Patch by - Christian Theune and Ratnadeep Debnath. - -- bpo-29532: Altering a kwarg dictionary passed to functools.partial() - no longer affects a partial object after creation. - -- bpo-29110: Fix file object leak in aifc.open() when file is given as a - filesystem path and is not in valid AIFF format. Patch by Anthony Zhang. - -- bpo-22807: Add uuid.SafeUUID and uuid.UUID.is_safe to relay information from - the platform about whether generated UUIDs are generated with a - multiprocessing safe method. - -- bpo-29576: Improve some deprecations in importlib. Some deprecated methods - now emit DeprecationWarnings and have better descriptive messages. - -- bpo-29534: Fixed different behaviour of Decimal.from_float() - for _decimal and _pydecimal. Thanks Andrew Nester. - -- Issue #28556: Various updates to typing module: typing.Counter, typing.ChainMap, - improved ABC caching, etc. Original PRs by Jelle Zijlstra, Ivan Levkivskyi, - Manuel Krebber, and Łukasz Langa. - -- Issue #29100: Fix datetime.fromtimestamp() regression introduced in Python - 3.6.0: check minimum and maximum years. - -- Issue #29416: Prevent infinite loop in pathlib.Path.mkdir - -- Issue #29444: Fixed out-of-bounds buffer access in the group() method of - the match object. Based on patch by WGH. - -- Issue #29377: Add SlotWrapperType, MethodWrapperType, and - MethodDescriptorType built-in types to types module. - Original patch by Manuel Krebber. - -- Issue #29218: Unused install_misc command is now removed. It has been - documented as unused since 2000. Patch by Eric N. Vander Weele. - -- Issue #29368: The extend() method is now called instead of the append() - method when unpickle collections.deque and other list-like objects. - This can speed up unpickling to 2 times. - -- Issue #29338: The help of a builtin or extension class now includes the - constructor signature if __text_signature__ is provided for the class. - -- Issue #29335: Fix subprocess.Popen.wait() when the child process has - exited to a stopped instead of terminated state (ex: when under ptrace). - -- Issue #29290: Fix a regression in argparse that help messages would wrap at - non-breaking spaces. - -- Issue #28735: Fixed the comparison of mock.MagickMock with mock.ANY. - -- Issue #29197: Removed deprecated function ntpath.splitunc(). - -- Issue #29210: Removed support of deprecated argument "exclude" in - tarfile.TarFile.add(). - -- Issue #29219: Fixed infinite recursion in the repr of uninitialized - ctypes.CDLL instances. - -- Issue #29192: Removed deprecated features in the http.cookies module. - -- Issue #29193: A format string argument for string.Formatter.format() - is now positional-only. - -- Issue #29195: Removed support of deprecated undocumented keyword arguments - in methods of regular expression objects. - -- Issue #28969: Fixed race condition in C implementation of functools.lru_cache. - KeyError could be raised when cached function with full cache was - simultaneously called from differen threads with the same uncached arguments. - -- Issue #20804: The unittest.mock.sentinel attributes now preserve their - identity when they are copied or pickled. - -- Issue #29142: In urllib.request, suffixes in no_proxy environment variable with - leading dots could match related hostnames again (e.g. .b.c matches a.b.c). - Patch by Milan Oberkirch. - -- Issue #28961: Fix unittest.mock._Call helper: don't ignore the name parameter - anymore. Patch written by Jiajun Huang. - -- Issue #15812: inspect.getframeinfo() now correctly shows the first line of - a context. Patch by Sam Breese. - -- Issue #28985: Update authorizer constants in sqlite3 module. - Patch by Dingyuan Wang. - -- Issue #29094: Offsets in a ZIP file created with extern file object and modes - "w" and "x" now are relative to the start of the file. - -- Issue #29079: Prevent infinite loop in pathlib.resolve() on Windows - -- Issue #13051: Fixed recursion errors in large or resized - curses.textpad.Textbox. Based on patch by Tycho Andersen. - -- Issue #9770: curses.ascii predicates now work correctly with negative - integers. - -- Issue #28427: old keys should not remove new values from - WeakValueDictionary when collecting from another thread. - -- Issue 28923: Remove editor artifacts from Tix.py. - -- Issue #28871: Fixed a crash when deallocate deep ElementTree. - -- Issue #19542: Fix bugs in WeakValueDictionary.setdefault() and - WeakValueDictionary.pop() when a GC collection happens in another - thread. - -- Issue #20191: Fixed a crash in resource.prlimit() when passing a sequence that - doesn't own its elements as limits. - -- Issue #16255: subprocess.Popen uses /system/bin/sh on Android as the shell, - instead of /bin/sh. - -- Issue #28779: multiprocessing.set_forkserver_preload() would crash the - forkserver process if a preloaded module instantiated some - multiprocessing objects such as locks. - -- Issue #26937: The chown() method of the tarfile.TarFile class does not fail - now when the grp module cannot be imported, as for example on Android - platforms. - -- Issue #28847: dbm.dumb now supports reading read-only files and no longer - writes the index file when it is not changed. A deprecation warning is now - emitted if the index file is missed and recreated in the 'r' and 'w' modes - (will be an error in future Python releases). - -- Issue #27030: Unknown escapes consisting of ``'\'`` and an ASCII letter in - re.sub() replacement templates regular expressions now are errors. - -- Issue #28835: Fix a regression introduced in warnings.catch_warnings(): - call warnings.showwarning() if it was overriden inside the context manager. - -- Issue #27172: To assist with upgrades from 2.7, the previously documented - deprecation of ``inspect.getfullargspec()`` has been reversed. This decision - may be revisited again after the Python 2.7 branch is no longer officially - supported. - -- Issue #28740: Add sys.getandroidapilevel(): return the build time API version - of Android as an integer. Function only available on Android. - -- Issue #26273: Add new :data:`socket.TCP_CONGESTION` (Linux 2.6.13) and - :data:`socket.TCP_USER_TIMEOUT` (Linux 2.6.37) constants. Patch written by - Omar Sandoval. - -- Issue #28752: Restored the __reduce__() methods of datetime objects. - -- Issue #28727: Regular expression patterns, _sre.SRE_Pattern objects created - by re.compile(), become comparable (only x==y and x!=y operators). This - change should fix the issue #18383: don't duplicate warning filters when the - warnings module is reloaded (thing usually only done in unit tests). - -- Issue #20572: Remove the subprocess.Popen.wait endtime parameter. It was - deprecated in 3.4 and undocumented prior to that. - -- Issue #25659: In ctypes, prevent a crash calling the from_buffer() and - from_buffer_copy() methods on abstract classes like Array. - -- Issue #28548: In the "http.server" module, parse the protocol version if - possible, to avoid using HTTP 0.9 in some error responses. - -- Issue #19717: Makes Path.resolve() succeed on paths that do not exist. - Patch by Vajrasky Kok - -- Issue #28563: Fixed possible DoS and arbitrary code execution when handle - plural form selections in the gettext module. The expression parser now - supports exact syntax supported by GNU gettext. - -- Issue #28387: Fixed possible crash in _io.TextIOWrapper deallocator when - the garbage collector is invoked in other thread. Based on patch by - Sebastian Cufre. - -- Issue #27517: LZMA compressor and decompressor no longer raise exceptions if - given empty data twice. Patch by Benjamin Fogle. - -- Issue #28549: Fixed segfault in curses's addch() with ncurses6. - -- Issue #28449: tarfile.open() with mode "r" or "r:" now tries to open a tar - file with compression before trying to open it without compression. Otherwise - it had 50% chance failed with ignore_zeros=True. - -- Issue #23262: The webbrowser module now supports Firefox 36+ and derived - browsers. Based on patch by Oleg Broytman. - -- Issue #24241: The webbrowser in an X environment now prefers using the - default browser directly. Also, the webbrowser register() function now has - a documented 'preferred' argument, to specify browsers to be returned by - get() with no arguments. Patch by David Steele - -- Issue #27939: Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused - by representing the scale as float value internally in Tk. tkinter.IntVar - now works if float value is set to underlying Tk variable. - -- Issue #28255: calendar.TextCalendar.prweek() no longer prints a space after - a weeks's calendar. calendar.TextCalendar.pryear() no longer prints redundant - newline after a year's calendar. Based on patch by Xiang Zhang. - -- Issue #28255: calendar.TextCalendar.prmonth() no longer prints a space - at the start of new line after printing a month's calendar. Patch by - Xiang Zhang. - -- Issue #20491: The textwrap.TextWrapper class now honors non-breaking spaces. - Based on patch by Kaarle Ritvanen. - -- Issue #28353: os.fwalk() no longer fails on broken links. - -- Issue #28430: Fix iterator of C implemented asyncio.Future doesn't accept - non-None value is passed to it.send(val). - -- Issue #27025: Generated names for Tkinter widgets now start by the "!" prefix - for readability (was "`"). - -- Issue #25464: Fixed HList.header_exists() in tkinter.tix module by addin - a workaround to Tix library bug. - -- Issue #28488: shutil.make_archive() no longer adds entry "./" to ZIP archive. - -- Issue #25953: re.sub() now raises an error for invalid numerical group - reference in replacement template even if the pattern is not found in - the string. Error message for invalid group reference now includes the - group index and the position of the reference. - Based on patch by SilentGhost. - -- Issue #28469: timeit now uses the sequence 1, 2, 5, 10, 20, 50,... instead - of 1, 10, 100,... for autoranging. - -- Issue #28115: Command-line interface of the zipfile module now uses argparse. - Added support of long options. - -- Issue #18219: Optimize csv.DictWriter for large number of columns. - Patch by Mariatta Wijaya. - -- Issue #28448: Fix C implemented asyncio.Future didn't work on Windows. - -- Issue #23214: In the "io" module, the argument to BufferedReader and - BytesIO's read1() methods is now optional and can be -1, matching the - BufferedIOBase specification. - -- Issue #28480: Fix error building socket module when multithreading is - disabled. - -- Issue #28240: timeit: remove ``-c/--clock`` and ``-t/--time`` command line - options which were deprecated since Python 3.3. - -- Issue #28240: timeit now repeats the benchmarks 5 times instead of only 3 - to make benchmarks more reliable. - -- Issue #28240: timeit autorange now uses a single loop iteration if the - benchmark takes less than 10 seconds, instead of 10 iterations. - "python3 -m timeit -s 'import time' 'time.sleep(1)'" now takes 4 seconds - instead of 40 seconds. - -- Distutils.sdist now looks for README and setup.py files with case - sensitivity. This behavior matches that found in Setuptools 6.0 and - later. See `setuptools 100 - `_ for rationale. - -- Issue #24452: Make webbrowser support Chrome on Mac OS X. Patch by - Ned Batchelder. - -- Issue #20766: Fix references leaked by pdb in the handling of SIGINT - handlers. - -- Issue #27998: Fixed bytes path support in os.scandir() on Windows. - Patch by Eryk Sun. - -- Issue #28317: The disassembler now decodes FORMAT_VALUE argument. - -- Issue #26293: Fixed writing ZIP files that starts not from the start of the - file. Offsets in ZIP file now are relative to the start of the archive in - conforming to the specification. - -- Issue #28380: unittest.mock Mock autospec functions now properly support - assert_called, assert_not_called, and assert_called_once. - -- Issue #28229: lzma module now supports pathlib. - -- Issue #28321: Fixed writing non-BMP characters with binary format in plistlib. - -- Issue #28225: bz2 module now supports pathlib. Initial patch by Ethan Furman. - -- Issue #28227: gzip now supports pathlib. Patch by Ethan Furman. - -- Issue #28332: Deprecated silent truncations in socket.htons and socket.ntohs. - Original patch by Oren Milman. - -- Issue #27358: Optimized merging var-keyword arguments and improved error - message when passing a non-mapping as a var-keyword argument. - -- Issue #28257: Improved error message when passing a non-iterable as - a var-positional argument. Added opcode BUILD_TUPLE_UNPACK_WITH_CALL. - -- Issue #28322: Fixed possible crashes when unpickle itertools objects from - incorrect pickle data. Based on patch by John Leitch. - -- Issue #28228: imghdr now supports pathlib. - -- Issue #28226: compileall now supports pathlib. - -- Issue #28314: Fix function declaration (C flags) for the getiterator() method - of xml.etree.ElementTree.Element. - -- Issue #28148: Stop using localtime() and gmtime() in the time - module. - - Introduced platform independent _PyTime_localtime API that is - similar to POSIX localtime_r, but available on all platforms. Patch - by Ed Schouten. - -- Issue #28253: Fixed calendar functions for extreme months: 0001-01 - and 9999-12. - - Methods itermonthdays() and itermonthdays2() are reimplemented so - that they don't call itermonthdates() which can cause datetime.date - under/overflow. - -- Issue #28275: Fixed possible use after free in the decompress() - methods of the LZMADecompressor and BZ2Decompressor classes. - Original patch by John Leitch. - -- Issue #27897: Fixed possible crash in sqlite3.Connection.create_collation() - if pass invalid string-like object as a name. Patch by Xiang Zhang. - -- Issue #18844: random.choices() now has k as a keyword-only argument - to improve the readability of common cases and come into line - with the signature used in other languages. - -- Issue #18893: Fix invalid exception handling in Lib/ctypes/macholib/dyld.py. - Patch by Madison May. - -- Issue #27611: Fixed support of default root window in the tkinter.tix module. - Added the master parameter in the DisplayStyle constructor. - -- Issue #27348: In the traceback module, restore the formatting of exception - messages like "Exception: None". This fixes a regression introduced in - 3.5a2. - -- Issue #25651: Allow falsy values to be used for msg parameter of subTest(). - -- Issue #27778: Fix a memory leak in os.getrandom() when the getrandom() is - interrupted by a signal and a signal handler raises a Python exception. - -- Issue #28200: Fix memory leak on Windows in the os module (fix - path_converter() function). - -- Issue #25400: RobotFileParser now correctly returns default values for - crawl_delay and request_rate. Initial patch by Peter Wirtz. - -- Issue #27932: Prevent memory leak in win32_ver(). - -- Fix UnboundLocalError in socket._sendfile_use_sendfile. - -- Issue #28075: Check for ERROR_ACCESS_DENIED in Windows implementation of - os.stat(). Patch by Eryk Sun. - -- Issue #22493: Warning message emitted by using inline flags in the middle of - regular expression now contains a (truncated) regex pattern. - Patch by Tim Graham. - -- Issue #25270: Prevent codecs.escape_encode() from raising SystemError when - an empty bytestring is passed. - -- Issue #28181: Get antigravity over HTTPS. Patch by Kaartic Sivaraam. - -- Issue #25895: Enable WebSocket URL schemes in urllib.parse.urljoin. - Patch by Gergely Imreh and Markus Holtermann. - -- Issue #28114: Fix a crash in parse_envlist() when env contains byte strings. - Patch by Eryk Sun. - -- Issue #27599: Fixed buffer overrun in binascii.b2a_qp() and binascii.a2b_qp(). - -- Issue #27906: Fix socket accept exhaustion during high TCP traffic. - Patch by Kevin Conway. - -- Issue #28174: Handle when SO_REUSEPORT isn't properly supported. - Patch by Seth Michael Larson. - -- Issue #26654: Inspect functools.partial in asyncio.Handle.__repr__. - Patch by iceboy. - -- Issue #26909: Fix slow pipes IO in asyncio. - Patch by INADA Naoki. - -- Issue #28176: Fix callbacks race in asyncio.SelectorLoop.sock_connect. - -- Issue #27759: Fix selectors incorrectly retain invalid file descriptors. - Patch by Mark Williams. - -- Issue #28325: Remove vestigial MacOS 9 macurl2path module and its tests. - -- Issue #28368: Refuse monitoring processes if the child watcher has - no loop attached. - Patch by Vincent Michel. - -- Issue #28369: Raise RuntimeError when transport's FD is used with - add_reader, add_writer, etc. - -- Issue #28370: Speedup asyncio.StreamReader.readexactly. - Patch by Коренберг Марк. - -- Issue #28371: Deprecate passing asyncio.Handles to run_in_executor. - -- Issue #28372: Fix asyncio to support formatting of non-python coroutines. - -- Issue #28399: Remove UNIX socket from FS before binding. - Patch by Коренберг Марк. - -- Issue #27972: Prohibit Tasks to await on themselves. - -- Issue #24142: Reading a corrupt config file left configparser in an - invalid state. Original patch by Florian Höch. - -- Issue #29581: ABCMeta.__new__ now accepts **kwargs, allowing abstract base - classes to use keyword parameters in __init_subclass__. Patch by Nate Soares. - -Windows -------- - -- bpo-29579: Removes readme.txt from the installer. - -- Issue #25778: winreg does not truncate string correctly (Patch by Eryk Sun) - -- Issue #28896: Deprecate WindowsRegistryFinder and disable it by default - -- Issue #28522: Fixes mishandled buffer reallocation in getpathp.c - -- Issue #28402: Adds signed catalog files for stdlib on Windows. - -- Issue #28333: Enables Unicode for ps1/ps2 and input() prompts. (Patch by - Eryk Sun) - -- Issue #28251: Improvements to help manuals on Windows. - -- Issue #28110: launcher.msi has different product codes between 32-bit and - 64-bit - -- Issue #28161: Opening CON for write access fails - -- Issue #28162: WindowsConsoleIO readall() fails if first line starts with - Ctrl+Z - -- Issue #28163: WindowsConsoleIO fileno() passes wrong flags to - _open_osfhandle - -- Issue #28164: _PyIO_get_console_type fails for various paths - -- Issue #28137: Renames Windows path file to ._pth - -- Issue #28138: Windows ._pth file should allow import site - -C API ------ - -- Issue #27867: Function PySlice_GetIndicesEx() is deprecated and replaced with - a macro if Py_LIMITED_API is not set or set to the value between 0x03050400 - and 0x03060000 (not including) or 0x03060100 or higher. Added functions - PySlice_Unpack() and PySlice_AdjustIndices(). - -- Issue #29083: Fixed the declaration of some public API functions. - PyArg_VaParse() and PyArg_VaParseTupleAndKeywords() were not available in - limited API. PyArg_ValidateKeywordArguments(), PyArg_UnpackTuple() and - Py_BuildValue() were not available in limited API of version < 3.3 when - PY_SSIZE_T_CLEAN is defined. - -- Issue #28769: The result of PyUnicode_AsUTF8AndSize() and PyUnicode_AsUTF8() - is now of type ``const char *`` rather of ``char *``. - -- Issue #29058: All stable API extensions added after Python 3.2 are now - available only when Py_LIMITED_API is set to the PY_VERSION_HEX value of - the minimum Python version supporting this API. - -Library -------- - - bpo-29800: Fix crashes in partial.__repr__ if the keys of partial.keywords are not strings. Patch by Michael Seifert. @@ -966,7 +168,6 @@ Library - bpo-29110: Fix file object leak in aifc.open() when file is given as a filesystem path and is not in valid AIFF format. Patch by Anthony Zhang. -- Issue #24932: Use proper command line parsing in _testembed - Issue #28556: Various updates to typing module: typing.Counter, typing.ChainMap, improved ABC caching, etc. Original PRs by Jelle Zijlstra, Ivan Levkivskyi, From 1688e64925967ba41df682211efaa8d066c4b3e2 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 21 Mar 2017 20:39:58 -0400 Subject: [PATCH 0164/2287] Bump to 3.6.2rc1 development. --- Include/patchlevel.h | 2 +- Misc/NEWS | 50 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 54a9ab6ff78896..a658e9f5840e1c 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -23,7 +23,7 @@ #define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.6.1" +#define PY_VERSION "3.6.1+" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Misc/NEWS b/Misc/NEWS index 4807bd0fcc3b3f..bb37f0479ebc34 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2,6 +2,56 @@ Python News +++++++++++ +What's New in Python 3.6.2 release candidate 1? +=============================================== + +*Release date: XXXX-XX-XX* + +Core and Builtins +----------------- + +- bpo-29859: Show correct error messages when any of the pthread_* calls in + thread_pthread.h fails. + +- bpo-28876: ``bool(range)`` works even if ``len(range)`` + raises :exc:`OverflowError`. + +- bpo-29600: Fix wrapping coroutine return values in StopIteration. + +- bpo-28856: Fix an oversight that %b format for bytes should support objects + follow the buffer protocol. + +- bpo-29714: Fix a regression that bytes format may fail when containing zero + bytes inside. + +Library +------- + +- bpo-25455: Fixed crashes in repr of recursive buffered file-like objects. + +- bpo-29800: Fix crashes in partial.__repr__ if the keys of partial.keywords + are not strings. Patch by Michael Seifert. + +- bpo-29742: get_extra_info() raises exception if get called on closed ssl transport. + Patch by Nikolay Kim. + +- bpo-8256: Fixed possible failing or crashing input() if attributes "encoding" + or "errors" of sys.stdin or sys.stdout are not set or are not strings. + +- bpo-28298: Fix a bug that prevented array 'Q', 'L' and 'I' from accepting big + intables (objects that have __int__) as elements. Patch by Oren Milman. + +- bpo-28231: The zipfile module now accepts path-like objects for external + paths. + +- bpo-26915: index() and count() methods of collections.abc.Sequence now + check identity before checking equality when do comparisons. + +- bpo-29615: SimpleXMLRPCDispatcher no longer chains KeyError (or any other + exception) to exception(s) raised in the dispatched methods. + Patch by Petr Motejlek. + + What's New in Python 3.6.1? =========================== From af839fe2fef12dbbc8083fc7f01daee48a85a916 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 22 Mar 2017 07:45:23 +0200 Subject: [PATCH 0165/2287] bpo-29864: Don't use Py_SIZE for dict object. (#747) (#750) --- Objects/dictobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/dictobject.c b/Objects/dictobject.c index a0c1977037b9e6..8bcc931148beaa 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1929,7 +1929,7 @@ _PyDict_FromKeys(PyObject *cls, PyObject *iterable, PyObject *value) PyObject *key; Py_hash_t hash; - if (dictresize(mp, ESTIMATE_SIZE(Py_SIZE(iterable)))) { + if (dictresize(mp, ESTIMATE_SIZE(((PyDictObject *)iterable)->ma_used))) { Py_DECREF(d); return NULL; } From 72c51136c6269112f4c37ef14f972c89b92c272c Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Wed, 22 Mar 2017 15:26:53 +0800 Subject: [PATCH 0166/2287] fix function name in tabnanny documentation (GH-762) --- Doc/library/tabnanny.rst | 8 ++++---- Lib/tabnanny.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/library/tabnanny.rst b/Doc/library/tabnanny.rst index 1edb0fbabb2023..dfe688a2f93e0c 100644 --- a/Doc/library/tabnanny.rst +++ b/Doc/library/tabnanny.rst @@ -48,14 +48,14 @@ described below. .. exception:: NannyNag - Raised by :func:`tokeneater` if detecting an ambiguous indent. Captured and + Raised by :func:`process_tokens` if detecting an ambiguous indent. Captured and handled in :func:`check`. -.. function:: tokeneater(type, token, start, end, line) +.. function:: process_tokens(tokens) - This function is used by :func:`check` as a callback parameter to the function - :func:`tokenize.tokenize`. + This function is used by :func:`check` to process tokens generated by the + :mod:`tokenize` module. .. XXX document errprint, format_witnesses, Whitespace, check_equal, indents, reset_globals diff --git a/Lib/tabnanny.py b/Lib/tabnanny.py index 46e0f56a392ae6..bfb670c9027d76 100755 --- a/Lib/tabnanny.py +++ b/Lib/tabnanny.py @@ -59,7 +59,7 @@ def main(): class NannyNag(Exception): """ - Raised by tokeneater() if detecting an ambiguous indent. + Raised by process_tokens() if detecting an ambiguous indent. Captured and handled in check(). """ def __init__(self, lineno, msg, line): From c0f3e21a23356133c30926b6cdf3e0e70cbc8486 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Wed, 22 Mar 2017 17:14:03 +0900 Subject: [PATCH 0167/2287] doc: minor fix for library/profile (GH-766) (cherry picked from commit bd3d8ba3b22da0bad018b53a3e6610ae03c5aa49) --- Doc/library/profile.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst index bd67fe486abf77..b4b1479e2ceba4 100644 --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -85,11 +85,11 @@ next line: ``Ordered by: standard name``, indicates that the text string in the far right column was used to sort the output. The column headings include: ncalls - for the number of calls, + for the number of calls. tottime - for the total time spent in the given function (and excluding time made in - calls to sub-functions) + for the total time spent in the given function (and excluding time made in + calls to sub-functions) percall is the quotient of ``tottime`` divided by ``ncalls`` From 906118d8c68160ed4a3d15cec803d1ee57836517 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Wed, 22 Mar 2017 21:09:41 +0900 Subject: [PATCH 0168/2287] bpo-28331: fix impl-detail label is removed when content is translated. (GH-769) (cherry picked from commit c351ce6a2c923c5016e48ecbf7b1e4833031d154) --- Doc/tools/extensions/pyspecific.py | 14 ++++++++++++-- Doc/tools/templates/dummy.html | 6 ++++++ 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 Doc/tools/templates/dummy.html diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index 1141d6c5ac1891..865f2edee02205 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -21,6 +21,7 @@ from sphinx import addnodes from sphinx.builders import Builder +from sphinx.locale import translators from sphinx.util.nodes import split_explicit_title from sphinx.util.compat import Directive from sphinx.writers.html import HTMLTranslator @@ -103,16 +104,25 @@ class ImplementationDetail(Directive): optional_arguments = 1 final_argument_whitespace = True + # This text is copied to templates/dummy.html + label_text = 'CPython implementation detail:' + def run(self): pnode = nodes.compound(classes=['impl-detail']) + label = translators['sphinx'].gettext(self.label_text) content = self.content - add_text = nodes.strong('CPython implementation detail:', - 'CPython implementation detail:') + add_text = nodes.strong(label, label) if self.arguments: n, m = self.state.inline_text(self.arguments[0], self.lineno) pnode.append(nodes.paragraph('', '', *(n + m))) self.state.nested_parse(content, self.content_offset, pnode) if pnode.children and isinstance(pnode[0], nodes.paragraph): + content = nodes.inline(pnode[0].rawsource, translatable=True) + content.source = pnode[0].source + content.line = pnode[0].line + content += pnode[0].children + pnode[0].replace_self(nodes.paragraph('', '', content, + translatable=False)) pnode[0].insert(0, add_text) pnode[0].insert(1, nodes.Text(' ')) else: diff --git a/Doc/tools/templates/dummy.html b/Doc/tools/templates/dummy.html new file mode 100644 index 00000000000000..6e43be23230b54 --- /dev/null +++ b/Doc/tools/templates/dummy.html @@ -0,0 +1,6 @@ +This file is not an actual template, but used to add some +texts in extensions to sphinx.pot file. + +In extensions/pyspecific.py: + +{% trans %}CPython implementation detail:{% endtrans %} From ee51327a2329eb9c2bfbb6ea673cfab4299450b0 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 22 Mar 2017 18:56:56 -0700 Subject: [PATCH 0169/2287] Remove an outdated statement in execution model docs (GH-754) (GH-775) (cherry picked from commit fad7f1560669af1766c583c7ef242c55d8c8de41) --- Doc/reference/executionmodel.rst | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Doc/reference/executionmodel.rst b/Doc/reference/executionmodel.rst index 5f1ea92ed460f3..f0dbbd1edf6321 100644 --- a/Doc/reference/executionmodel.rst +++ b/Doc/reference/executionmodel.rst @@ -194,12 +194,6 @@ This means that the following code will print 42:: i = 42 f() -There are several cases where Python statements are illegal when used in -conjunction with nested scopes that contain free variables. - -If a variable is referenced in an enclosing scope, it is illegal to delete the -name. An error will be reported at compile time. - .. XXX from * also invalid with relative imports (at least currently) The :func:`eval` and :func:`exec` functions do not have access to the full From 90eafdb1546604c0e9bc207723484b6816570cfe Mon Sep 17 00:00:00 2001 From: Christophe Zeitouny Date: Fri, 24 Mar 2017 04:20:40 -0700 Subject: [PATCH 0170/2287] faulthandler: Restore the old sigaltstack during teardown (GH-777) (GH-797) (cherry picked from commit 20fbf8accd494fd15b0fc4c84928178c71ead4d1) --- Misc/ACKS | 1 + Misc/NEWS | 3 +++ Modules/faulthandler.c | 17 ++++++++++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Misc/ACKS b/Misc/ACKS index 03afeb8f3876ee..2b23702f22910c 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1709,6 +1709,7 @@ Artur Zaprzala Mike Zarnstorff Yury V. Zaytsev Siebren van der Zee +Christophe Zeitouny Nickolai Zeldovich Yuxiao Zeng Uwe Zessin diff --git a/Misc/NEWS b/Misc/NEWS index 1835d1e389d725..687c5c06ef9bdb 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Core and Builtins Library ------- +- bpo-29884: faulthandler: Restore the old sigaltstack during teardown. + Patch by Christophe Zeitouny. + - bpo-25455: Fixed crashes in repr of recursive buffered file-like objects. - bpo-29800: Fix crashes in partial.__repr__ if the keys of partial.keywords diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index 1c1e4fb7d17760..2f8b624fd160d9 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -124,6 +124,7 @@ static const size_t faulthandler_nsignals = \ #ifdef HAVE_SIGALTSTACK static stack_t stack; +static stack_t old_stack; #endif @@ -1310,7 +1311,7 @@ int _PyFaulthandler_Init(void) stack.ss_size = SIGSTKSZ; stack.ss_sp = PyMem_Malloc(stack.ss_size); if (stack.ss_sp != NULL) { - err = sigaltstack(&stack, NULL); + err = sigaltstack(&stack, &old_stack); if (err) { PyMem_Free(stack.ss_sp); stack.ss_sp = NULL; @@ -1366,6 +1367,20 @@ void _PyFaulthandler_Fini(void) faulthandler_disable(); #ifdef HAVE_SIGALTSTACK if (stack.ss_sp != NULL) { + /* Fetch the current alt stack */ + stack_t current_stack; + if (sigaltstack(NULL, ¤t_stack) == 0) { + if (current_stack.ss_sp == stack.ss_sp) { + /* The current alt stack is the one that we installed. + It is safe to restore the old stack that we found when + we installed ours */ + sigaltstack(&old_stack, NULL); + } else { + /* Someone switched to a different alt stack and didn't + restore ours when they were done (if they're done). + There's not much we can do in this unlikely case */ + } + } PyMem_Free(stack.ss_sp); stack.ss_sp = NULL; } From cc3331fec8b7a61c3f06c097eac85bfa38490758 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Fri, 24 Mar 2017 14:45:34 +0100 Subject: [PATCH 0171/2287] bpo-29861: release references to multiprocessing Pool tasks (#743) (#800) * bpo-29861: release references to multiprocessing Pool tasks (#743) * bpo-29861: release references to multiprocessing Pool tasks Release references to tasks, their arguments and their results as soon as they are finished, instead of keeping them alive until another task arrives. * Comments in test (cherry picked from commit 8988945cdc27ffa86ba8c624e095b51c459f5154) * Fix Misc/NEWS (hopefully) --- Lib/multiprocessing/pool.py | 7 ++++++- Lib/test/_test_multiprocessing.py | 28 ++++++++++++++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py index ffdf42614d59eb..ae8cec44796b21 100644 --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -128,6 +128,8 @@ def worker(inqueue, outqueue, initializer=None, initargs=(), maxtasks=None, util.debug("Possible encoding error while sending result: %s" % ( wrapped)) put((job, i, (False, wrapped))) + + task = job = result = func = args = kwds = None completed += 1 util.debug('worker exiting after %d tasks' % completed) @@ -402,10 +404,11 @@ def _handle_tasks(taskqueue, put, outqueue, pool, cache): if set_length: util.debug('doing set_length()') set_length(i+1) + finally: + task = taskseq = job = None else: util.debug('task handler got sentinel') - try: # tell result handler to finish when cache is empty util.debug('task handler sending sentinel to result handler') @@ -445,6 +448,7 @@ def _handle_results(outqueue, get, cache): cache[job]._set(i, obj) except KeyError: pass + task = job = obj = None while cache and thread._state != TERMINATE: try: @@ -461,6 +465,7 @@ def _handle_results(outqueue, get, cache): cache[job]._set(i, obj) except KeyError: pass + task = job = obj = None if hasattr(outqueue, '_reader'): util.debug('ensuring that outqueue is not full') diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index b5f47825466de6..1d3bb0f8bae781 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -18,6 +18,7 @@ import logging import struct import operator +import weakref import test.support import test.support.script_helper @@ -1738,6 +1739,19 @@ def raise_large_valuerror(wait): time.sleep(wait) raise ValueError("x" * 1024**2) +def identity(x): + return x + +class CountedObject(object): + n_instances = 0 + + def __new__(cls): + cls.n_instances += 1 + return object.__new__(cls) + + def __del__(self): + type(self).n_instances -= 1 + class SayWhenError(ValueError): pass def exception_throwing_generator(total, when): @@ -1746,6 +1760,7 @@ def exception_throwing_generator(total, when): raise SayWhenError("Somebody said when") yield i + class _TestPool(BaseTestCase): @classmethod @@ -2000,6 +2015,19 @@ def test_map_no_failfast(self): # check that we indeed waited for all jobs self.assertGreater(time.time() - t_start, 0.9) + def test_release_task_refs(self): + # Issue #29861: task arguments and results should not be kept + # alive after we are done with them. + objs = [CountedObject() for i in range(10)] + refs = [weakref.ref(o) for o in objs] + self.pool.map(identity, objs) + + del objs + self.assertEqual(set(wr() for wr in refs), {None}) + # With a process pool, copies of the objects are returned, check + # they were released too. + self.assertEqual(CountedObject.n_instances, 0) + def raising(): raise KeyError("key") diff --git a/Misc/NEWS b/Misc/NEWS index 687c5c06ef9bdb..0c7eaea5a8b65c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Core and Builtins Library ------- +- bpo-29861: Release references to tasks, their arguments and their results + as soon as they are finished in multiprocessing.Pool. + - bpo-29884: faulthandler: Restore the old sigaltstack during teardown. Patch by Christophe Zeitouny. From 8c8785b2f8e4048cef350f89c686266f4519b67c Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 24 Mar 2017 21:46:25 +0200 Subject: [PATCH 0172/2287] =?UTF-8?q?bpo-25803:=20Avoid=20incorrect=20erro?= =?UTF-8?q?rs=20raised=20by=20Path.mkdir(exist=5Fok=3DTrue)=E2=80=A6=20(#8?= =?UTF-8?q?06)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit when the OS gives priority to errors such as EACCES over EEXIST. (cherry picked from commit af7b9ec5c855366feef4c67dc492d64b3baf84ca) --- Lib/pathlib.py | 32 +++++++++++++++----------------- Lib/test/test_pathlib.py | 5 +++++ Misc/NEWS | 3 +++ 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 9f347216b183a9..8c1cb96bad3075 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -1220,25 +1220,23 @@ def touch(self, mode=0o666, exist_ok=True): os.close(fd) def mkdir(self, mode=0o777, parents=False, exist_ok=False): + """ + Create a new directory at this given path. + """ if self._closed: self._raise_closed() - if not parents: - try: - self._accessor.mkdir(self, mode) - except FileExistsError: - if not exist_ok or not self.is_dir(): - raise - else: - try: - self._accessor.mkdir(self, mode) - except FileExistsError: - if not exist_ok or not self.is_dir(): - raise - except OSError as e: - if e.errno != ENOENT or self.parent == self: - raise - self.parent.mkdir(parents=True) - self._accessor.mkdir(self, mode) + try: + self._accessor.mkdir(self, mode) + except FileNotFoundError: + if not parents or self.parent == self: + raise + self.parent.mkdir(parents=True) + self._accessor.mkdir(self, mode) + except OSError: + # Cannot rely on checking for EEXIST, since the operating system + # could give priority to other errors like EACCES or EROFS + if not exist_ok or not self.is_dir(): + raise def chmod(self, mode): """ diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 88a93e5802c1cb..3ff9726d4359ec 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1776,6 +1776,11 @@ def test_mkdir_exist_ok_with_parent(self): self.assertTrue(p.exists()) self.assertEqual(p.stat().st_ctime, st_ctime_first) + def test_mkdir_exist_ok_root(self): + # Issue #25803: A drive root could raise PermissionError on Windows + self.cls('/').resolve().mkdir(exist_ok=True) + self.cls('/').resolve().mkdir(parents=True, exist_ok=True) + @only_nt # XXX: not sure how to test this on POSIX def test_mkdir_with_unknown_drive(self): for d in 'ZYXWVUTSRQPONMLKJIHGFEDCBA': diff --git a/Misc/NEWS b/Misc/NEWS index 0c7eaea5a8b65c..9798a3a4490cbe 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Core and Builtins Library ------- +- bpo-25803: Avoid incorrect errors raised by Path.mkdir(exist_ok=True) + when the OS gives priority to errors such as EACCES over EEXIST. + - bpo-29861: Release references to tasks, their arguments and their results as soon as they are finished in multiprocessing.Pool. From 74bfcc314b188e1e8c90e442270e36d6510755ee Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 24 Mar 2017 14:18:53 -0700 Subject: [PATCH 0173/2287] bpo-28810: Document remaining bytecode changes in 3.6 (GH-651) (GH-808) (cherry picked from commit 8f9e1bbf2dbdf46a0bf920279568a31460043376) --- Doc/library/dis.rst | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 11d056901b7ad5..c795782034a464 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -20,6 +20,10 @@ interpreter. between versions of Python. Use of this module should not be considered to work across Python VMs or Python releases. + .. versionchanged:: 3.6 + Use 2 bytes for each instruction. Previously the number of bytes varied + by instruction. + Example: Given the function :func:`myfunc`:: @@ -210,6 +214,11 @@ operation is being performed, so the intermediate analysis object isn't useful: This generator function uses the ``co_firstlineno`` and ``co_lnotab`` attributes of the code object *code* to find the offsets which are starts of lines in the source code. They are generated as ``(offset, lineno)`` pairs. + See :source:`Objects/lnotab_notes.txt` for the ``co_lnotab`` format and + how to decode it. + + .. versionchanged:: 3.6 + Line numbers can be decreasing. Before, they were always increasing. .. function:: findlabels(code) @@ -1105,8 +1114,13 @@ All of the following opcodes use their arguments. .. opcode:: HAVE_ARGUMENT This is not really an opcode. It identifies the dividing line between - opcodes which don't take arguments ``< HAVE_ARGUMENT`` and those which do - ``>= HAVE_ARGUMENT``. + opcodes which don't use their argument and those that do + (``< HAVE_ARGUMENT`` and ``>= HAVE_ARGUMENT``, respectively). + + .. versionchanged:: 3.6 + Now every instruction has an argument, but opcodes ``< HAVE_ARGUMENT`` + ignore it. Before, only opcodes ``>= HAVE_ARGUMENT`` had an argument. + .. _opcode_collections: From 5dafaece67cb576ef96579fb5ddcbf62e0827b0d Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 24 Mar 2017 20:04:40 -0700 Subject: [PATCH 0174/2287] bpo-29892: Fix wrong markup on doc-lib-functions (GH-802) (GH-810) (cherry picked from commit 29540cdf6c66df9f806375a95078c0c63192ef78) --- Doc/library/functions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index c26037bd9eef19..64c9569766cc7d 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1072,7 +1072,7 @@ are always available. They are listed here in alphabetical order. * The ``'x'`` mode was added. * :exc:`IOError` used to be raised, it is now an alias of :exc:`OSError`. * :exc:`FileExistsError` is now raised if the file opened in exclusive - * creation mode (``'x'``) already exists. + creation mode (``'x'``) already exists. .. versionchanged:: 3.4 From 8b82236952619c3838865ff535e5ce77b59b4a78 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 25 Mar 2017 03:41:59 -0700 Subject: [PATCH 0175/2287] bpo-29862: Fix grammar in importlib.reload() exception (GH-809) (GH-811) (cherry picked from commit 9f0aa4843f8c26937d5817f27cac4aae9c0a034f) --- Lib/importlib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/importlib/__init__.py b/Lib/importlib/__init__.py index b6a9f82e05f268..8b11d22b024ffa 100644 --- a/Lib/importlib/__init__.py +++ b/Lib/importlib/__init__.py @@ -136,7 +136,7 @@ def reload(module): """ if not module or not isinstance(module, types.ModuleType): - raise TypeError("reload() argument must be module") + raise TypeError("reload() argument must be a module") try: name = module.__spec__.name except AttributeError: From ceff32fb833e7be42508ffa73344e2e56865e54b Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Sun, 26 Mar 2017 13:58:13 -0400 Subject: [PATCH 0176/2287] bpo-29888: Fix the link referring to the "Python download page" (GH-824) (GH-826) (cherry picked from commit f8beb9831acd5cf80b9c56aea5864e16118c5400) --- Doc/tools/templates/download.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/tools/templates/download.html b/Doc/tools/templates/download.html index de84ae3abc81c7..3a05cb697938fd 100644 --- a/Doc/tools/templates/download.html +++ b/Doc/tools/templates/download.html @@ -42,7 +42,7 @@

Download Python {{ release }} Documentation

These archives contain all the content in the documentation.

HTML Help (.chm) files are made available in the "Windows" section -on the Python +on the Python download page.

From d2fc7824104172b47cdcea09d7ce699d5bfc2ba6 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 26 Mar 2017 19:53:37 -0700 Subject: [PATCH 0177/2287] import sys before we use it on line 9 (GH-828) (GH-833) (cherry picked from commit 0579e81f30d00da562f021760d5b6a9c35186520) --- Lib/idlelib/pyshell.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index f3ee391ca006fc..dd6c997abc587b 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -1,5 +1,7 @@ #! /usr/bin/env python3 +import sys + try: from tkinter import * except ImportError: @@ -25,7 +27,6 @@ import re import socket import subprocess -import sys import threading import time import tokenize From abc68484b2c523b500802cb8e8913531e0ff9a8d Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Sun, 26 Mar 2017 22:53:57 -0500 Subject: [PATCH 0178/2287] Treat Sphinx warnings as errors (GH-832) (GH-834) * Treat Sphinx warnings as errors (GH-832) (cherry picked from commit 334e9ec938ea9876baadef15edb135d6d2aff30c) * Remove unused suspicious rules --- .travis.yml | 2 +- Doc/tools/susp-ignored.csv | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 66f03dc7161a7f..3496a1abba2c97 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,7 +39,7 @@ matrix: - cd Doc - make venv script: - - make check suspicious html PYTHON="./venv/bin/python" SPHINXBUILD="./venv/bin/python -m sphinx" SPHINXOPTS="-q" + - make check suspicious html PYTHON="./venv/bin/python" SPHINXBUILD="./venv/bin/python -m sphinx" SPHINXOPTS="-q -W" - os: linux language: c compiler: clang diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index c6e03119ae9730..166374cb90cec1 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -324,6 +324,4 @@ whatsnew/3.5,,::,>>> addr6 = ipaddress.IPv6Address('::1') whatsnew/3.5,,:root,ERROR:root:exception whatsnew/3.5,,:exception,ERROR:root:exception whatsnew/changelog,,:version,import sys; I = version[:version.index(' ')] -whatsnew/changelog,,:gz,": TarFile opened with external fileobj and ""w:gz"" mode didn't" -whatsnew/changelog,,::,": Use ""127.0.0.1"" or ""::1"" instead of ""localhost"" as much as" whatsnew/changelog,,`,"for readability (was ""`"")." From bc2031470eac4b199692921b4e97730c85ceb678 Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Mon, 27 Mar 2017 00:35:56 -0500 Subject: [PATCH 0179/2287] Minor test cleanup (GH-837) (GH-838) * Remove unused test file * Remove duplicated text in sndhdrdata README (cherry picked from commit b8a7daf077dab18e9e3701c5380b542ae0aa9a94) --- Lib/test/185test.db | Bin 16384 -> 0 bytes Lib/test/sndhdrdata/README | 7 ------- 2 files changed, 7 deletions(-) delete mode 100644 Lib/test/185test.db diff --git a/Lib/test/185test.db b/Lib/test/185test.db deleted file mode 100644 index 14cb5e258bc0961fa22527dcb5d947a6a0fd5480..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI!F$%&k6vpwdEl39?E*_+VxVZETo - -Sound file samples used by Lib/test/test_sndhdr.py and generated using the -following commands: - - dd if=/dev/zero of=sndhdr.raw bs=20 count=1 - sox -s -2 -c 2 -r 44100 sndhdr.raw sndhdr. - From 08f9f71162dedeec51ad99bac1b26eb0ab014400 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Mon, 27 Mar 2017 16:46:31 -0700 Subject: [PATCH 0180/2287] Drop the standard gcc test build on Travis (GH-853) (GH-859) Instead have gcc be used for the coverage build so gcc is exercised in at least one place. (cherry picked from commit ad2f9e2c8a0b44b3e6aec9d28ba59e13239236f7) --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3496a1abba2c97..5fee6cd7673324 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,11 +15,11 @@ os: - linux # macOS builds are disabled as the machines are under-provisioned on Travis, # adding up to an extra hour completing a full CI run. - #- osx compiler: - clang - - gcc + # gcc also works, but to keep the # of concurrent builds down, we use one C + # compiler here and the other to run the coverage build. env: - TESTING=cpython @@ -32,7 +32,7 @@ matrix: include: - os: linux language: python - python: 3.5 + python: 3.6 env: - TESTING=docs before_script: @@ -42,7 +42,7 @@ matrix: - make check suspicious html PYTHON="./venv/bin/python" SPHINXBUILD="./venv/bin/python -m sphinx" SPHINXOPTS="-q -W" - os: linux language: c - compiler: clang + compiler: gcc env: - TESTING=coverage before_script: From 596506216104613591218c2896cdb49fa0b7e5bb Mon Sep 17 00:00:00 2001 From: Mariatta Date: Mon, 27 Mar 2017 17:02:29 -0700 Subject: [PATCH 0181/2287] bpo-29677: DOC: clarify documentation for `round` (GH-357) (GH-862) (cherry picked from commit 6003db7db5fec545c01923c198a5fdfca5a91538) --- Doc/library/functions.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 64c9569766cc7d..2c0ea71c47f413 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1262,7 +1262,8 @@ are always available. They are listed here in alphabetical order. closest multiple of 10 to the power minus *ndigits*; if two multiples are equally close, rounding is done toward the even choice (so, for example, both ``round(0.5)`` and ``round(-0.5)`` are ``0``, and ``round(1.5)`` is - ``2``). The return value is an integer if called with one argument, + ``2``). Any integer value is valid for *ndigits* (positive, zero, or + negative). The return value is an integer if called with one argument, otherwise of the same type as *number*. .. note:: From f01de61a8efea8319c65365898982f929d59a895 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Wed, 29 Mar 2017 00:25:26 +0900 Subject: [PATCH 0182/2287] bpo-29643: Fix check for --enable-optimizations (GH-869) The presence of the ``--enable-optimizations`` flag is indicated by the value of ``$enableval``, but the configure script was checking ``$withval``, resulting in the ``--enable-optimizations`` flag being effectively ignored. (cherry picked from commit 8cea5929f52801b0ce5928b46ef836e99a24321a) --- Misc/NEWS | 5 +++++ configure | 2 +- configure.ac | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 9798a3a4490cbe..45c5c7828701f8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -60,6 +60,11 @@ Library exception) to exception(s) raised in the dispatched methods. Patch by Petr Motejlek. +Build +----- + +- bpo-29643: Fix ``--enable-optimization`` didn't work. + What's New in Python 3.6.1? =========================== diff --git a/configure b/configure index abe1dc5abd4e1c..8bdb82ba4a7bce 100755 --- a/configure +++ b/configure @@ -6521,7 +6521,7 @@ $as_echo_n "checking for --enable-optimizations... " >&6; } # Check whether --enable-optimizations was given. if test "${enable_optimizations+set}" = set; then : enableval=$enable_optimizations; -if test "$withval" != no +if test "$enableval" != no then Py_OPT='true' { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 diff --git a/configure.ac b/configure.ac index 9eacf52559e8c2..6b331d5742745f 100644 --- a/configure.ac +++ b/configure.ac @@ -1274,7 +1274,7 @@ Py_OPT='false' AC_MSG_CHECKING(for --enable-optimizations) AC_ARG_ENABLE(optimizations, AS_HELP_STRING([--enable-optimizations], [Enable expensive optimizations (PGO, etc). Disabled by default.]), [ -if test "$withval" != no +if test "$enableval" != no then Py_OPT='true' AC_MSG_RESULT(yes); From c4021af50526f488c0c280e7c7eaa83ef80ae1df Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 28 Mar 2017 09:33:54 -0700 Subject: [PATCH 0183/2287] bpo-16011: clarify that 'in' always returns a boolean value (GH-874) (cherry picked from commit 0ae7c8bd614d3aa1fcaf2d71a10ff1148c80d9b5) --- Doc/reference/expressions.rst | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index f4a82699b0be12..d80768ac07dc0e 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -1431,28 +1431,29 @@ Membership test operations -------------------------- The operators :keyword:`in` and :keyword:`not in` test for membership. ``x in -s`` evaluates to true if *x* is a member of *s*, and false otherwise. ``x not -in s`` returns the negation of ``x in s``. All built-in sequences and set types -support this as well as dictionary, for which :keyword:`in` tests whether the -dictionary has a given key. For container types such as list, tuple, set, -frozenset, dict, or collections.deque, the expression ``x in y`` is equivalent +s`` evaluates to ``True`` if *x* is a member of *s*, and ``False`` otherwise. +``x not in s`` returns the negation of ``x in s``. All built-in sequences and +set types support this as well as dictionary, for which :keyword:`in` tests +whether the dictionary has a given key. For container types such as list, tuple, +set, frozenset, dict, or collections.deque, the expression ``x in y`` is equivalent to ``any(x is e or x == e for e in y)``. -For the string and bytes types, ``x in y`` is true if and only if *x* is a +For the string and bytes types, ``x in y`` is ``True`` if and only if *x* is a substring of *y*. An equivalent test is ``y.find(x) != -1``. Empty strings are always considered to be a substring of any other string, so ``"" in "abc"`` will return ``True``. For user-defined classes which define the :meth:`__contains__` method, ``x in -y`` is true if and only if ``y.__contains__(x)`` is true. +y`` returns ``True`` if ``y.__contains__(x)`` returns a true value, and +``False`` otherwise. For user-defined classes which do not define :meth:`__contains__` but do define -:meth:`__iter__`, ``x in y`` is true if some value ``z`` with ``x == z`` is +:meth:`__iter__`, ``x in y`` is ``True`` if some value ``z`` with ``x == z`` is produced while iterating over ``y``. If an exception is raised during the iteration, it is as if :keyword:`in` raised that exception. Lastly, the old-style iteration protocol is tried: if a class defines -:meth:`__getitem__`, ``x in y`` is true if and only if there is a non-negative +:meth:`__getitem__`, ``x in y`` is ``True`` if and only if there is a non-negative integer index *i* such that ``x == y[i]``, and all lower integer indices do not raise :exc:`IndexError` exception. (If any other exception is raised, it is as if :keyword:`in` raised that exception). From 346dcd65e6b832a35b4cfc15b7309b51a38e9ca2 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Wed, 29 Mar 2017 12:50:28 +0800 Subject: [PATCH 0184/2287] bpo-28699: fix abnormal behaviour of pools in multiprocessing.pool (GH-882) an exception raised at the very first of an iterable would cause pools behave abnormally (swallow the exception or hang) --- Lib/multiprocessing/pool.py | 79 +++++++++++++++++++++---------- Lib/test/_test_multiprocessing.py | 59 ++++++++++++++++++++++- Misc/NEWS | 4 ++ 3 files changed, 117 insertions(+), 25 deletions(-) diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py index ae8cec44796b21..a545f3c1a18961 100644 --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -118,7 +118,7 @@ def worker(inqueue, outqueue, initializer=None, initargs=(), maxtasks=None, try: result = (True, func(*args, **kwds)) except Exception as e: - if wrap_exception: + if wrap_exception and func is not _helper_reraises_exception: e = ExceptionWithTraceback(e, e.__traceback__) result = (False, e) try: @@ -133,6 +133,10 @@ def worker(inqueue, outqueue, initializer=None, initargs=(), maxtasks=None, completed += 1 util.debug('worker exiting after %d tasks' % completed) +def _helper_reraises_exception(ex): + 'Pickle-able helper function for use by _guarded_task_generation.' + raise ex + # # Class representing a process pool # @@ -277,6 +281,17 @@ def starmap_async(self, func, iterable, chunksize=None, callback=None, return self._map_async(func, iterable, starmapstar, chunksize, callback, error_callback) + def _guarded_task_generation(self, result_job, func, iterable): + '''Provides a generator of tasks for imap and imap_unordered with + appropriate handling for iterables which throw exceptions during + iteration.''' + try: + i = -1 + for i, x in enumerate(iterable): + yield (result_job, i, func, (x,), {}) + except Exception as e: + yield (result_job, i+1, _helper_reraises_exception, (e,), {}) + def imap(self, func, iterable, chunksize=1): ''' Equivalent of `map()` -- can be MUCH slower than `Pool.map()`. @@ -285,15 +300,23 @@ def imap(self, func, iterable, chunksize=1): raise ValueError("Pool not running") if chunksize == 1: result = IMapIterator(self._cache) - self._taskqueue.put((((result._job, i, func, (x,), {}) - for i, x in enumerate(iterable)), result._set_length)) + self._taskqueue.put( + ( + self._guarded_task_generation(result._job, func, iterable), + result._set_length + )) return result else: assert chunksize > 1 task_batches = Pool._get_tasks(func, iterable, chunksize) result = IMapIterator(self._cache) - self._taskqueue.put((((result._job, i, mapstar, (x,), {}) - for i, x in enumerate(task_batches)), result._set_length)) + self._taskqueue.put( + ( + self._guarded_task_generation(result._job, + mapstar, + task_batches), + result._set_length + )) return (item for chunk in result for item in chunk) def imap_unordered(self, func, iterable, chunksize=1): @@ -304,15 +327,23 @@ def imap_unordered(self, func, iterable, chunksize=1): raise ValueError("Pool not running") if chunksize == 1: result = IMapUnorderedIterator(self._cache) - self._taskqueue.put((((result._job, i, func, (x,), {}) - for i, x in enumerate(iterable)), result._set_length)) + self._taskqueue.put( + ( + self._guarded_task_generation(result._job, func, iterable), + result._set_length + )) return result else: assert chunksize > 1 task_batches = Pool._get_tasks(func, iterable, chunksize) result = IMapUnorderedIterator(self._cache) - self._taskqueue.put((((result._job, i, mapstar, (x,), {}) - for i, x in enumerate(task_batches)), result._set_length)) + self._taskqueue.put( + ( + self._guarded_task_generation(result._job, + mapstar, + task_batches), + result._set_length + )) return (item for chunk in result for item in chunk) def apply_async(self, func, args=(), kwds={}, callback=None, @@ -323,7 +354,7 @@ def apply_async(self, func, args=(), kwds={}, callback=None, if self._state != RUN: raise ValueError("Pool not running") result = ApplyResult(self._cache, callback, error_callback) - self._taskqueue.put(([(result._job, None, func, args, kwds)], None)) + self._taskqueue.put(([(result._job, 0, func, args, kwds)], None)) return result def map_async(self, func, iterable, chunksize=None, callback=None, @@ -354,8 +385,14 @@ def _map_async(self, func, iterable, mapper, chunksize=None, callback=None, task_batches = Pool._get_tasks(func, iterable, chunksize) result = MapResult(self._cache, chunksize, len(iterable), callback, error_callback=error_callback) - self._taskqueue.put((((result._job, i, mapper, (x,), {}) - for i, x in enumerate(task_batches)), None)) + self._taskqueue.put( + ( + self._guarded_task_generation(result._job, + mapper, + task_batches), + None + ) + ) return result @staticmethod @@ -377,33 +414,27 @@ def _handle_tasks(taskqueue, put, outqueue, pool, cache): for taskseq, set_length in iter(taskqueue.get, None): task = None - i = -1 try: - for i, task in enumerate(taskseq): + # iterating taskseq cannot fail + for task in taskseq: if thread._state: util.debug('task handler found thread._state != RUN') break try: put(task) except Exception as e: - job, ind = task[:2] + job, idx = task[:2] try: - cache[job]._set(ind, (False, e)) + cache[job]._set(idx, (False, e)) except KeyError: pass else: if set_length: util.debug('doing set_length()') - set_length(i+1) + idx = task[1] if task else -1 + set_length(idx + 1) continue break - except Exception as ex: - job, ind = task[:2] if task else (0, 0) - if job in cache: - cache[job]._set(ind + 1, (False, ex)) - if set_length: - util.debug('doing set_length()') - set_length(i+1) finally: task = taskseq = job = None else: diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 1d3bb0f8bae781..771bbf24265b91 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -1755,6 +1755,8 @@ def __del__(self): class SayWhenError(ValueError): pass def exception_throwing_generator(total, when): + if when == -1: + raise SayWhenError("Somebody said when") for i in range(total): if i == when: raise SayWhenError("Somebody said when") @@ -1833,6 +1835,32 @@ def test_map_chunksize(self): except multiprocessing.TimeoutError: self.fail("pool.map_async with chunksize stalled on null list") + def test_map_handle_iterable_exception(self): + if self.TYPE == 'manager': + self.skipTest('test not appropriate for {}'.format(self.TYPE)) + + # SayWhenError seen at the very first of the iterable + with self.assertRaises(SayWhenError): + self.pool.map(sqr, exception_throwing_generator(1, -1), 1) + # again, make sure it's reentrant + with self.assertRaises(SayWhenError): + self.pool.map(sqr, exception_throwing_generator(1, -1), 1) + + with self.assertRaises(SayWhenError): + self.pool.map(sqr, exception_throwing_generator(10, 3), 1) + + class SpecialIterable: + def __iter__(self): + return self + def __next__(self): + raise SayWhenError + def __len__(self): + return 1 + with self.assertRaises(SayWhenError): + self.pool.map(sqr, SpecialIterable(), 1) + with self.assertRaises(SayWhenError): + self.pool.map(sqr, SpecialIterable(), 1) + def test_async(self): res = self.pool.apply_async(sqr, (7, TIMEOUT1,)) get = TimingWrapper(res.get) @@ -1863,6 +1891,13 @@ def test_imap_handle_iterable_exception(self): if self.TYPE == 'manager': self.skipTest('test not appropriate for {}'.format(self.TYPE)) + # SayWhenError seen at the very first of the iterable + it = self.pool.imap(sqr, exception_throwing_generator(1, -1), 1) + self.assertRaises(SayWhenError, it.__next__) + # again, make sure it's reentrant + it = self.pool.imap(sqr, exception_throwing_generator(1, -1), 1) + self.assertRaises(SayWhenError, it.__next__) + it = self.pool.imap(sqr, exception_throwing_generator(10, 3), 1) for i in range(3): self.assertEqual(next(it), i*i) @@ -1889,6 +1924,17 @@ def test_imap_unordered_handle_iterable_exception(self): if self.TYPE == 'manager': self.skipTest('test not appropriate for {}'.format(self.TYPE)) + # SayWhenError seen at the very first of the iterable + it = self.pool.imap_unordered(sqr, + exception_throwing_generator(1, -1), + 1) + self.assertRaises(SayWhenError, it.__next__) + # again, make sure it's reentrant + it = self.pool.imap_unordered(sqr, + exception_throwing_generator(1, -1), + 1) + self.assertRaises(SayWhenError, it.__next__) + it = self.pool.imap_unordered(sqr, exception_throwing_generator(10, 3), 1) @@ -1970,7 +2016,7 @@ def test_traceback(self): except Exception as e: exc = e else: - raise AssertionError('expected RuntimeError') + self.fail('expected RuntimeError') self.assertIs(type(exc), RuntimeError) self.assertEqual(exc.args, (123,)) cause = exc.__cause__ @@ -1984,6 +2030,17 @@ def test_traceback(self): sys.excepthook(*sys.exc_info()) self.assertIn('raise RuntimeError(123) # some comment', f1.getvalue()) + # _helper_reraises_exception should not make the error + # a remote exception + with self.Pool(1) as p: + try: + p.map(sqr, exception_throwing_generator(1, -1), 1) + except Exception as e: + exc = e + else: + self.fail('expected SayWhenError') + self.assertIs(type(exc), SayWhenError) + self.assertIs(exc.__cause__, None) @classmethod def _test_wrapped_exception(cls): diff --git a/Misc/NEWS b/Misc/NEWS index 45c5c7828701f8..fbaa840638ff97 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,10 @@ Core and Builtins Library ------- +- bpo-28699: Fixed a bug in pools in multiprocessing.pool that raising an + exception at the very first of an iterable may swallow the exception or + make the program hang. Patch by Davin Potts and Xiang Zhang. + - bpo-25803: Avoid incorrect errors raised by Path.mkdir(exist_ok=True) when the OS gives priority to errors such as EACCES over EEXIST. From 2609c9ee78c53d501914a5a90dbe094d9a8c3c97 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 29 Mar 2017 19:10:07 -0700 Subject: [PATCH 0185/2287] bpo-29677: DOC: clarify documentation for `round` (GH-877) (GH-892) (cherry picked from commit 85deefcf61d3cc192846f41a4ccc6df17da60c98) --- Doc/library/functions.rst | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 2c0ea71c47f413..90fb07af227d98 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1254,9 +1254,9 @@ are always available. They are listed here in alphabetical order. .. function:: round(number[, ndigits]) - Return the floating point value *number* rounded to *ndigits* digits after - the decimal point. If *ndigits* is omitted or is ``None``, it returns the - nearest integer to its input. Delegates to ``number.__round__(ndigits)``. + Return *number* rounded to *ndigits* precision after the decimal + point. If *ndigits* is omitted or is ``None``, it returns the + nearest integer to its input. For the built-in types supporting :func:`round`, values are rounded to the closest multiple of 10 to the power minus *ndigits*; if two multiples are @@ -1266,6 +1266,9 @@ are always available. They are listed here in alphabetical order. negative). The return value is an integer if called with one argument, otherwise of the same type as *number*. + For a general Python object ``number``, ``round(number, ndigits)`` delegates to + ``number.__round__(ndigits)``. + .. note:: The behavior of :func:`round` for floats can be surprising: for example, From da6ad2f780d187fbfdea330d1037766ae7bdb778 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Wed, 29 Mar 2017 22:29:00 -0700 Subject: [PATCH 0186/2287] bpo-29917: DOC: Remove link from PyMethodDef (#890) (#894) (cherry picked from commit c3c7ef088583cc12bd218138036d1edb6de9c63f) --- Doc/c-api/structures.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index f48119391f2bbd..c080f317bee9d9 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -241,7 +241,7 @@ definition with the same method name. +==================+=============+===============================+ | :attr:`name` | char \* | name of the member | +------------------+-------------+-------------------------------+ - | :attr:`type` | int | the type of the member in the | + | :attr:`!type` | int | the type of the member in the | | | | C struct | +------------------+-------------+-------------------------------+ | :attr:`offset` | Py_ssize_t | the offset in bytes that the | @@ -256,7 +256,7 @@ definition with the same method name. | | | docstring | +------------------+-------------+-------------------------------+ - :attr:`type` can be one of many ``T_`` macros corresponding to various C + :attr:`!type` can be one of many ``T_`` macros corresponding to various C types. When the member is accessed in Python, it will be converted to the equivalent Python type. From 1b43a959fb1dd2e08dbf51bbc644df5ff2eb357e Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Wed, 29 Mar 2017 23:56:52 -0700 Subject: [PATCH 0187/2287] Remove an unrequired TODO in test_urllib2. (#897) (#900) (cherry picked from commit e6911a44f69c0d302db60f49952a9cf69da69a2b) --- Lib/test/test_urllib2.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index 34329f87162a62..308acb3724cad1 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -1414,7 +1414,6 @@ def test_proxy_https_proxy_authorization(self): self.assertEqual(req.host, "proxy.example.com:3128") self.assertEqual(req.get_header("Proxy-authorization"), "FooBar") - # TODO: This should be only for OSX @unittest.skipUnless(sys.platform == 'darwin', "only relevant for OSX") def test_osx_proxy_bypass(self): bypass = { From a6b4e1902250d6f28ca6d083ce1c8d7e9b91974b Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 30 Mar 2017 18:08:21 +0300 Subject: [PATCH 0188/2287] bpo-27863: Fixed multiple crashes in ElementTree. (#765) (#903) (cherry picked from commit 576def096ec7b64814e038f03290031f172886c3) --- Lib/test/test_xml_etree.py | 112 +++++++++++++++++++++++++++++++++++++ Misc/NEWS | 3 + Modules/_elementtree.c | 100 +++++++++++++++++---------------- 3 files changed, 167 insertions(+), 48 deletions(-) diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index c0144d1cb8febf..dbdad23a7423f2 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -1879,6 +1879,118 @@ def test_recursive_repr(self): with self.assertRaises(RuntimeError): repr(e) # Should not crash + def test_element_get_text(self): + # Issue #27863 + class X(str): + def __del__(self): + try: + elem.text + except NameError: + pass + + b = ET.TreeBuilder() + b.start('tag', {}) + b.data('ABCD') + b.data(X('EFGH')) + b.data('IJKL') + b.end('tag') + + elem = b.close() + self.assertEqual(elem.text, 'ABCDEFGHIJKL') + + def test_element_get_tail(self): + # Issue #27863 + class X(str): + def __del__(self): + try: + elem[0].tail + except NameError: + pass + + b = ET.TreeBuilder() + b.start('root', {}) + b.start('tag', {}) + b.end('tag') + b.data('ABCD') + b.data(X('EFGH')) + b.data('IJKL') + b.end('root') + + elem = b.close() + self.assertEqual(elem[0].tail, 'ABCDEFGHIJKL') + + def test_element_iter(self): + # Issue #27863 + state = { + 'tag': 'tag', + '_children': [None], # non-Element + 'attrib': 'attr', + 'tail': 'tail', + 'text': 'text', + } + + e = ET.Element('tag') + try: + e.__setstate__(state) + except AttributeError: + e.__dict__ = state + + it = e.iter() + self.assertIs(next(it), e) + self.assertRaises(AttributeError, next, it) + + def test_subscr(self): + # Issue #27863 + class X: + def __index__(self): + del e[:] + return 1 + + e = ET.Element('elem') + e.append(ET.Element('child')) + e[:X()] # shouldn't crash + + e.append(ET.Element('child')) + e[0:10:X()] # shouldn't crash + + def test_ass_subscr(self): + # Issue #27863 + class X: + def __index__(self): + e[:] = [] + return 1 + + e = ET.Element('elem') + for _ in range(10): + e.insert(0, ET.Element('child')) + + e[0:10:X()] = [] # shouldn't crash + + def test_treebuilder_start(self): + # Issue #27863 + def element_factory(x, y): + return [] + b = ET.TreeBuilder(element_factory=element_factory) + + b.start('tag', {}) + b.data('ABCD') + self.assertRaises(AttributeError, b.start, 'tag2', {}) + del b + gc_collect() + + def test_treebuilder_end(self): + # Issue #27863 + def element_factory(x, y): + return [] + b = ET.TreeBuilder(element_factory=element_factory) + + b.start('tag', {}) + b.data('ABCD') + self.assertRaises(AttributeError, b.end, 'tag') + del b + gc_collect() + + class MutatingElementPath(str): def __new__(cls, elem, *args): self = str.__new__(cls, *args) diff --git a/Misc/NEWS b/Misc/NEWS index fbaa840638ff97..2caa8f360d122d 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Core and Builtins Library ------- +- bpo-27863: Fixed multiple crashes in ElementTree caused by race conditions + and wrong types. + - bpo-28699: Fixed a bug in pools in multiprocessing.pool that raising an exception at the very first of an iterable may swallow the exception or make the program hang. Patch by Davin Potts and Xiang Zhang. diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 2cda98e61127d6..e3350d194da18a 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -131,7 +131,7 @@ elementtree_free(void *m) LOCAL(PyObject*) list_join(PyObject* list) { - /* join list elements (destroying the list in the process) */ + /* join list elements */ PyObject* joiner; PyObject* result; @@ -140,8 +140,6 @@ list_join(PyObject* list) return NULL; result = PyUnicode_Join(joiner, list); Py_DECREF(joiner); - if (result) - Py_DECREF(list); return result; } @@ -508,15 +506,17 @@ element_get_text(ElementObject* self) { /* return borrowed reference to text attribute */ - PyObject* res = self->text; + PyObject *res = self->text; if (JOIN_GET(res)) { res = JOIN_OBJ(res); if (PyList_CheckExact(res)) { - res = list_join(res); - if (!res) + PyObject *tmp = list_join(res); + if (!tmp) return NULL; - self->text = res; + self->text = tmp; + Py_DECREF(res); + res = tmp; } } @@ -528,15 +528,17 @@ element_get_tail(ElementObject* self) { /* return borrowed reference to text attribute */ - PyObject* res = self->tail; + PyObject *res = self->tail; if (JOIN_GET(res)) { res = JOIN_OBJ(res); if (PyList_CheckExact(res)) { - res = list_join(res); - if (!res) + PyObject *tmp = list_join(res); + if (!tmp) return NULL; - self->tail = res; + self->tail = tmp; + Py_DECREF(res); + res = tmp; } } @@ -2147,6 +2149,12 @@ elementiter_next(ElementIterObject *it) continue; } + if (!PyObject_TypeCheck(extra->children[child_index], &Element_Type)) { + PyErr_Format(PyExc_AttributeError, + "'%.100s' object has no attribute 'iter'", + Py_TYPE(extra->children[child_index])->tp_name); + return NULL; + } elem = (ElementObject *)extra->children[child_index]; item->child_index++; Py_INCREF(elem); @@ -2396,40 +2404,51 @@ treebuilder_dealloc(TreeBuilderObject *self) /* helpers for handling of arbitrary element-like objects */ static int -treebuilder_set_element_text_or_tail(PyObject *element, PyObject *data, +treebuilder_set_element_text_or_tail(PyObject *element, PyObject **data, PyObject **dest, _Py_Identifier *name) { if (Element_CheckExact(element)) { - Py_DECREF(JOIN_OBJ(*dest)); - *dest = JOIN_SET(data, PyList_CheckExact(data)); + PyObject *tmp = JOIN_OBJ(*dest); + *dest = JOIN_SET(*data, PyList_CheckExact(*data)); + *data = NULL; + Py_DECREF(tmp); return 0; } else { - PyObject *joined = list_join(data); + PyObject *joined = list_join(*data); int r; if (joined == NULL) return -1; r = _PyObject_SetAttrId(element, name, joined); Py_DECREF(joined); - return r; + if (r < 0) + return -1; + Py_CLEAR(*data); + return 0; } } -/* These two functions steal a reference to data */ -static int -treebuilder_set_element_text(PyObject *element, PyObject *data) +LOCAL(int) +treebuilder_flush_data(TreeBuilderObject* self) { - _Py_IDENTIFIER(text); - return treebuilder_set_element_text_or_tail( - element, data, &((ElementObject *) element)->text, &PyId_text); -} + PyObject *element = self->last; -static int -treebuilder_set_element_tail(PyObject *element, PyObject *data) -{ - _Py_IDENTIFIER(tail); - return treebuilder_set_element_text_or_tail( - element, data, &((ElementObject *) element)->tail, &PyId_tail); + if (!self->data) { + return 0; + } + + if (self->this == element) { + _Py_IDENTIFIER(text); + return treebuilder_set_element_text_or_tail( + element, &self->data, + &((ElementObject *) element)->text, &PyId_text); + } + else { + _Py_IDENTIFIER(tail); + return treebuilder_set_element_text_or_tail( + element, &self->data, + &((ElementObject *) element)->tail, &PyId_tail); + } } static int @@ -2479,16 +2498,8 @@ treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag, PyObject* this; elementtreestate *st = ET_STATE_GLOBAL; - if (self->data) { - if (self->this == self->last) { - if (treebuilder_set_element_text(self->last, self->data)) - return NULL; - } - else { - if (treebuilder_set_element_tail(self->last, self->data)) - return NULL; - } - self->data = NULL; + if (treebuilder_flush_data(self) < 0) { + return NULL; } if (!self->element_factory || self->element_factory == Py_None) { @@ -2591,15 +2602,8 @@ treebuilder_handle_end(TreeBuilderObject* self, PyObject* tag) { PyObject* item; - if (self->data) { - if (self->this == self->last) { - if (treebuilder_set_element_text(self->last, self->data)) - return NULL; - } else { - if (treebuilder_set_element_tail(self->last, self->data)) - return NULL; - } - self->data = NULL; + if (treebuilder_flush_data(self) < 0) { + return NULL; } if (self->index == 0) { From bf4bb2e43030661e568d5d4b046e8b9351cc164c Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 30 Mar 2017 19:46:59 +0300 Subject: [PATCH 0189/2287] bpo-29935: Fixed error messages in the index() method of tuple, list and deque (#887) (#907) when pass indices of wrong type. (cherry picked from commit d4edfc9abffca965e76ebc5957a92031a4d6c4d4) --- Include/ceval.h | 1 + Misc/NEWS | 3 +++ Modules/_collectionsmodule.c | 4 ++-- Objects/listobject.c | 4 ++-- Objects/tupleobject.c | 4 ++-- Python/ceval.c | 26 +++++++++++++++++++++----- 6 files changed, 31 insertions(+), 11 deletions(-) diff --git a/Include/ceval.h b/Include/ceval.h index 89c6062f11e17c..1e482729a1cc98 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -216,6 +216,7 @@ PyAPI_FUNC(Py_ssize_t) _PyEval_RequestCodeExtraIndex(freefunc); #ifndef Py_LIMITED_API PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) _PyEval_SliceIndexNotNone(PyObject *, Py_ssize_t *); PyAPI_FUNC(void) _PyEval_SignalAsyncExc(void); #endif diff --git a/Misc/NEWS b/Misc/NEWS index 2caa8f360d122d..e8cd8f0221102e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.6.2 release candidate 1? Core and Builtins ----------------- +- bpo-29935: Fixed error messages in the index() method of tuple, list and deque + when pass indices of wrong type. + - bpo-29859: Show correct error messages when any of the pthread_* calls in thread_pthread.h fails. diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index e6111c64e77de2..30157701d70b47 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1051,8 +1051,8 @@ deque_index(dequeobject *deque, PyObject *args) int cmp; if (!PyArg_ParseTuple(args, "O|O&O&:index", &v, - _PyEval_SliceIndex, &start, - _PyEval_SliceIndex, &stop)) + _PyEval_SliceIndexNotNone, &start, + _PyEval_SliceIndexNotNone, &stop)) return NULL; if (start < 0) { start += Py_SIZE(deque); diff --git a/Objects/listobject.c b/Objects/listobject.c index dcd7b5efe5b0fe..cde281a0f6f9dc 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2153,8 +2153,8 @@ listindex(PyListObject *self, PyObject *args) PyObject *v; if (!PyArg_ParseTuple(args, "O|O&O&:index", &v, - _PyEval_SliceIndex, &start, - _PyEval_SliceIndex, &stop)) + _PyEval_SliceIndexNotNone, &start, + _PyEval_SliceIndexNotNone, &stop)) return NULL; if (start < 0) { start += Py_SIZE(self); diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index c0ff499e72c7dd..52f20f4fe8a2b1 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -522,8 +522,8 @@ tupleindex(PyTupleObject *self, PyObject *args) PyObject *v; if (!PyArg_ParseTuple(args, "O|O&O&:index", &v, - _PyEval_SliceIndex, &start, - _PyEval_SliceIndex, &stop)) + _PyEval_SliceIndexNotNone, &start, + _PyEval_SliceIndexNotNone, &stop)) return NULL; if (start < 0) { start += Py_SIZE(self); diff --git a/Python/ceval.c b/Python/ceval.c index 9cac771abdf65b..bce86ab12cf2fb 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5074,14 +5074,10 @@ do_call_core(PyObject *func, PyObject *callargs, PyObject *kwdict) and silently boost values less than -PY_SSIZE_T_MAX-1 to -PY_SSIZE_T_MAX-1. Return 0 on error, 1 on success. */ -/* Note: If v is NULL, return success without storing into *pi. This - is because_PyEval_SliceIndex() is called by apply_slice(), which can be - called by the SLICE opcode with v and/or w equal to NULL. -*/ int _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi) { - if (v != NULL) { + if (v != Py_None) { Py_ssize_t x; if (PyIndex_Check(v)) { x = PyNumber_AsSsize_t(v, NULL); @@ -5099,6 +5095,26 @@ _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi) return 1; } +int +_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi) +{ + Py_ssize_t x; + if (PyIndex_Check(v)) { + x = PyNumber_AsSsize_t(v, NULL); + if (x == -1 && PyErr_Occurred()) + return 0; + } + else { + PyErr_SetString(PyExc_TypeError, + "slice indices must be integers or " + "have an __index__ method"); + return 0; + } + *pi = x; + return 1; +} + + #define CANNOT_CATCH_MSG "catching classes that do not inherit from "\ "BaseException is not allowed" From 7b5b1379ac2c1e89ebf90b88b5d32457910e975e Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 30 Mar 2017 12:27:19 -0700 Subject: [PATCH 0190/2287] bpo-29928: Add f-string to the Glossary (GH-864) (GH-914) (cherry picked from commit 33db068dac7686e37736f7ecf8abb2aee0345cf2) --- Doc/glossary.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 495934afe74c8b..81238414efe49d 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -320,6 +320,11 @@ Glossary A module written in C or C++, using Python's C API to interact with the core and with user code. + f-string + String literals prefixed with ``'f'`` or ``'F'`` are commonly called + "f-strings" which is short for + :ref:`formatted string literals `. See also :pep:`498`. + file object An object exposing a file-oriented API (with methods such as :meth:`read()` or :meth:`write()`) to an underlying resource. Depending From 599bb181036f724629a515317f0f39520950d51c Mon Sep 17 00:00:00 2001 From: "T. Wouters" Date: Thu, 30 Mar 2017 12:48:23 -0700 Subject: [PATCH 0191/2287] bpo-29942: Fix the use of recursion in itertools.chain.from_iterable. (#911) * bpo-29942: Fix the use of recursion in itertools.chain.from_iterable. Fix the use of recursion in itertools.chain.from_iterable. Using recursion is unnecessary, and can easily cause stack overflows, especially when building in low optimization modes or with Py_DEBUG enabled. (cherry picked from commit 5466d4af5fe76ec0a5fbc8a05675287d9e8e9d14) --- Lib/test/test_itertools.py | 8 ++++++ Misc/NEWS | 3 +++ Modules/itertoolsmodule.c | 52 ++++++++++++++++++++------------------ 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index ea1f57caade12b..c431f0dc6e1d7f 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -1976,6 +1976,14 @@ def gen2(x): self.assertRaises(AssertionError, list, cycle(gen1())) self.assertEqual(hist, [0,1]) + def test_long_chain_of_empty_iterables(self): + # Make sure itertools.chain doesn't run into recursion limits when + # dealing with long chains of empty iterables. Even with a high + # number this would probably only fail in Py_DEBUG mode. + it = chain.from_iterable(() for unused in range(10000000)) + with self.assertRaises(StopIteration): + next(it) + class SubclassWithKwargsTest(unittest.TestCase): def test_keywords_in_subclass(self): # count is not subclassable... diff --git a/Misc/NEWS b/Misc/NEWS index e8cd8f0221102e..5ea4f66e76fb39 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -30,6 +30,9 @@ Core and Builtins Library ------- +- bpo-29942: Fix a crash in itertools.chain.from_iterable when encountering + long runs of empty iterables. + - bpo-27863: Fixed multiple crashes in ElementTree caused by race conditions and wrong types. diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index 6bf04cbee31c35..8e22ec9c4b7cc1 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -1864,33 +1864,37 @@ chain_next(chainobject *lz) { PyObject *item; - if (lz->source == NULL) - return NULL; /* already stopped */ - - if (lz->active == NULL) { - PyObject *iterable = PyIter_Next(lz->source); - if (iterable == NULL) { - Py_CLEAR(lz->source); - return NULL; /* no more input sources */ - } - lz->active = PyObject_GetIter(iterable); - Py_DECREF(iterable); + /* lz->source is the iterator of iterables. If it's NULL, we've already + * consumed them all. lz->active is the current iterator. If it's NULL, + * we should grab a new one from lz->source. */ + while (lz->source != NULL) { if (lz->active == NULL) { - Py_CLEAR(lz->source); - return NULL; /* input not iterable */ + PyObject *iterable = PyIter_Next(lz->source); + if (iterable == NULL) { + Py_CLEAR(lz->source); + return NULL; /* no more input sources */ + } + lz->active = PyObject_GetIter(iterable); + Py_DECREF(iterable); + if (lz->active == NULL) { + Py_CLEAR(lz->source); + return NULL; /* input not iterable */ + } } + item = (*Py_TYPE(lz->active)->tp_iternext)(lz->active); + if (item != NULL) + return item; + if (PyErr_Occurred()) { + if (PyErr_ExceptionMatches(PyExc_StopIteration)) + PyErr_Clear(); + else + return NULL; /* input raised an exception */ + } + /* lz->active is consumed, try with the next iterable. */ + Py_CLEAR(lz->active); } - item = (*Py_TYPE(lz->active)->tp_iternext)(lz->active); - if (item != NULL) - return item; - if (PyErr_Occurred()) { - if (PyErr_ExceptionMatches(PyExc_StopIteration)) - PyErr_Clear(); - else - return NULL; /* input raised an exception */ - } - Py_CLEAR(lz->active); - return chain_next(lz); /* recurse and use next active */ + /* Everything had been consumed already. */ + return NULL; } static PyObject * From 8d1f935945ca8cf3665315e0f82358fffe689353 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Thu, 30 Mar 2017 23:15:51 -0700 Subject: [PATCH 0192/2287] Remove catching OSError in ftphandler test. Only URLError is raised in urllib.request module. (#918) (#920) (cherry picked from commit ed3dd1c02af6872bd0748f7b9a5dadb89f7b830f) --- Lib/test/test_urllib2.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index 308acb3724cad1..b537fca3c31adf 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -830,7 +830,6 @@ def test_file(self): for url, ftp in [ ("file://ftp.example.com//foo.txt", False), ("file://ftp.example.com///foo.txt", False), -# XXXX bug: fails with OSError, should be URLError ("file://ftp.example.com/foo.txt", False), ("file://somehost//foo/something.txt", False), ("file://localhost//foo/something.txt", False), @@ -839,7 +838,7 @@ def test_file(self): try: h.file_open(req) # XXXX remove OSError when bug fixed - except (urllib.error.URLError, OSError): + except urllib.error.URLError: self.assertFalse(ftp) else: self.assertIs(o.req, req) @@ -1689,7 +1688,6 @@ def test_invalid_closed(self): self.assertTrue(conn.fakesock.closed, "Connection not closed") - class MiscTests(unittest.TestCase): def opener_has_handler(self, opener, handler_class): From 4c75fbb485c0e42181aab95c2ae92c597915827c Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Fri, 31 Mar 2017 15:43:10 +0900 Subject: [PATCH 0193/2287] bpo-29952: Use usual terminology of dict (GH-922) s/keys and elements/keys and values/ (cherry picked from commit cdcac039fb447f2ab04efcacbe663751bb2cb4ec) --- Doc/reference/expressions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index d80768ac07dc0e..c4f6c55c7ca3aa 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -1355,7 +1355,7 @@ built-in types. true). * Mappings (instances of :class:`dict`) compare equal if and only if they have - equal `(key, value)` pairs. Equality comparison of the keys and elements + equal `(key, value)` pairs. Equality comparison of the keys and values enforces reflexivity. Order comparisons (``<``, ``>``, ``<=``, and ``>=``) raise :exc:`TypeError`. From 0a17e584461b14ff65ec287048f53911dbb22222 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 31 Mar 2017 02:12:18 -0700 Subject: [PATCH 0194/2287] bpo-28810: Update lnotab_notes.txt (GH-665) (GH-919) (cherry picked from commit 9135275cba680902e6caf29461f0423dc570190d) --- Objects/lnotab_notes.txt | 50 ++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/Objects/lnotab_notes.txt b/Objects/lnotab_notes.txt index 515375772e6317..3dab2b98661695 100644 --- a/Objects/lnotab_notes.txt +++ b/Objects/lnotab_notes.txt @@ -1,17 +1,18 @@ All about co_lnotab, the line number table. Code objects store a field named co_lnotab. This is an array of unsigned bytes -disguised as a Python string. It is used to map bytecode offsets to source code -line #s for tracebacks and to identify line number boundaries for line tracing. +disguised as a Python bytes object. It is used to map bytecode offsets to +source code line #s for tracebacks and to identify line number boundaries for +line tracing. The array is conceptually a compressed list of (bytecode offset increment, line number increment) pairs. The details are important and delicate, best illustrated by example: byte code offset source code line number - 0 1 - 6 2 - 50 7 + 0 1 + 6 2 + 50 7 350 207 361 208 @@ -24,7 +25,8 @@ look like: The above doesn't really work, but it's a start. An unsigned byte (byte code offset) can't hold negative values, or values larger than 255, a signed byte (line number) can't hold values larger than 127 or less than -128, and the -above example contains two such values. So we make two tweaks: +above example contains two such values. (Note that before 3.6, line number +was also encoded by an unsigned byte.) So we make two tweaks: (a) there's a deep assumption that byte code offsets increase monotonically, and @@ -52,7 +54,7 @@ the example above, assemble_lnotab in compile.c should not (as was actually done until 2.2) expand 300, 200 to 255, 255, 45, 45, but to - 255, 0, 45, 128, 0, 72. + 255, 0, 45, 127, 0, 73. The above is sufficient to reconstruct line numbers for tracebacks, but not for line tracing. Tracing is handled by PyCode_CheckLineNumber() in codeobject.c @@ -83,30 +85,34 @@ Consider this code: 1: def f(a): 2: while a: -3: print 1, +3: print(1) 4: break 5: else: -6: print 2, +6: print(2) which compiles to this: - 2 0 SETUP_LOOP 19 (to 22) - >> 3 LOAD_FAST 0 (a) - 6 POP_JUMP_IF_FALSE 17 + 2 0 SETUP_LOOP 26 (to 28) + >> 2 LOAD_FAST 0 (a) + 4 POP_JUMP_IF_FALSE 18 - 3 9 LOAD_CONST 1 (1) - 12 PRINT_ITEM + 3 6 LOAD_GLOBAL 0 (print) + 8 LOAD_CONST 1 (1) + 10 CALL_FUNCTION 1 + 12 POP_TOP - 4 13 BREAK_LOOP - 14 JUMP_ABSOLUTE 3 - >> 17 POP_BLOCK + 4 14 BREAK_LOOP + 16 JUMP_ABSOLUTE 2 + >> 18 POP_BLOCK - 6 18 LOAD_CONST 2 (2) - 21 PRINT_ITEM - >> 22 LOAD_CONST 0 (None) - 25 RETURN_VALUE + 6 20 LOAD_GLOBAL 0 (print) + 22 LOAD_CONST 2 (2) + 24 CALL_FUNCTION 1 + 26 POP_TOP + >> 28 LOAD_CONST 0 (None) + 30 RETURN_VALUE -If 'a' is false, execution will jump to the POP_BLOCK instruction at offset 17 +If 'a' is false, execution will jump to the POP_BLOCK instruction at offset 18 and the co_lnotab will claim that execution has moved to line 4, which is wrong. In this case, we could instead associate the POP_BLOCK with line 5, but that would break jumps around loops without else clauses. From 7d5d13d8d003ae5b62bb8c9ef1d1f310eaabc506 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 31 Mar 2017 23:23:49 +0300 Subject: [PATCH 0195/2287] =?UTF-8?q?bpo-29953:=20Fix=20memory=20leaks=20i?= =?UTF-8?q?n=20the=20replace()=20method=20of=20datetime=20and=20t=E2=80=A6?= =?UTF-8?q?=20(#933)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit objects when pass out of bound fold argument. (cherry picked from commit 314d6fca36a4eaa0541218431d14804fadec6488) --- Lib/test/datetimetester.py | 5 +++++ Misc/NEWS | 3 +++ Modules/_datetimemodule.c | 21 ++++++++++----------- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 2350125f6d6dbe..bccd97aa3c7f60 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -4313,6 +4313,11 @@ def test_replace(self): dt = dt.replace(fold=1, tzinfo=Eastern) self.assertEqual(t.replace(tzinfo=None).fold, 1) self.assertEqual(dt.replace(tzinfo=None).fold, 1) + # Out of bounds. + with self.assertRaises(ValueError): + t.replace(fold=2) + with self.assertRaises(ValueError): + dt.replace(fold=2) # Check that fold is a keyword-only argument with self.assertRaises(TypeError): t.replace(1, 1, 1, None, 1) diff --git a/Misc/NEWS b/Misc/NEWS index 5ea4f66e76fb39..c1bcdc1e93fc5d 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -30,6 +30,9 @@ Core and Builtins Library ------- +- bpo-29953: Fixed memory leaks in the replace() method of datetime and time + objects when pass out of bound fold argument. + - bpo-29942: Fix a crash in itertools.chain.from_iterable when encountering long runs of empty iterables. diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index c784d0f4a90999..c2ad9a203e9652 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -3926,16 +3926,16 @@ time_replace(PyDateTime_Time *self, PyObject *args, PyObject *kw) time_kws, &hh, &mm, &ss, &us, &tzinfo, &fold)) return NULL; + if (fold != 0 && fold != 1) { + PyErr_SetString(PyExc_ValueError, + "fold must be either 0 or 1"); + return NULL; + } tuple = Py_BuildValue("iiiiO", hh, mm, ss, us, tzinfo); if (tuple == NULL) return NULL; clone = time_new(Py_TYPE(self), tuple, NULL); if (clone != NULL) { - if (fold != 0 && fold != 1) { - PyErr_SetString(PyExc_ValueError, - "fold must be either 0 or 1"); - return NULL; - } TIME_SET_FOLD(clone, fold); } Py_DECREF(tuple); @@ -5019,17 +5019,16 @@ datetime_replace(PyDateTime_DateTime *self, PyObject *args, PyObject *kw) &y, &m, &d, &hh, &mm, &ss, &us, &tzinfo, &fold)) return NULL; + if (fold != 0 && fold != 1) { + PyErr_SetString(PyExc_ValueError, + "fold must be either 0 or 1"); + return NULL; + } tuple = Py_BuildValue("iiiiiiiO", y, m, d, hh, mm, ss, us, tzinfo); if (tuple == NULL) return NULL; clone = datetime_new(Py_TYPE(self), tuple, NULL); - if (clone != NULL) { - if (fold != 0 && fold != 1) { - PyErr_SetString(PyExc_ValueError, - "fold must be either 0 or 1"); - return NULL; - } DATE_SET_FOLD(clone, fold); } Py_DECREF(tuple); From efde51ad54c58353f25ff80c8d30dbee82ef33a3 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Sat, 1 Apr 2017 23:29:31 +0900 Subject: [PATCH 0196/2287] bpo-29949: Fix set memory usage regression (GH-945) Revert "Minor factoring: move redundant resize scaling logic into the resize function." This reverts commit 4897300276d870f99459c82b937f0ac22450f0b6. (cherry picked from commit e82cf8675bacd7a03de508ed11865fc2701dcef5) --- Misc/NEWS | 2 ++ Objects/setobject.c | 11 +++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index c1bcdc1e93fc5d..e61a1652381fa0 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ What's New in Python 3.6.2 release candidate 1? Core and Builtins ----------------- +- bpo-29949: Fix memory usage regression of set and frozenset object. + - bpo-29935: Fixed error messages in the index() method of tuple, list and deque when pass indices of wrong type. diff --git a/Objects/setobject.c b/Objects/setobject.c index fdb9d3600d9fad..9fe28138c0012b 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -236,7 +236,7 @@ set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash) entry->hash = hash; if ((size_t)so->fill*3 < mask*2) return 0; - return set_table_resize(so, so->used); + return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4); found_active: Py_DECREF(key); @@ -304,7 +304,6 @@ set_table_resize(PySetObject *so, Py_ssize_t minused) setentry small_copy[PySet_MINSIZE]; assert(minused >= 0); - minused = (minused > 50000) ? minused * 2 : minused * 4; /* Find the smallest table size > minused. */ /* XXX speed-up with intrinsics */ @@ -646,8 +645,8 @@ set_merge(PySetObject *so, PyObject *otherset) * that there will be no (or few) overlapping keys. */ if ((so->fill + other->used)*3 >= so->mask*2) { - if (set_table_resize(so, so->used + other->used) != 0) - return -1; + if (set_table_resize(so, (so->used + other->used)*2) != 0) + return -1; } so_entry = so->table; other_entry = other->table; @@ -990,7 +989,7 @@ set_update_internal(PySetObject *so, PyObject *other) if (dictsize < 0) return -1; if ((so->fill + dictsize)*3 >= so->mask*2) { - if (set_table_resize(so, so->used + dictsize) != 0) + if (set_table_resize(so, (so->used + dictsize)*2) != 0) return -1; } while (_PyDict_Next(other, &pos, &key, &value, &hash)) { @@ -1511,7 +1510,7 @@ set_difference_update_internal(PySetObject *so, PyObject *other) /* If more than 1/4th are dummies, then resize them away. */ if ((size_t)(so->fill - so->used) <= (size_t)so->mask / 4) return 0; - return set_table_resize(so, so->used); + return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4); } static PyObject * From 4415b823a08163a8728d13ff06565efb12353fc0 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Sat, 1 Apr 2017 19:57:04 -0700 Subject: [PATCH 0197/2287] Add helpful explaination to test_password_manager tests. (#936) (#941) Also uncomment and fix a path test. (cherry picked from commit 1f5425ff69ea0531d869b4f9fa28bd3f66ca3de7) --- Lib/test/test_urllib2.py | 41 +++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index b537fca3c31adf..d50211c59857e1 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -141,44 +141,55 @@ def test_password_manager(self): mgr = urllib.request.HTTPPasswordMgr() add = mgr.add_password find_user_pass = mgr.find_user_password + add("Some Realm", "http://example.com/", "joe", "password") add("Some Realm", "http://example.com/ni", "ni", "ni") - add("c", "http://example.com/foo", "foo", "ni") - add("c", "http://example.com/bar", "bar", "nini") - add("b", "http://example.com/", "first", "blah") - add("b", "http://example.com/", "second", "spam") - add("a", "http://example.com", "1", "a") add("Some Realm", "http://c.example.com:3128", "3", "c") add("Some Realm", "d.example.com", "4", "d") add("Some Realm", "e.example.com:3128", "5", "e") + # For the same realm, password set the highest path is the winner. self.assertEqual(find_user_pass("Some Realm", "example.com"), ('joe', 'password')) - - #self.assertEqual(find_user_pass("Some Realm", "http://example.com/ni"), - # ('ni', 'ni')) - + self.assertEqual(find_user_pass("Some Realm", "http://example.com/ni"), + ('joe', 'password')) self.assertEqual(find_user_pass("Some Realm", "http://example.com"), ('joe', 'password')) self.assertEqual(find_user_pass("Some Realm", "http://example.com/"), ('joe', 'password')) - self.assertEqual( - find_user_pass("Some Realm", "http://example.com/spam"), - ('joe', 'password')) - self.assertEqual( - find_user_pass("Some Realm", "http://example.com/spam/spam"), - ('joe', 'password')) + self.assertEqual(find_user_pass("Some Realm", + "http://example.com/spam"), + ('joe', 'password')) + + self.assertEqual(find_user_pass("Some Realm", + "http://example.com/spam/spam"), + ('joe', 'password')) + + # You can have different passwords for different paths. + + add("c", "http://example.com/foo", "foo", "ni") + add("c", "http://example.com/bar", "bar", "nini") + self.assertEqual(find_user_pass("c", "http://example.com/foo"), ('foo', 'ni')) + self.assertEqual(find_user_pass("c", "http://example.com/bar"), ('bar', 'nini')) + + # For the same path, newer password should be considered. + + add("b", "http://example.com/", "first", "blah") + add("b", "http://example.com/", "second", "spam") + self.assertEqual(find_user_pass("b", "http://example.com/"), ('second', 'spam')) # No special relationship between a.example.com and example.com: + add("a", "http://example.com", "1", "a") self.assertEqual(find_user_pass("a", "http://example.com/"), ('1', 'a')) + self.assertEqual(find_user_pass("a", "http://a.example.com/"), (None, None)) From a71a3ad54d14483cfaebd8e0fb96c97c798d9e32 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Sat, 1 Apr 2017 20:00:36 -0700 Subject: [PATCH 0198/2287] bpo-26947: DOC: clarify wording on hashable in glossary (#948) (#957) (cherry picked from commit 64c887ab3a400cf91bde4f0c5ef69eacc88bc5e1) --- Doc/glossary.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 81238414efe49d..dba9186d935a6a 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -467,9 +467,9 @@ Glossary Hashability makes an object usable as a dictionary key and a set member, because these data structures use the hash value internally. - All of Python's immutable built-in objects are hashable, while no mutable - containers (such as lists or dictionaries) are. Objects which are - instances of user-defined classes are hashable by default; they all + All of Python's immutable built-in objects are hashable; mutable + containers (such as lists or dictionaries) are not. Objects which are + instances of user-defined classes are hashable by default. They all compare unequal (except with themselves), and their hash value is derived from their :func:`id`. From 90e3518225bafaff01469ed48c472ae7db5686f0 Mon Sep 17 00:00:00 2001 From: "T. Wouters" Date: Sat, 1 Apr 2017 20:20:05 -0700 Subject: [PATCH 0199/2287] bpo-29941: Assert fixes (#886) (#955) Make a non-Py_DEBUG, asserts-enabled build of CPython possible. This means making sure helper functions are defined when NDEBUG is not defined, not just when Py_DEBUG is defined. Also fix a division-by-zero in obmalloc.c that went unnoticed because in Py_DEBUG mode, elsize is never zero. (cherry picked from commit a00c3fd12d421e41b769debd7df717d17b0deed5 and 06bb4873d6a9ac303701d08a851d6cd9a51e02a3) --- Include/unicodeobject.h | 4 ++++ Objects/dictobject.c | 2 +- Objects/obmalloc.c | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index 2d0d77e804d9d8..5b877185f258d3 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -2309,6 +2309,10 @@ PyAPI_FUNC(Py_UNICODE*) PyUnicode_AsUnicodeCopy( PyAPI_FUNC(int) _PyUnicode_CheckConsistency( PyObject *op, int check_content); +#elif !defined(NDEBUG) +/* For asserts that call _PyUnicode_CheckConsistency(), which would + * otherwise be a problem when building with asserts but without Py_DEBUG. */ +#define _PyUnicode_CheckConsistency(op, check_content) PyUnicode_Check(op) #endif #ifndef Py_LIMITED_API diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 8bcc931148beaa..566d1a5ac8d893 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -436,7 +436,7 @@ static PyObject *empty_values[1] = { NULL }; /* #define DEBUG_PYDICT */ -#ifdef Py_DEBUG +#ifndef NDEBUG static int _PyDict_CheckConsistency(PyDictObject *mp) { diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index a1142f3b09ad9e..32e7ecbe1e0436 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -1227,7 +1227,7 @@ _PyObject_Alloc(int use_calloc, void *ctx, size_t nelem, size_t elsize) _Py_AllocatedBlocks++; - assert(nelem <= PY_SSIZE_T_MAX / elsize); + assert(elsize == 0 || nelem <= PY_SSIZE_T_MAX / elsize); nbytes = nelem * elsize; #ifdef WITH_VALGRIND From c4e557ed9933499e1c97644ea12ad77ba064e829 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Sun, 2 Apr 2017 01:36:58 -0700 Subject: [PATCH 0200/2287] Minor spell fix and formatting fixes in urllib tests. (#959) (#961) (cherry picked from commit efbd4ea65dbb9f87b1afeec6a760802756badee5) --- Lib/test/test_urllib.py | 6 +++++- Lib/test/test_urllibnet.py | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 5084486e5ab479..fa3757cc94be52 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -206,6 +206,7 @@ def test_iter(self): def test_relativelocalfile(self): self.assertRaises(ValueError,urllib.request.urlopen,'./' + self.pathname) + class ProxyTests(unittest.TestCase): def setUp(self): @@ -259,6 +260,7 @@ def test_proxy_bypass_environment_host_match(self): self.assertFalse(bypass('newdomain.com')) # no port self.assertFalse(bypass('newdomain.com:1235')) # wrong port + class ProxyTests_withOrderedEnv(unittest.TestCase): def setUp(self): @@ -294,6 +296,7 @@ def test_getproxies_environment_prefer_lowercase(self): proxies = urllib.request.getproxies_environment() self.assertEqual('http://somewhere:3128', proxies['http']) + class urlopen_HttpTests(unittest.TestCase, FakeHTTPMixin, FakeFTPMixin): """Test urlopen() opening a fake http connection.""" @@ -432,7 +435,6 @@ def test_ftp_cache_pruning(self): finally: self.unfakeftp() - def test_userpass_inurl(self): self.fakehttp(b"HTTP/1.0 200 OK\r\n\r\nHello!") try: @@ -476,6 +478,7 @@ def test_cafile_and_context(self): "https://localhost", cafile="/nonexistent/path", context=context ) + class urlopen_DataTests(unittest.TestCase): """Test urlopen() opening a data URL.""" @@ -549,6 +552,7 @@ def test_invalid_base64_data(self): # missing padding character self.assertRaises(ValueError,urllib.request.urlopen,'data:;base64,Cg=') + class urlretrieve_FileTests(unittest.TestCase): """Test urllib.urlretrieve() on local files""" diff --git a/Lib/test/test_urllibnet.py b/Lib/test/test_urllibnet.py index 949716c2b567e0..865a7f4f5fb172 100644 --- a/Lib/test/test_urllibnet.py +++ b/Lib/test/test_urllibnet.py @@ -29,7 +29,7 @@ def testURLread(self): class urlopenNetworkTests(unittest.TestCase): - """Tests urllib.reqest.urlopen using the network. + """Tests urllib.request.urlopen using the network. These tests are not exhaustive. Assuming that testing using files does a good job overall of some of the basic interface features. There are no From d184c20e359907e326696724a3395ce1d542f42e Mon Sep 17 00:00:00 2001 From: cocoatomo Date: Tue, 4 Apr 2017 01:26:32 +0900 Subject: [PATCH 0201/2287] Keep the c-api exception doc up-to-date (#966) cherry-pick'ed from ec1f5df..e3d6db3 --- Doc/c-api/exceptions.rst | 205 ++++++++++++++++++++++++++++----------- Misc/ACKS | 1 + 2 files changed, 150 insertions(+), 56 deletions(-) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 037b85cfd11754..3516a1690384f7 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -750,6 +750,61 @@ All standard Python exceptions are available as global variables whose names are :c:type:`PyObject\*`; they are all class objects. For completeness, here are all the variables: +.. index:: + single: PyExc_BaseException + single: PyExc_Exception + single: PyExc_ArithmeticError + single: PyExc_AssertionError + single: PyExc_AttributeError + single: PyExc_BlockingIOError + single: PyExc_BrokenPipeError + single: PyExc_BufferError + single: PyExc_ChildProcessError + single: PyExc_ConnectionAbortedError + single: PyExc_ConnectionError + single: PyExc_ConnectionRefusedError + single: PyExc_ConnectionResetError + single: PyExc_EOFError + single: PyExc_FileExistsError + single: PyExc_FileNotFoundError + single: PyExc_FloatingPointError + single: PyExc_GeneratorExit + single: PyExc_ImportError + single: PyExc_IndentationError + single: PyExc_IndexError + single: PyExc_InterruptedError + single: PyExc_IsADirectoryError + single: PyExc_KeyError + single: PyExc_KeyboardInterrupt + single: PyExc_LookupError + single: PyExc_MemoryError + single: PyExc_ModuleNotFoundError + single: PyExc_NameError + single: PyExc_NotADirectoryError + single: PyExc_NotImplementedError + single: PyExc_OSError + single: PyExc_OverflowError + single: PyExc_PermissionError + single: PyExc_ProcessLookupError + single: PyExc_RecursionError + single: PyExc_ReferenceError + single: PyExc_RuntimeError + single: PyExc_StopAsyncIteration + single: PyExc_StopIteration + single: PyExc_SyntaxError + single: PyExc_SystemError + single: PyExc_SystemExit + single: PyExc_TabError + single: PyExc_TimeoutError + single: PyExc_TypeError + single: PyExc_UnboundLocalError + single: PyExc_UnicodeDecodeError + single: PyExc_UnicodeEncodeError + single: PyExc_UnicodeError + single: PyExc_UnicodeTranslateError + single: PyExc_ValueError + single: PyExc_ZeroDivisionError + +-----------------------------------------+---------------------------------+----------+ | C Name | Python Name | Notes | +=========================================+=================================+==========+ @@ -759,8 +814,6 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | \(1) | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_LookupError` | :exc:`LookupError` | \(1) | -+-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_AssertionError` | :exc:`AssertionError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_AttributeError` | :exc:`AttributeError` | | @@ -769,27 +822,31 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_BrokenPipeError` | :exc:`BrokenPipeError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ChildProcessError` | :exc:`ChildProcessError` | | +| :c:data:`PyExc_BufferError` | :exc:`BufferError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ConnectionError` | :exc:`ConnectionError` | | +| :c:data:`PyExc_ChildProcessError` | :exc:`ChildProcessError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_ConnectionAbortedError` | :exc:`ConnectionAbortedError` | | +-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_ConnectionError` | :exc:`ConnectionError` | | ++-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_ConnectionRefusedError` | :exc:`ConnectionRefusedError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_ConnectionResetError` | :exc:`ConnectionResetError` | | +-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_EOFError` | :exc:`EOFError` | | ++-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_FileExistsError` | :exc:`FileExistsError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_FileNotFoundError` | :exc:`FileNotFoundError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_EOFError` | :exc:`EOFError` | | -+-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_FloatingPointError` | :exc:`FloatingPointError` | | +-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_GeneratorExit` | :exc:`GeneratorExit` | | ++-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_ImportError` | :exc:`ImportError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ModuleNotFoundError` | :exc:`ModuleNotFoundError` | | +| :c:data:`PyExc_IndentationError` | :exc:`IndentationError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_IndexError` | :exc:`IndexError` | | +-----------------------------------------+---------------------------------+----------+ @@ -801,8 +858,12 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_KeyboardInterrupt` | :exc:`KeyboardInterrupt` | | +-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_LookupError` | :exc:`LookupError` | \(1) | ++-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_MemoryError` | :exc:`MemoryError` | | +-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_ModuleNotFoundError` | :exc:`ModuleNotFoundError` | | ++-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_NameError` | :exc:`NameError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_NotADirectoryError` | :exc:`NotADirectoryError` | | @@ -823,16 +884,32 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_RuntimeError` | :exc:`RuntimeError` | | +-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_StopAsyncIteration` | :exc:`StopAsyncIteration` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_StopIteration` | :exc:`StopIteration` | | ++-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_SyntaxError` | :exc:`SyntaxError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_SystemError` | :exc:`SystemError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_TimeoutError` | :exc:`TimeoutError` | | -+-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_SystemExit` | :exc:`SystemExit` | | +-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_TabError` | :exc:`TabError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_TimeoutError` | :exc:`TimeoutError` | | ++-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_TypeError` | :exc:`TypeError` | | +-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_UnboundLocalError` | :exc:`UnboundLocalError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_UnicodeDecodeError` | :exc:`UnicodeDecodeError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_UnicodeEncodeError` | :exc:`UnicodeEncodeError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_UnicodeError` | :exc:`UnicodeError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_UnicodeTranslateError` | :exc:`UnicodeTranslateError` | | ++-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_ValueError` | :exc:`ValueError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_ZeroDivisionError` | :exc:`ZeroDivisionError` | | @@ -849,11 +926,18 @@ the variables: and :c:data:`PyExc_TimeoutError` were introduced following :pep:`3151`. .. versionadded:: 3.5 - :c:data:`PyExc_RecursionError`. + :c:data:`PyExc_StopAsyncIteration` and :c:data:`PyExc_RecursionError`. +.. versionadded:: 3.6 + :c:data:`PyExc_ModuleNotFoundError`. These are compatibility aliases to :c:data:`PyExc_OSError`: +.. index:: + single: PyExc_EnvironmentError + single: PyExc_IOError + single: PyExc_WindowsError + +-------------------------------------+----------+ | C Name | Notes | +=====================================+==========+ @@ -867,52 +951,6 @@ These are compatibility aliases to :c:data:`PyExc_OSError`: .. versionchanged:: 3.3 These aliases used to be separate exception types. - -.. index:: - single: PyExc_BaseException - single: PyExc_Exception - single: PyExc_ArithmeticError - single: PyExc_LookupError - single: PyExc_AssertionError - single: PyExc_AttributeError - single: PyExc_BlockingIOError - single: PyExc_BrokenPipeError - single: PyExc_ConnectionError - single: PyExc_ConnectionAbortedError - single: PyExc_ConnectionRefusedError - single: PyExc_ConnectionResetError - single: PyExc_EOFError - single: PyExc_FileExistsError - single: PyExc_FileNotFoundError - single: PyExc_FloatingPointError - single: PyExc_ImportError - single: PyExc_IndexError - single: PyExc_InterruptedError - single: PyExc_IsADirectoryError - single: PyExc_KeyError - single: PyExc_KeyboardInterrupt - single: PyExc_MemoryError - single: PyExc_NameError - single: PyExc_NotADirectoryError - single: PyExc_NotImplementedError - single: PyExc_OSError - single: PyExc_OverflowError - single: PyExc_PermissionError - single: PyExc_ProcessLookupError - single: PyExc_RecursionError - single: PyExc_ReferenceError - single: PyExc_RuntimeError - single: PyExc_SyntaxError - single: PyExc_SystemError - single: PyExc_SystemExit - single: PyExc_TimeoutError - single: PyExc_TypeError - single: PyExc_ValueError - single: PyExc_ZeroDivisionError - single: PyExc_EnvironmentError - single: PyExc_IOError - single: PyExc_WindowsError - Notes: (1) @@ -924,3 +962,58 @@ Notes: (3) Only defined on Windows; protect code that uses this by testing that the preprocessor macro ``MS_WINDOWS`` is defined. + +Standard Warnings +================= + +All standard Python warning categories are available as global variables whose +names are ``PyExc_`` followed by the Python exception name. These have the type +:c:type:`PyObject\*`; they are all class objects. For completeness, here are all +the variables: + +.. index:: + single: PyExc_Warning + single: PyExc_BytesWarning + single: PyExc_DepricationWarning + single: PyExc_FutureWarning + single: PyExc_ImportWarning + single: PyExc_PendingDeprecationWarning + single: PyExc_ResourceWarning + single: PyExc_RuntimeWarning + single: PyExc_SyntaxWarning + single: PyExc_UnicodeWarning + single: PyExc_UserWarning + ++------------------------------------------+---------------------------------+----------+ +| C Name | Python Name | Notes | ++==========================================+=================================+==========+ +| :c:data:`PyExc_Warning` | :exc:`Warning` | \(1) | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_BytesWarning` | :exc:`BytesWarning` | | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_DeprecationWarning` | :exc:`DeprecationWarning` | | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_FutureWarning` | :exc:`FutureWarning` | | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_ImportWarning` | :exc:`ImportWarning` | | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_PendingDepricationWarning`| :exc:`PendingDeprecationWarning`| | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_ResourceWarning` | :exc:`ResourceWarning` | | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_RuntimeWarning` | :exc:`RuntimeWarning` | | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_SyntaxWarning` | :exc:`SyntaxWarning` | | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_UnicodeWarning` | :exc:`UnicodeWarning` | | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_UserWarning` | :exc:`UserWarning` | | ++------------------------------------------+---------------------------------+----------+ + +.. versionadded:: 3.2 + :c:data:`PyExc_ResourceWarning`. + +Notes: + +(1) + This is a base class for other standard warning categories. diff --git a/Misc/ACKS b/Misc/ACKS index 2b23702f22910c..b5da02a63ad0aa 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -775,6 +775,7 @@ Jason Killen Jan Kim Taek Joo Kim Sam Kimbrel +Tomohiko Kinebuchi James King W. Trevor King Paul Kippes From cb1e002c07622e027e80a3843d27a623d1617430 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Mon, 3 Apr 2017 22:27:15 -0700 Subject: [PATCH 0202/2287] bpo-29725: DOC: add text for arraysize in sqlite3.Cursor (#947) (#985) (cherry picked from commit 02e12138000da834f23719521a011fa93763384d) --- Doc/library/sqlite3.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index d1f7a6f120620b..9fef7d7f03f1f0 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -640,6 +640,11 @@ Cursor Objects .. versionchanged:: 3.6 Added support for the ``REPLACE`` statement. + .. attribute:: arraysize + + Read/write attribute that controls the number of rows returned by :meth:`fetchmany`. + The default value is 1 which means a single row would be fetched per call. + .. attribute:: description This read-only attribute provides the column names of the last query. To From ce92be1825c5ca1d3e6bff24598f3aa54c000b22 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 4 Apr 2017 11:49:14 +0200 Subject: [PATCH 0203/2287] remove merge=union attribute for Misc/NEWS (GH-460) (GH-988) (cherry picked from commit 060d2d776a29341c079cce37220324f9775140ba) --- .gitattributes | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitattributes b/.gitattributes index 55a3f49922bf19..82694d81f276b2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,3 @@ -Misc/NEWS merge=union - *.pck binary Lib/test/cjkencodings/* binary Lib/test/decimaltestdata/*.decTest binary From ba980e8ef01dfaf484defd6e7a19ea5375de1338 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 5 Apr 2017 13:18:18 +0300 Subject: [PATCH 0204/2287] Miscellaneous minor fixes of Misc/NEWS formatting. (#1002) (#1003) (cherry picked from commit a0157b5f11e621f2196af4e918b9f07688a6cd1c) --- Misc/NEWS | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index e61a1652381fa0..fa20ea16cd0144 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -290,7 +290,7 @@ Library - Issue #28427: old keys should not remove new values from WeakValueDictionary when collecting from another thread. -- Issue 28923: Remove editor artifacts from Tix.py. +- Issue #28923: Remove editor artifacts from Tix.py. - Issue #29055: Neaten-up empty population error on random.choice() by suppressing the upstream exception. @@ -1058,7 +1058,7 @@ Core and Builtins alpha releases, where backslashes are allowed anywhere in an f-string. Also, require that expressions inside f-strings be enclosed within literal braces, and not escapes like - f'\x7b"hi"\x7d'. + ``f'\x7b"hi"\x7d'``. - Issue #28046: Remove platform-specific directories from sys.path. @@ -1277,7 +1277,7 @@ Library - Issue #24277: The new email API is no longer provisional, and the docs have been reorganized and rewritten to emphasize the new API. -- Issue #22450: urllib now includes an "Accept: */*" header among the +- Issue #22450: urllib now includes an ``Accept: */*`` header among the default headers. This makes the results of REST API requests more consistent and predictable especially when proxy servers are involved. @@ -1296,9 +1296,9 @@ Library characters, not on arbitrary unicode line breaks. This also fixes a bug in HTTP header parsing. -- Issue 27331: The email.mime classes now all accept an optional policy keyword. +- Issue #27331: The email.mime classes now all accept an optional policy keyword. -- Issue 27988: Fix email iter_attachments incorrect mutation of payload list. +- Issue #27988: Fix email iter_attachments incorrect mutation of payload list. - Issue #16113: Add SHA-3 and SHAKE support to hashlib module. @@ -2406,7 +2406,7 @@ Core and Builtins in ``def f(): 1.0``. - Issue #4806: Avoid masking the original TypeError exception when using star - (*) unpacking in function calls. Based on patch by Hagen Fürstenau and + (``*``) unpacking in function calls. Based on patch by Hagen Fürstenau and Daniel Urban. - Issue #26146: Add a new kind of AST node: ``ast.Constant``. It can be used @@ -2964,7 +2964,7 @@ Library - Issue #25672: In the ssl module, enable the SSL_MODE_RELEASE_BUFFERS mode option if it is safe to do so. -- Issue #26012: Don't traverse into symlinks for ** pattern in +- Issue #26012: Don't traverse into symlinks for ``**`` pattern in pathlib.Path.[r]glob(). - Issue #24120: Ignore PermissionError when traversing a tree with @@ -3100,7 +3100,7 @@ Library - Issue #25584: Added "escape" to the __all__ list in the glob module. -- Issue #25584: Fixed recursive glob() with patterns starting with '\*\*'. +- Issue #25584: Fixed recursive glob() with patterns starting with ``**``. - Issue #25446: Fix regression in smtplib's AUTH LOGIN support. @@ -3735,7 +3735,7 @@ Library - Issue #28427: old keys should not remove new values from WeakValueDictionary when collecting from another thread. -- Issue 28923: Remove editor artifacts from Tix.py. +- Issue #28923: Remove editor artifacts from Tix.py. - Issue #28871: Fixed a crash when deallocate deep ElementTree. @@ -3858,7 +3858,7 @@ Library - Issue #27599: Fixed buffer overrun in binascii.b2a_qp() and binascii.a2b_qp(). -- Issue #19003:m email.generator now replaces only \r and/or \n line +- Issue #19003:m email.generator now replaces only ``\r`` and/or ``\n`` line endings, per the RFC, instead of all unicode line endings. - Issue #28019: itertools.count() no longer rounds non-integer step in range @@ -3881,7 +3881,7 @@ Library - Issue #27445: Don't pass str(_charset) to MIMEText.set_payload(). Patch by Claude Paroz. -- Issue #22450: urllib now includes an "Accept: */*" header among the +- Issue #22450: urllib now includes an ``Accept: */*`` header among the default headers. This makes the results of REST API requests more consistent and predictable especially when proxy servers are involved. @@ -3896,7 +3896,7 @@ Library characters, not on arbitrary unicode line breaks. This also fixes a bug in HTTP header parsing. -- Issue 27988: Fix email iter_attachments incorrect mutation of payload list. +- Issue #27988: Fix email iter_attachments incorrect mutation of payload list. - Issue #27691: Fix ssl module's parsing of GEN_RID subject alternative name fields in X.509 certs. @@ -4347,7 +4347,7 @@ Core and Builtins cookie names. - Issue #4806: Avoid masking the original TypeError exception when using star - (*) unpacking in function calls. Based on patch by Hagen Fürstenau and + (``*``) unpacking in function calls. Based on patch by Hagen Fürstenau and Daniel Urban. - Issue #27138: Fix the doc comment for FileFinder.find_spec(). @@ -4727,7 +4727,7 @@ Library - Issue #25672: In the ssl module, enable the SSL_MODE_RELEASE_BUFFERS mode option if it is safe to do so. -- Issue #26012: Don't traverse into symlinks for ** pattern in +- Issue #26012: Don't traverse into symlinks for ``**`` pattern in pathlib.Path.[r]glob(). - Issue #24120: Ignore PermissionError when traversing a tree with @@ -5137,7 +5137,7 @@ Library - Issue #25584: Added "escape" to the __all__ list in the glob module. -- Issue #25584: Fixed recursive glob() with patterns starting with '\*\*'. +- Issue #25584: Fixed recursive glob() with patterns starting with ``**``. - Issue #25446: Fix regression in smtplib's AUTH LOGIN support. @@ -6680,7 +6680,7 @@ Library - Issue #23521: Corrected pure python implementation of timedelta division. - * Eliminated OverflowError from timedelta * float for some floats; + * Eliminated OverflowError from ``timedelta * float`` for some floats; * Corrected rounding in timedlta true division. - Issue #21619: Popen objects no longer leave a zombie after exit in the with @@ -7479,7 +7479,7 @@ Library character instead of truncating it. Based on patch by Victor Stinner. - Issue #13968: The glob module now supports recursive search in - subdirectories using the "**" pattern. + subdirectories using the ``**`` pattern. - Issue #21951: Fixed a crash in Tkinter on AIX when called Tcl command with empty string or tuple argument. From ed278448daa4afb78d1af57b0c179097477f9832 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Thu, 6 Apr 2017 08:38:38 -0700 Subject: [PATCH 0205/2287] correct parse_qs and parse_qsl test case descriptions. (#968) (#997) (cherry picked from commit 257b980b316a5206ecf6c23b958e2b7c4df4f3de) --- Lib/test/test_urlparse.py | 12 ++++++------ Lib/urllib/parse.py | 30 +++++++++++++++++------------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index 99c5c033e30d20..3c89ed928ff51f 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -6,8 +6,8 @@ RFC3986_BASE = 'http://a/b/c/d;p?q' SIMPLE_BASE = 'http://a/b/c/d' -# A list of test cases. Each test case is a two-tuple that contains -# a string with the query and a dictionary with the expected result. +# Each parse_qsl testcase is a two-tuple that contains +# a string with the query and a list with the expected result. parse_qsl_test_cases = [ ("", []), @@ -42,6 +42,9 @@ (b"a=1;a=2", [(b'a', b'1'), (b'a', b'2')]), ] +# Each parse_qs testcase is a two-tuple that contains +# a string with the query and a dictionary with the expected result. + parse_qs_test_cases = [ ("", {}), ("&", {}), @@ -290,7 +293,6 @@ def test_RFC2368(self): def test_RFC2396(self): # cases from RFC 2396 - self.checkJoin(RFC2396_BASE, 'g:h', 'g:h') self.checkJoin(RFC2396_BASE, 'g', 'http://a/b/c/g') self.checkJoin(RFC2396_BASE, './g', 'http://a/b/c/g') @@ -333,9 +335,7 @@ def test_RFC2396(self): # self.checkJoin(RFC2396_BASE, '/./g', 'http://a/./g') # self.checkJoin(RFC2396_BASE, '/../g', 'http://a/../g') - def test_RFC3986(self): - # Test cases from RFC3986 self.checkJoin(RFC3986_BASE, '?y','http://a/b/c/d;p?y') self.checkJoin(RFC3986_BASE, ';x', 'http://a/b/c/;x') self.checkJoin(RFC3986_BASE, 'g:h','g:h') @@ -363,7 +363,7 @@ def test_RFC3986(self): self.checkJoin(RFC3986_BASE, '../../g','http://a/g') self.checkJoin(RFC3986_BASE, '../../../g', 'http://a/g') - #Abnormal Examples + # Abnormal Examples # The 'abnormal scenarios' are incompatible with RFC2986 parsing # Tests are here for reference. diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 958767a08d7e77..32de25b374da93 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -612,6 +612,7 @@ def unquote(string, encoding='utf-8', errors='replace'): append(bits[i + 1]) return ''.join(res) + def parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace'): """Parse a query given as a string argument. @@ -633,6 +634,8 @@ def parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding and errors: specify how to decode percent-encoded sequences into Unicode characters, as accepted by the bytes.decode() method. + + Returns a dictionary. """ parsed_result = {} pairs = parse_qsl(qs, keep_blank_values, strict_parsing, @@ -644,28 +647,29 @@ def parse_qs(qs, keep_blank_values=False, strict_parsing=False, parsed_result[name] = [value] return parsed_result + def parse_qsl(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace'): """Parse a query given as a string argument. - Arguments: + Arguments: - qs: percent-encoded query string to be parsed + qs: percent-encoded query string to be parsed - keep_blank_values: flag indicating whether blank values in - percent-encoded queries should be treated as blank strings. A - true value indicates that blanks should be retained as blank - strings. The default false value indicates that blank values - are to be ignored and treated as if they were not included. + keep_blank_values: flag indicating whether blank values in + percent-encoded queries should be treated as blank strings. + A true value indicates that blanks should be retained as blank + strings. The default false value indicates that blank values + are to be ignored and treated as if they were not included. - strict_parsing: flag indicating what to do with parsing errors. If - false (the default), errors are silently ignored. If true, - errors raise a ValueError exception. + strict_parsing: flag indicating what to do with parsing errors. If + false (the default), errors are silently ignored. If true, + errors raise a ValueError exception. - encoding and errors: specify how to decode percent-encoded sequences - into Unicode characters, as accepted by the bytes.decode() method. + encoding and errors: specify how to decode percent-encoded sequences + into Unicode characters, as accepted by the bytes.decode() method. - Returns a list, as G-d intended. + Returns a list, as G-d intended. """ qs, _coerce_result = _coerce_args(qs) pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')] From 19d61b265fabed01ebfb8eae9855f2ee59ff591b Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Fri, 7 Apr 2017 00:56:59 -0700 Subject: [PATCH 0206/2287] Remove Invalid comment in test_urllib2.py. (#1022) (cherry picked from commit fd0cd07a5a3c964c084f4efc5bbcb89dd2193ee6) --- Lib/test/test_urllib2.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index d50211c59857e1..876fcd4199fb92 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -848,7 +848,6 @@ def test_file(self): req = Request(url) try: h.file_open(req) - # XXXX remove OSError when bug fixed except urllib.error.URLError: self.assertFalse(ftp) else: From 616d3eb7ef96f1a27bbff68fba6e5d229257d936 Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Fri, 7 Apr 2017 16:50:13 -0400 Subject: [PATCH 0207/2287] Fix a minor typo. (#1032) (#1037) (cherry picked from commit dd9a0a14c89d57e43898d4b866b8c161e4ff8506) --- Doc/library/asyncio-protocol.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/asyncio-protocol.rst b/Doc/library/asyncio-protocol.rst index 482ffbbed35b1e..3f55506c669a29 100644 --- a/Doc/library/asyncio-protocol.rst +++ b/Doc/library/asyncio-protocol.rst @@ -384,7 +384,7 @@ The following callbacks are called on :class:`Protocol` instances: .. method:: Protocol.eof_received() - Calls when the other end signals it won't send any more data + Called when the other end signals it won't send any more data (for example by calling :meth:`write_eof`, if the other end also uses asyncio). From d0d575a6db8cb3b2a720be9f404af3d754da9a5d Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Fri, 7 Apr 2017 23:23:08 +0100 Subject: [PATCH 0208/2287] bpo-29939: suppress compiler warnings in _ctypes_test (#1038) bpo-29939: Changed test code to suppress a compiler warning, while taking care to avoid the code being optimized out by the compiler. (cherry picked from commit 164d30eb1e66575dafee6af4fca4cbf52c7fbe6a) --- Modules/_ctypes/_ctypes_test.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c index 59d56d0d218732..6119ecdaf90dc6 100644 --- a/Modules/_ctypes/_ctypes_test.c +++ b/Modules/_ctypes/_ctypes_test.c @@ -52,9 +52,9 @@ _testfunc_cbk_large_struct(Test in, void (*func)(Test)) EXPORT(void) _testfunc_large_struct_update_value(Test in) { - in.first = 0x0badf00d; - in.second = 0x0badf00d; - in.third = 0x0badf00d; + ((volatile Test *)&in)->first = 0x0badf00d; + ((volatile Test *)&in)->second = 0x0badf00d; + ((volatile Test *)&in)->third = 0x0badf00d; } EXPORT(void)testfunc_array(int values[4]) From c26b19d5c7aba51b50a4d7fb5f8291036cb9da24 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 8 Apr 2017 11:18:14 +0300 Subject: [PATCH 0209/2287] Expand the PySlice_GetIndicesEx macro. (#1023) (#1044) (cherry picked from commit b879fe82e7e5c3f7673c9a7fa4aad42bd05445d8) --- Modules/_ctypes/_ctypes.c | 10 ++++------ Modules/_elementtree.c | 12 ++++++------ Modules/_testbuffer.c | 7 ++++--- Modules/arraymodule.c | 11 ++++++----- Modules/mmapmodule.c | 9 ++++----- Objects/bytearrayobject.c | 12 ++++++------ Objects/bytesobject.c | 6 +++--- Objects/listobject.c | 10 ++++++---- Objects/memoryobject.c | 4 ++-- Objects/tupleobject.c | 6 +++--- Objects/unicodeobject.c | 5 +++-- 11 files changed, 47 insertions(+), 45 deletions(-) diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index df3aedec6eeab5..12234e254e1a7a 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -4273,11 +4273,10 @@ Array_subscript(PyObject *myself, PyObject *item) PyObject *np; Py_ssize_t start, stop, step, slicelen, cur, i; - if (PySlice_GetIndicesEx(item, - self->b_length, &start, &stop, - &step, &slicelen) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return NULL; } + slicelen = PySlice_AdjustIndices(self->b_length, &start, &stop, step); stgdict = PyObject_stgdict((PyObject *)self); assert(stgdict); /* Cannot be NULL for array object instances */ @@ -4414,11 +4413,10 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value) else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelen, otherlen, i, cur; - if (PySlice_GetIndicesEx(item, - self->b_length, &start, &stop, - &step, &slicelen) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return -1; } + slicelen = PySlice_AdjustIndices(self->b_length, &start, &stop, step); if ((step < 0 && start < stop) || (step > 0 && start > stop)) stop = start; diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index e3350d194da18a..bef702ebe69c93 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1712,11 +1712,11 @@ element_subscr(PyObject* self_, PyObject* item) if (!self->extra) return PyList_New(0); - if (PySlice_GetIndicesEx(item, - self->extra->length, - &start, &stop, &step, &slicelen) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return NULL; } + slicelen = PySlice_AdjustIndices(self->extra->length, &start, &stop, + step); if (slicelen <= 0) return PyList_New(0); @@ -1768,11 +1768,11 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value) return -1; } - if (PySlice_GetIndicesEx(item, - self->extra->length, - &start, &stop, &step, &slicelen) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return -1; } + slicelen = PySlice_AdjustIndices(self->extra->length, &start, &stop, + step); if (value == NULL) { /* Delete slice */ diff --git a/Modules/_testbuffer.c b/Modules/_testbuffer.c index 4e1ce6851a5eb6..6b8ab34d931cd3 100644 --- a/Modules/_testbuffer.c +++ b/Modules/_testbuffer.c @@ -1715,10 +1715,10 @@ init_slice(Py_buffer *base, PyObject *key, int dim) { Py_ssize_t start, stop, step, slicelength; - if (PySlice_GetIndicesEx(key, base->shape[dim], - &start, &stop, &step, &slicelength) < 0) { + if (PySlice_Unpack(key, &start, &stop, &step) < 0) { return -1; } + slicelength = PySlice_AdjustIndices(base->shape[dim], &start, &stop, step); if (base->suboffsets == NULL || dim == 0) { @@ -1935,9 +1935,10 @@ slice_indices(PyObject *self, PyObject *args) "first argument must be a slice object"); return NULL; } - if (PySlice_GetIndicesEx(key, len, &s[0], &s[1], &s[2], &s[3]) < 0) { + if (PySlice_Unpack(key, &s[0], &s[1], &s[2]) < 0) { return NULL; } + s[3] = PySlice_AdjustIndices(len, &s[0], &s[1], s[2]); ret = PyTuple_New(4); if (ret == NULL) diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index d4221fe4c6a163..64e0f172fd7d82 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -2297,10 +2297,11 @@ array_subscr(arrayobject* self, PyObject* item) arrayobject* ar; int itemsize = self->ob_descr->itemsize; - if (PySlice_GetIndicesEx(item, Py_SIZE(self), - &start, &stop, &step, &slicelength) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return NULL; } + slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop, + step); if (slicelength <= 0) { return newarrayobject(&Arraytype, 0, self->ob_descr); @@ -2368,11 +2369,11 @@ array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value) return (*self->ob_descr->setitem)(self, i, value); } else if (PySlice_Check(item)) { - if (PySlice_GetIndicesEx(item, - Py_SIZE(self), &start, &stop, - &step, &slicelength) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return -1; } + slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop, + step); } else { PyErr_SetString(PyExc_TypeError, diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 5f1615ff82992c..426b7cacebb573 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -806,10 +806,10 @@ mmap_subscript(mmap_object *self, PyObject *item) else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelen; - if (PySlice_GetIndicesEx(item, self->size, - &start, &stop, &step, &slicelen) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return NULL; } + slicelen = PySlice_AdjustIndices(self->size, &start, &stop, step); if (slicelen <= 0) return PyBytes_FromStringAndSize("", 0); @@ -932,11 +932,10 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value) Py_ssize_t start, stop, step, slicelen; Py_buffer vbuf; - if (PySlice_GetIndicesEx(item, - self->size, &start, &stop, - &step, &slicelen) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return -1; } + slicelen = PySlice_AdjustIndices(self->size, &start, &stop, step); if (value == NULL) { PyErr_SetString(PyExc_TypeError, "mmap object doesn't support slice deletion"); diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index d456678d462f2f..a9c8ca6f1f35a8 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -400,11 +400,11 @@ bytearray_subscript(PyByteArrayObject *self, PyObject *index) } else if (PySlice_Check(index)) { Py_ssize_t start, stop, step, slicelength, cur, i; - if (PySlice_GetIndicesEx(index, - PyByteArray_GET_SIZE(self), - &start, &stop, &step, &slicelength) < 0) { + if (PySlice_Unpack(index, &start, &stop, &step) < 0) { return NULL; } + slicelength = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self), + &start, &stop, step); if (slicelength <= 0) return PyByteArray_FromStringAndSize("", 0); @@ -630,11 +630,11 @@ bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *valu } } else if (PySlice_Check(index)) { - if (PySlice_GetIndicesEx(index, - PyByteArray_GET_SIZE(self), - &start, &stop, &step, &slicelen) < 0) { + if (PySlice_Unpack(index, &start, &stop, &step) < 0) { return -1; } + slicelen = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self), &start, + &stop, step); } else { PyErr_Format(PyExc_TypeError, diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index c95a46d1846649..4c55294d9d8c8a 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -1683,11 +1683,11 @@ bytes_subscript(PyBytesObject* self, PyObject* item) char* result_buf; PyObject* result; - if (PySlice_GetIndicesEx(item, - PyBytes_GET_SIZE(self), - &start, &stop, &step, &slicelength) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return NULL; } + slicelength = PySlice_AdjustIndices(PyBytes_GET_SIZE(self), &start, + &stop, step); if (slicelength <= 0) { return PyBytes_FromStringAndSize("", 0); diff --git a/Objects/listobject.c b/Objects/listobject.c index cde281a0f6f9dc..547bdf0b95f1ee 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2420,10 +2420,11 @@ list_subscript(PyListObject* self, PyObject* item) PyObject* it; PyObject **src, **dest; - if (PySlice_GetIndicesEx(item, Py_SIZE(self), - &start, &stop, &step, &slicelength) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return NULL; } + slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop, + step); if (slicelength <= 0) { return PyList_New(0); @@ -2469,10 +2470,11 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelength; - if (PySlice_GetIndicesEx(item, Py_SIZE(self), - &start, &stop, &step, &slicelength) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return -1; } + slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop, + step); if (step == 1) return list_ass_slice(self, start, stop, value); diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index b1798a2073d108..e1ac7281783f38 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -2285,10 +2285,10 @@ init_slice(Py_buffer *base, PyObject *key, int dim) { Py_ssize_t start, stop, step, slicelength; - if (PySlice_GetIndicesEx(key, base->shape[dim], - &start, &stop, &step, &slicelength) < 0) { + if (PySlice_Unpack(key, &start, &stop, &step) < 0) { return -1; } + slicelength = PySlice_AdjustIndices(base->shape[dim], &start, &stop, step); if (base->suboffsets == NULL || dim == 0) { diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 52f20f4fe8a2b1..0dada74dc7c986 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -720,11 +720,11 @@ tuplesubscript(PyTupleObject* self, PyObject* item) PyObject* it; PyObject **src, **dest; - if (PySlice_GetIndicesEx(item, - PyTuple_GET_SIZE(self), - &start, &stop, &step, &slicelength) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return NULL; } + slicelength = PySlice_AdjustIndices(PyTuple_GET_SIZE(self), &start, + &stop, step); if (slicelength <= 0) { return PyTuple_New(0); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index a5ae454b495dee..949205adf9347e 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -13915,10 +13915,11 @@ unicode_subscript(PyObject* self, PyObject* item) int src_kind, dest_kind; Py_UCS4 ch, max_char, kind_limit; - if (PySlice_GetIndicesEx(item, PyUnicode_GET_LENGTH(self), - &start, &stop, &step, &slicelength) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return NULL; } + slicelength = PySlice_AdjustIndices(PyUnicode_GET_LENGTH(self), + &start, &stop, step); if (slicelength <= 0) { _Py_RETURN_UNICODE_EMPTY(); From af685f9050416da8050e0ec11a8dff9afd4130e7 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 8 Apr 2017 11:25:47 +0300 Subject: [PATCH 0210/2287] bpo-29998: Pickling and copying ImportError now preserves name and path (#1010) (#1042) attributes. (cherry picked from commit b785396ab451b0c9d6ae9ee5a9e56c810209a6cb) --- Lib/test/test_exceptions.py | 20 ++++++++++++++++ Misc/NEWS | 3 +++ Objects/exceptions.c | 48 +++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 48379222c37659..960fc0f1bf9486 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -1,5 +1,6 @@ # Python test set -- part 5, built-in exceptions +import copy import os import sys import unittest @@ -1119,6 +1120,25 @@ def test_non_str_argument(self): exc = ImportError(arg) self.assertEqual(str(arg), str(exc)) + def test_copy_pickle(self): + for kwargs in (dict(), + dict(name='somename'), + dict(path='somepath'), + dict(name='somename', path='somepath')): + orig = ImportError('test', **kwargs) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + exc = pickle.loads(pickle.dumps(orig, proto)) + self.assertEqual(exc.args, ('test',)) + self.assertEqual(exc.msg, 'test') + self.assertEqual(exc.name, orig.name) + self.assertEqual(exc.path, orig.path) + for c in copy.copy, copy.deepcopy: + exc = c(orig) + self.assertEqual(exc.args, ('test',)) + self.assertEqual(exc.msg, 'test') + self.assertEqual(exc.name, orig.name) + self.assertEqual(exc.path, orig.path) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS index fa20ea16cd0144..83f9e7a6852560 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,9 @@ Core and Builtins Library ------- +- bpo-29998: Pickling and copying ImportError now preserves name and path + attributes. + - bpo-29953: Fixed memory leaks in the replace() method of datetime and time objects when pass out of bound fold argument. diff --git a/Objects/exceptions.c b/Objects/exceptions.c index f63f06a145bcb1..d158b9768d45f5 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -686,6 +686,53 @@ ImportError_str(PyImportErrorObject *self) } } +static PyObject * +ImportError_getstate(PyImportErrorObject *self) +{ + PyObject *dict = ((PyBaseExceptionObject *)self)->dict; + if (self->name || self->path) { + _Py_IDENTIFIER(name); + _Py_IDENTIFIER(path); + dict = dict ? PyDict_Copy(dict) : PyDict_New(); + if (dict == NULL) + return NULL; + if (self->name && _PyDict_SetItemId(dict, &PyId_name, self->name) < 0) { + Py_DECREF(dict); + return NULL; + } + if (self->path && _PyDict_SetItemId(dict, &PyId_path, self->path) < 0) { + Py_DECREF(dict); + return NULL; + } + return dict; + } + else if (dict) { + Py_INCREF(dict); + return dict; + } + else { + Py_RETURN_NONE; + } +} + +/* Pickling support */ +static PyObject * +ImportError_reduce(PyImportErrorObject *self) +{ + PyObject *res; + PyObject *args; + PyObject *state = ImportError_getstate(self); + if (state == NULL) + return NULL; + args = ((PyBaseExceptionObject *)self)->args; + if (state == Py_None) + res = PyTuple_Pack(2, Py_TYPE(self), args); + else + res = PyTuple_Pack(3, Py_TYPE(self), args, state); + Py_DECREF(state); + return res; +} + static PyMemberDef ImportError_members[] = { {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0, PyDoc_STR("exception message")}, @@ -697,6 +744,7 @@ static PyMemberDef ImportError_members[] = { }; static PyMethodDef ImportError_methods[] = { + {"__reduce__", (PyCFunction)ImportError_reduce, METH_NOARGS}, {NULL} }; From 4c116cb3b3ee38cae229f7e0df0cd2045fe73c27 Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Sun, 9 Apr 2017 19:22:36 +1000 Subject: [PATCH 0211/2287] bpo-29798: Handle git worktree in patchcheck (#1058) (#1060) The original attempted fix missed an `isdir()` call in `get_base_branch()`. (cherry picked from commit 2abfdf5a81383d3b1ed6b7321903a9a168c373c5) --- Tools/scripts/patchcheck.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/scripts/patchcheck.py b/Tools/scripts/patchcheck.py index f4ec7d8a30ea23..33a9fead879325 100755 --- a/Tools/scripts/patchcheck.py +++ b/Tools/scripts/patchcheck.py @@ -70,7 +70,7 @@ def get_git_upstream_remote(): @status("Getting base branch for PR", info=lambda x: x if x is not None else "not a PR branch") def get_base_branch(): - if not os.path.isdir(os.path.join(SRCDIR, '.git')): + if not os.path.exists(os.path.join(SRCDIR, '.git')): # Not a git checkout, so there's no base branch return None version = sys.version_info From a524d6307273e3920d410452ace89610c843f051 Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Sun, 9 Apr 2017 20:57:04 +1000 Subject: [PATCH 0212/2287] bpo-29506: Clarify deep copy note in copy module The reference to administrative data was confusing to readers, so this simplifies the note to explain that deep copying may copy more then you intended, such as data that you expected to be shared between copies. (cherry picked from commit 19e04942562a980ad2519f6ff79c455a7472783b) --- Doc/library/copy.rst | 4 ++-- Misc/ACKS | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Doc/library/copy.rst b/Doc/library/copy.rst index d0b861d469bc05..2041d9175ea587 100644 --- a/Doc/library/copy.rst +++ b/Doc/library/copy.rst @@ -47,8 +47,8 @@ copy operations: * Recursive objects (compound objects that, directly or indirectly, contain a reference to themselves) may cause a recursive loop. -* Because deep copy copies *everything* it may copy too much, e.g., - even administrative data structures that should be shared even between copies. +* Because deep copy copies everything it may copy too much, such as data + which is intended to be shared between copies. The :func:`deepcopy` function avoids these problems by: diff --git a/Misc/ACKS b/Misc/ACKS index b5da02a63ad0aa..72070e19f65701 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -770,6 +770,7 @@ Lawrence Kesteloot Vivek Khera Dhiru Kholia Akshit Khurana +Sanyam Khurana Mads Kiilerich Jason Killen Jan Kim From 854ca174a92970d11d9b063af46e00d132832944 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Sun, 9 Apr 2017 10:15:06 -0700 Subject: [PATCH 0213/2287] Remove invalid comment in urllib.request. (#1055) (cherry picked from commit a2a9ddd923a849124bdd1c484f70f02df6fde0e9) --- Lib/urllib/request.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index b6690c3d0e4bf5..3e82000466432f 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1658,14 +1658,10 @@ def pathname2url(pathname): of the 'file' scheme; not recommended for general use.""" return quote(pathname) -# This really consists of two pieces: -# (1) a class which handles opening of all sorts of URLs -# (plus assorted utilities etc.) -# (2) a set of functions for parsing URLs -# XXX Should these be separated out into different modules? - ftpcache = {} + + class URLopener: """Class to open URLs. This is a class rather than just a subroutine because we may need From 90eb7a9ff4ce38b5c4e3662bdd42a0ed513893a2 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 9 Apr 2017 15:15:57 -0700 Subject: [PATCH 0214/2287] [3.6] Correct typo in configparser.rst (GH-1012) (GH-1025) (cherry picked from commit 01fa9ae5460b00bf1ced500c797176ebd3fb060d) --- Doc/library/configparser.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/configparser.rst b/Doc/library/configparser.rst index af57cba2b5661d..04c2a820921759 100644 --- a/Doc/library/configparser.rst +++ b/Doc/library/configparser.rst @@ -34,8 +34,8 @@ can be customized by end users easily. .. seealso:: Module :mod:`shlex` - Support for a creating Unix shell-like mini-languages which can be used - as an alternate format for application configuration files. + Support for creating Unix shell-like mini-languages which can be used as + an alternate format for application configuration files. Module :mod:`json` The json module implements a subset of JavaScript syntax which can also From 577fc04a7157f6e904cffd6a0e1ad83d3460acd6 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 9 Apr 2017 15:17:06 -0700 Subject: [PATCH 0215/2287] [3.6] bpo-29549: Fixes docstring for str.index (GH-256) (GH-1028) (cherry picked from commit 43ba8861e0ad044efafa46a7cc04e12ac5df640e) --- Objects/bytes_methods.c | 13 ++++++++++--- Objects/unicodeobject.c | 12 ++++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Objects/bytes_methods.c b/Objects/bytes_methods.c index d5c4fe6346fc53..625e242d563d89 100644 --- a/Objects/bytes_methods.c +++ b/Objects/bytes_methods.c @@ -542,7 +542,11 @@ _Py_bytes_find(const char *str, Py_ssize_t len, PyObject *args) PyDoc_STRVAR_shared(_Py_index__doc__, "B.index(sub[, start[, end]]) -> int\n\ \n\ -Like B.find() but raise ValueError when the subsection is not found."); +Return the lowest index in B where subsection sub is found,\n\ +such that sub is contained within B[start,end]. Optional\n\ +arguments start and end are interpreted as in slice notation.\n\ +\n\ +Raises ValueError when the subsection is not found."); PyObject * _Py_bytes_index(const char *str, Py_ssize_t len, PyObject *args) @@ -579,7 +583,11 @@ _Py_bytes_rfind(const char *str, Py_ssize_t len, PyObject *args) PyDoc_STRVAR_shared(_Py_rindex__doc__, "B.rindex(sub[, start[, end]]) -> int\n\ \n\ -Like B.rfind() but raise ValueError when the subsection is not found."); +Return the highest index in B where subsection sub is found,\n\ +such that sub is contained within B[start,end]. Optional\n\ +arguments start and end are interpreted as in slice notation.\n\ +\n\ +Raise ValueError when the subsection is not found."); PyObject * _Py_bytes_rindex(const char *str, Py_ssize_t len, PyObject *args) @@ -811,4 +819,3 @@ PyDoc_STRVAR_shared(_Py_zfill__doc__, "\n" "Pad a numeric string B with zeros on the left, to fill a field\n" "of the specified width. B is never truncated."); - diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 949205adf9347e..7871043681533d 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -11701,7 +11701,11 @@ unicode_hash(PyObject *self) PyDoc_STRVAR(index__doc__, "S.index(sub[, start[, end]]) -> int\n\ \n\ -Like S.find() but raise ValueError when the substring is not found."); +Return the lowest index in S where substring sub is found, \n\ +such that sub is contained within S[start:end]. Optional\n\ +arguments start and end are interpreted as in slice notation.\n\ +\n\ +Raises ValueError when the substring is not found."); static PyObject * unicode_index(PyObject *self, PyObject *args) @@ -12758,7 +12762,11 @@ unicode_rfind(PyObject *self, PyObject *args) PyDoc_STRVAR(rindex__doc__, "S.rindex(sub[, start[, end]]) -> int\n\ \n\ -Like S.rfind() but raise ValueError when the substring is not found."); +Return the highest index in S where substring sub is found,\n\ +such that sub is contained within S[start:end]. Optional\n\ +arguments start and end are interpreted as in slice notation.\n\ +\n\ +Raises ValueError when the substring is not found."); static PyObject * unicode_rindex(PyObject *self, PyObject *args) From 28ddd3c905836907bf0c4df909067d3a054358c1 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 9 Apr 2017 15:17:28 -0700 Subject: [PATCH 0216/2287] [3.6] Improvements to typing documentation (GH-967) (GH-1053) Documents a few omitted classes and adds NamedTuple methods. (cherry picked from commit 45d22c256bce3afcf57f49032a6b20fdec4f26ad) --- Doc/library/typing.rst | 50 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index d130e1759d8f59..2cfc37f695ef2d 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -508,6 +508,14 @@ The module defines the following classes, functions and decorators: An ABC with one abstract method ``__float__``. +.. class:: SupportsComplex + + An ABC with one abstract method ``__complex__``. + +.. class:: SupportsBytes + + An ABC with one abstract method ``__bytes__``. + .. class:: SupportsAbs An ABC with one abstract method ``__abs__`` that is covariant @@ -658,7 +666,19 @@ The module defines the following classes, functions and decorators: .. class:: DefaultDict(collections.defaultdict, MutableMapping[KT, VT]) - A generic version of :class:`collections.defaultdict` + A generic version of :class:`collections.defaultdict`. + +.. class:: Counter(collections.Counter, Dict[T, int]) + + A generic version of :class:`collections.Counter`. + + .. versionadded:: 3.6.1 + +.. class:: ChainMap(collections.ChainMap, MutableMapping[KT, VT]) + + A generic version of :class:`collections.ChainMap`. + + .. versionadded:: 3.6.1 .. class:: Generator(Iterator[T_co], Generic[T_co, T_contra, V_co]) @@ -742,9 +762,12 @@ The module defines the following classes, functions and decorators: This defines the generic type ``IO[AnyStr]`` and aliases ``TextIO`` and ``BinaryIO`` for respectively ``IO[str]`` and ``IO[bytes]``. - These representing the types of I/O streams such as returned by + These represent the types of I/O streams such as returned by :func:`open`. + These types are also accessible directly as ``typing.IO``, + ``typing.TextIO``, and ``typing.BinaryIO``. + .. class:: re Wrapper namespace for regular expression matching types. @@ -756,6 +779,9 @@ The module defines the following classes, functions and decorators: ``Pattern[str]``, ``Pattern[bytes]``, ``Match[str]``, or ``Match[bytes]``. + These types are also accessible directly as ``typing.Pattern`` + and ``typing.Match``. + .. class:: NamedTuple Typed version of namedtuple. @@ -782,10 +808,20 @@ The module defines the following classes, functions and decorators: Fields with a default value must come after any fields without a default. The resulting class has two extra attributes: ``_field_types``, - giving a dict mapping field names to types, and ``field_defaults``, a dict + giving a dict mapping field names to types, and ``_field_defaults``, a dict mapping field names to default values. (The field names are in the ``_fields`` attribute, which is part of the namedtuple API.) + ``NamedTuple`` subclasses can also have docstrings and methods:: + + class Employee(NamedTuple): + """Represents an employee.""" + name: str + id: int = 3 + + def __repr__(self) -> str: + return f'' + Backward-compatible usage:: Employee = NamedTuple('Employee', [('name', str), ('id', int)]) @@ -794,7 +830,7 @@ The module defines the following classes, functions and decorators: Added support for :pep:`526` variable annotation syntax. .. versionchanged:: 3.6.1 - Added support for default values. + Added support for default values, methods, and docstrings. .. function:: NewType(typ) @@ -972,9 +1008,9 @@ The module defines the following classes, functions and decorators: :data:`ClassVar` is not a class itself, and should not be used with :func:`isinstance` or :func:`issubclass`. - Note that :data:`ClassVar` does not change Python runtime behavior; - it can be used by 3rd party type checkers, so that the following - code might flagged as an error by those:: + :data:`ClassVar` does not change Python runtime behavior, but + it can be used by third-party type checkers. For example, a type checker + might flag the following code as an error:: enterprise_d = Starship(3000) enterprise_d.stats = {} # Error, setting class variable on instance From 03066a05f5cdf96bc3bf15718f586877860f2d47 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Sun, 9 Apr 2017 20:37:44 -0700 Subject: [PATCH 0217/2287] Remove OSError related comment in urllib.request. (#1072) (cherry picked from commit 6dfcc81f6b1c82a71a1c876e14424fb8b3573447) --- Lib/urllib/request.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 3e82000466432f..96921440edea11 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1488,7 +1488,6 @@ def open_local_file(self, req): origurl = 'file://' + filename return addinfourl(open(localfile, 'rb'), headers, origurl) except OSError as exp: - # users shouldn't expect OSErrors coming from urlopen() raise URLError(exp) raise URLError('file not on local host') From f0c416799b33742af36d7c6608b9a422615fb3d2 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 12 Apr 2017 20:02:21 -0700 Subject: [PATCH 0218/2287] [3.6] bpo-30047: Fix a typo in Doc/library/select.rst (GH-1086) (GH-1098) (cherry picked from commit 3e0f1fc4e0ffcfcc706015fa3d67c262948ef171) --- Doc/library/select.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/select.rst b/Doc/library/select.rst index f97118ebe05788..bd5442c6a27aa0 100644 --- a/Doc/library/select.rst +++ b/Doc/library/select.rst @@ -290,7 +290,7 @@ Edge and Level Trigger Polling (epoll) Objects | :const:`EPOLLEXCLUSIVE` | Wake only one epoll object when the | | | associated fd has an event. The default (if | | | this flag is not set) is to wake all epoll | - | | objects polling on on a fd. | + | | objects polling on a fd. | +-------------------------+-----------------------------------------------+ | :const:`EPOLLRDHUP` | Stream socket peer closed connection or shut | | | down writing half of connection. | From 14944c62300f741488c2f28cb91ad1e3fef7343b Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Thu, 13 Apr 2017 11:14:17 +0800 Subject: [PATCH 0219/2287] bpo-26985: Add missing info of code object in inspect documentation (GH-1090) (GH-1099) --- Doc/library/inspect.rst | 379 +++++++++++++++++++++------------------- Lib/inspect.py | 30 ++-- Misc/NEWS | 5 + 3 files changed, 223 insertions(+), 191 deletions(-) diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index 4ff2187b45f8eb..6be28a2b31cb66 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -34,185 +34,198 @@ provided as convenient choices for the second argument to :func:`getmembers`. They also help you determine when you can expect to find the following special attributes: -+-----------+-----------------+---------------------------+ -| Type | Attribute | Description | -+===========+=================+===========================+ -| module | __doc__ | documentation string | -+-----------+-----------------+---------------------------+ -| | __file__ | filename (missing for | -| | | built-in modules) | -+-----------+-----------------+---------------------------+ -| class | __doc__ | documentation string | -+-----------+-----------------+---------------------------+ -| | __name__ | name with which this | -| | | class was defined | -+-----------+-----------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-----------------+---------------------------+ -| | __module__ | name of module in which | -| | | this class was defined | -+-----------+-----------------+---------------------------+ -| method | __doc__ | documentation string | -+-----------+-----------------+---------------------------+ -| | __name__ | name with which this | -| | | method was defined | -+-----------+-----------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-----------------+---------------------------+ -| | __func__ | function object | -| | | containing implementation | -| | | of method | -+-----------+-----------------+---------------------------+ -| | __self__ | instance to which this | -| | | method is bound, or | -| | | ``None`` | -+-----------+-----------------+---------------------------+ -| function | __doc__ | documentation string | -+-----------+-----------------+---------------------------+ -| | __name__ | name with which this | -| | | function was defined | -+-----------+-----------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-----------------+---------------------------+ -| | __code__ | code object containing | -| | | compiled function | -| | | :term:`bytecode` | -+-----------+-----------------+---------------------------+ -| | __defaults__ | tuple of any default | -| | | values for positional or | -| | | keyword parameters | -+-----------+-----------------+---------------------------+ -| | __kwdefaults__ | mapping of any default | -| | | values for keyword-only | -| | | parameters | -+-----------+-----------------+---------------------------+ -| | __globals__ | global namespace in which | -| | | this function was defined | -+-----------+-----------------+---------------------------+ -| | __annotations__ | mapping of parameters | -| | | names to annotations; | -| | | ``"return"`` key is | -| | | reserved for return | -| | | annotations. | -+-----------+-----------------+---------------------------+ -| traceback | tb_frame | frame object at this | -| | | level | -+-----------+-----------------+---------------------------+ -| | tb_lasti | index of last attempted | -| | | instruction in bytecode | -+-----------+-----------------+---------------------------+ -| | tb_lineno | current line number in | -| | | Python source code | -+-----------+-----------------+---------------------------+ -| | tb_next | next inner traceback | -| | | object (called by this | -| | | level) | -+-----------+-----------------+---------------------------+ -| frame | f_back | next outer frame object | -| | | (this frame's caller) | -+-----------+-----------------+---------------------------+ -| | f_builtins | builtins namespace seen | -| | | by this frame | -+-----------+-----------------+---------------------------+ -| | f_code | code object being | -| | | executed in this frame | -+-----------+-----------------+---------------------------+ -| | f_globals | global namespace seen by | -| | | this frame | -+-----------+-----------------+---------------------------+ -| | f_lasti | index of last attempted | -| | | instruction in bytecode | -+-----------+-----------------+---------------------------+ -| | f_lineno | current line number in | -| | | Python source code | -+-----------+-----------------+---------------------------+ -| | f_locals | local namespace seen by | -| | | this frame | -+-----------+-----------------+---------------------------+ -| | f_restricted | 0 or 1 if frame is in | -| | | restricted execution mode | -+-----------+-----------------+---------------------------+ -| | f_trace | tracing function for this | -| | | frame, or ``None`` | -+-----------+-----------------+---------------------------+ -| code | co_argcount | number of arguments (not | -| | | including \* or \*\* | -| | | args) | -+-----------+-----------------+---------------------------+ -| | co_code | string of raw compiled | -| | | bytecode | -+-----------+-----------------+---------------------------+ -| | co_consts | tuple of constants used | -| | | in the bytecode | -+-----------+-----------------+---------------------------+ -| | co_filename | name of file in which | -| | | this code object was | -| | | created | -+-----------+-----------------+---------------------------+ -| | co_firstlineno | number of first line in | -| | | Python source code | -+-----------+-----------------+---------------------------+ -| | co_flags | bitmap of ``CO_*`` flags, | -| | | read more :ref:`here | -| | | `| -+-----------+-----------------+---------------------------+ -| | co_lnotab | encoded mapping of line | -| | | numbers to bytecode | -| | | indices | -+-----------+-----------------+---------------------------+ -| | co_name | name with which this code | -| | | object was defined | -+-----------+-----------------+---------------------------+ -| | co_names | tuple of names of local | -| | | variables | -+-----------+-----------------+---------------------------+ -| | co_nlocals | number of local variables | -+-----------+-----------------+---------------------------+ -| | co_stacksize | virtual machine stack | -| | | space required | -+-----------+-----------------+---------------------------+ -| | co_varnames | tuple of names of | -| | | arguments and local | -| | | variables | -+-----------+-----------------+---------------------------+ -| generator | __name__ | name | -+-----------+-----------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-----------------+---------------------------+ -| | gi_frame | frame | -+-----------+-----------------+---------------------------+ -| | gi_running | is the generator running? | -+-----------+-----------------+---------------------------+ -| | gi_code | code | -+-----------+-----------------+---------------------------+ -| | gi_yieldfrom | object being iterated by | -| | | ``yield from``, or | -| | | ``None`` | -+-----------+-----------------+---------------------------+ -| coroutine | __name__ | name | -+-----------+-----------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-----------------+---------------------------+ -| | cr_await | object being awaited on, | -| | | or ``None`` | -+-----------+-----------------+---------------------------+ -| | cr_frame | frame | -+-----------+-----------------+---------------------------+ -| | cr_running | is the coroutine running? | -+-----------+-----------------+---------------------------+ -| | cr_code | code | -+-----------+-----------------+---------------------------+ -| builtin | __doc__ | documentation string | -+-----------+-----------------+---------------------------+ -| | __name__ | original name of this | -| | | function or method | -+-----------+-----------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-----------------+---------------------------+ -| | __self__ | instance to which a | -| | | method is bound, or | -| | | ``None`` | -+-----------+-----------------+---------------------------+ ++-----------+-------------------+---------------------------+ +| Type | Attribute | Description | ++===========+===================+===========================+ +| module | __doc__ | documentation string | ++-----------+-------------------+---------------------------+ +| | __file__ | filename (missing for | +| | | built-in modules) | ++-----------+-------------------+---------------------------+ +| class | __doc__ | documentation string | ++-----------+-------------------+---------------------------+ +| | __name__ | name with which this | +| | | class was defined | ++-----------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------+-------------------+---------------------------+ +| | __module__ | name of module in which | +| | | this class was defined | ++-----------+-------------------+---------------------------+ +| method | __doc__ | documentation string | ++-----------+-------------------+---------------------------+ +| | __name__ | name with which this | +| | | method was defined | ++-----------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------+-------------------+---------------------------+ +| | __func__ | function object | +| | | containing implementation | +| | | of method | ++-----------+-------------------+---------------------------+ +| | __self__ | instance to which this | +| | | method is bound, or | +| | | ``None`` | ++-----------+-------------------+---------------------------+ +| function | __doc__ | documentation string | ++-----------+-------------------+---------------------------+ +| | __name__ | name with which this | +| | | function was defined | ++-----------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------+-------------------+---------------------------+ +| | __code__ | code object containing | +| | | compiled function | +| | | :term:`bytecode` | ++-----------+-------------------+---------------------------+ +| | __defaults__ | tuple of any default | +| | | values for positional or | +| | | keyword parameters | ++-----------+-------------------+---------------------------+ +| | __kwdefaults__ | mapping of any default | +| | | values for keyword-only | +| | | parameters | ++-----------+-------------------+---------------------------+ +| | __globals__ | global namespace in which | +| | | this function was defined | ++-----------+-------------------+---------------------------+ +| | __annotations__ | mapping of parameters | +| | | names to annotations; | +| | | ``"return"`` key is | +| | | reserved for return | +| | | annotations. | ++-----------+-------------------+---------------------------+ +| traceback | tb_frame | frame object at this | +| | | level | ++-----------+-------------------+---------------------------+ +| | tb_lasti | index of last attempted | +| | | instruction in bytecode | ++-----------+-------------------+---------------------------+ +| | tb_lineno | current line number in | +| | | Python source code | ++-----------+-------------------+---------------------------+ +| | tb_next | next inner traceback | +| | | object (called by this | +| | | level) | ++-----------+-------------------+---------------------------+ +| frame | f_back | next outer frame object | +| | | (this frame's caller) | ++-----------+-------------------+---------------------------+ +| | f_builtins | builtins namespace seen | +| | | by this frame | ++-----------+-------------------+---------------------------+ +| | f_code | code object being | +| | | executed in this frame | ++-----------+-------------------+---------------------------+ +| | f_globals | global namespace seen by | +| | | this frame | ++-----------+-------------------+---------------------------+ +| | f_lasti | index of last attempted | +| | | instruction in bytecode | ++-----------+-------------------+---------------------------+ +| | f_lineno | current line number in | +| | | Python source code | ++-----------+-------------------+---------------------------+ +| | f_locals | local namespace seen by | +| | | this frame | ++-----------+-------------------+---------------------------+ +| | f_restricted | 0 or 1 if frame is in | +| | | restricted execution mode | ++-----------+-------------------+---------------------------+ +| | f_trace | tracing function for this | +| | | frame, or ``None`` | ++-----------+-------------------+---------------------------+ +| code | co_argcount | number of arguments (not | +| | | including keyword only | +| | | arguments, \* or \*\* | +| | | args) | ++-----------+-------------------+---------------------------+ +| | co_code | string of raw compiled | +| | | bytecode | ++-----------+-------------------+---------------------------+ +| | co_cellvars | tuple of names of cell | +| | | variables (referenced by | +| | | containing scopes) | ++-----------+-------------------+---------------------------+ +| | co_consts | tuple of constants used | +| | | in the bytecode | ++-----------+-------------------+---------------------------+ +| | co_filename | name of file in which | +| | | this code object was | +| | | created | ++-----------+-------------------+---------------------------+ +| | co_firstlineno | number of first line in | +| | | Python source code | ++-----------+-------------------+---------------------------+ +| | co_flags | bitmap of ``CO_*`` flags, | +| | | read more :ref:`here | +| | | `| ++-----------+-------------------+---------------------------+ +| | co_lnotab | encoded mapping of line | +| | | numbers to bytecode | +| | | indices | ++-----------+-------------------+---------------------------+ +| | co_freevars | tuple of names of free | +| | | variables (referenced via | +| | | a function's closure) | ++-----------+-------------------+---------------------------+ +| | co_kwonlyargcount | number of keyword only | +| | | arguments (not including | +| | | \*\* arg) | ++-----------+-------------------+---------------------------+ +| | co_name | name with which this code | +| | | object was defined | ++-----------+-------------------+---------------------------+ +| | co_names | tuple of names of local | +| | | variables | ++-----------+-------------------+---------------------------+ +| | co_nlocals | number of local variables | ++-----------+-------------------+---------------------------+ +| | co_stacksize | virtual machine stack | +| | | space required | ++-----------+-------------------+---------------------------+ +| | co_varnames | tuple of names of | +| | | arguments and local | +| | | variables | ++-----------+-------------------+---------------------------+ +| generator | __name__ | name | ++-----------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------+-------------------+---------------------------+ +| | gi_frame | frame | ++-----------+-------------------+---------------------------+ +| | gi_running | is the generator running? | ++-----------+-------------------+---------------------------+ +| | gi_code | code | ++-----------+-------------------+---------------------------+ +| | gi_yieldfrom | object being iterated by | +| | | ``yield from``, or | +| | | ``None`` | ++-----------+-------------------+---------------------------+ +| coroutine | __name__ | name | ++-----------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------+-------------------+---------------------------+ +| | cr_await | object being awaited on, | +| | | or ``None`` | ++-----------+-------------------+---------------------------+ +| | cr_frame | frame | ++-----------+-------------------+---------------------------+ +| | cr_running | is the coroutine running? | ++-----------+-------------------+---------------------------+ +| | cr_code | code | ++-----------+-------------------+---------------------------+ +| builtin | __doc__ | documentation string | ++-----------+-------------------+---------------------------+ +| | __name__ | original name of this | +| | | function or method | ++-----------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------+-------------------+---------------------------+ +| | __self__ | instance to which a | +| | | method is bound, or | +| | | ``None`` | ++-----------+-------------------+---------------------------+ .. versionchanged:: 3.5 @@ -1268,6 +1281,10 @@ Code Objects Bit Flags Python code objects have a ``co_flags`` attribute, which is a bitmap of the following flags: +.. data:: CO_OPTIMIZED + + The code object is optimized, using fast locals. + .. data:: CO_NEWLOCALS If set, a new dict will be created for the frame's ``f_locals`` when @@ -1281,6 +1298,10 @@ the following flags: The code object has a variable keyword parameter (``**kwargs``-like). +.. data:: CO_NESTED + + The flag is set when the code object is a nested function. + .. data:: CO_GENERATOR The flag is set when the code object is a generator function, i.e. diff --git a/Lib/inspect.py b/Lib/inspect.py index 4d56ef5d41b47f..a2dcb888a0c609 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -253,18 +253,24 @@ def iscode(object): """Return true if the object is a code object. Code objects provide these attributes: - co_argcount number of arguments (not including * or ** args) - co_code string of raw compiled bytecode - co_consts tuple of constants used in the bytecode - co_filename name of file in which this code object was created - co_firstlineno number of first line in Python source code - co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg - co_lnotab encoded mapping of line numbers to bytecode indices - co_name name with which this code object was defined - co_names tuple of names of local variables - co_nlocals number of local variables - co_stacksize virtual machine stack space required - co_varnames tuple of names of arguments and local variables""" + co_argcount number of arguments (not including *, ** args + or keyword only arguments) + co_code string of raw compiled bytecode + co_cellvars tuple of names of cell variables + co_consts tuple of constants used in the bytecode + co_filename name of file in which this code object was created + co_firstlineno number of first line in Python source code + co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg + | 16=nested | 32=generator | 64=nofree | 128=coroutine + | 256=iterable_coroutine | 512=async_generator + co_freevars tuple of names of free variables + co_kwonlyargcount number of keyword only arguments (not including ** arg) + co_lnotab encoded mapping of line numbers to bytecode indices + co_name name with which this code object was defined + co_names tuple of names of local variables + co_nlocals number of local variables + co_stacksize virtual machine stack space required + co_varnames tuple of names of arguments and local variables""" return isinstance(object, types.CodeType) def isbuiltin(object): diff --git a/Misc/NEWS b/Misc/NEWS index 83f9e7a6852560..dd1fa12d7c0be8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -86,6 +86,11 @@ Build - bpo-29643: Fix ``--enable-optimization`` didn't work. +Documentation +------------- + +- bpo-26985: Add missing info of code object in inspect documentation. + What's New in Python 3.6.1? =========================== From bc9025012fc5ae007283e9ef345dba0ba08cf2b9 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 12 Apr 2017 20:45:54 -0700 Subject: [PATCH 0220/2287] [3.6] Remove superfluous comment in urllib.error. (GH-1076) (GH-1101) (cherry picked from commit 6fab78e9027f9ebd6414995580781b480433e595) --- Lib/urllib/error.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Lib/urllib/error.py b/Lib/urllib/error.py index c5b675d16188b8..851515bc307d62 100644 --- a/Lib/urllib/error.py +++ b/Lib/urllib/error.py @@ -16,10 +16,6 @@ __all__ = ['URLError', 'HTTPError', 'ContentTooShortError'] -# do these error classes make sense? -# make sure all of the OSError stuff is overridden. we just want to be -# subtypes. - class URLError(OSError): # URLError is a sub-type of OSError, but it doesn't share any of # the implementation. need to override __init__ and __str__. From bd1173f202f5a3990063d980368e7ad1edc9b5b5 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 12 Apr 2017 20:52:39 -0700 Subject: [PATCH 0221/2287] [3.6] Clarify exception handler scope in contextlib (GH-1103) Moved explicit raise from inside try to try...else. (cherry picked from commit 680e20beee8bbce9f857b8e7795009191f98b0ba) --- Lib/contextlib.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/contextlib.py b/Lib/contextlib.py index 8421968525947e..e91cf460e53bfd 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -98,7 +98,6 @@ def __exit__(self, type, value, traceback): value = type() try: self.gen.throw(type, value, traceback) - raise RuntimeError("generator didn't stop after throw()") except StopIteration as exc: # Suppress StopIteration *unless* it's the same exception that # was passed to throw(). This prevents a StopIteration @@ -124,6 +123,8 @@ def __exit__(self, type, value, traceback): # if sys.exc_info()[1] is not value: raise + else: + raise RuntimeError("generator didn't stop after throw()") def contextmanager(func): From 9b409ff41ceb2d7ea7e8d25a7bbf5eb7d46625f3 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 13 Apr 2017 02:50:21 -0700 Subject: [PATCH 0222/2287] [3.6] bpo-29692: contextlib.contextmanager may incorrectly unchain RuntimeError (GH-949) (#1105) contextlib._GeneratorContextManager.__exit__ includes a special case to deal with PEP 479 RuntimeErrors created when `StopIteration` is thrown into the context manager body. Previously this check was too permissive, and undid one level of chaining on *all* RuntimeError instances, not just those that wrapped a StopIteration instance. (cherry picked from commit 00c75e9a45ff0366c185e9e8a2e23af5a35481b0) --- Lib/contextlib.py | 12 ++++++------ Lib/test/test_contextlib.py | 23 +++++++++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Lib/contextlib.py b/Lib/contextlib.py index e91cf460e53bfd..5e47054954ba5a 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -88,7 +88,7 @@ def __exit__(self, type, value, traceback): try: next(self.gen) except StopIteration: - return + return False else: raise RuntimeError("generator didn't stop") else: @@ -110,7 +110,7 @@ def __exit__(self, type, value, traceback): # Likewise, avoid suppressing if a StopIteration exception # was passed to throw() and later wrapped into a RuntimeError # (see PEP 479). - if exc.__cause__ is value: + if type is StopIteration and exc.__cause__ is value: return False raise except: @@ -121,10 +121,10 @@ def __exit__(self, type, value, traceback): # fixes the impedance mismatch between the throw() protocol # and the __exit__() protocol. # - if sys.exc_info()[1] is not value: - raise - else: - raise RuntimeError("generator didn't stop after throw()") + if sys.exc_info()[1] is value: + return False + raise + raise RuntimeError("generator didn't stop after throw()") def contextmanager(func): diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py index c04c804af57047..b1a467d952da0f 100644 --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -152,6 +152,29 @@ def woohoo(): else: self.fail('StopIteration was suppressed') + def test_contextmanager_do_not_unchain_non_stopiteration_exceptions(self): + @contextmanager + def test_issue29692(): + try: + yield + except Exception as exc: + raise RuntimeError('issue29692:Chained') from exc + try: + with test_issue29692(): + raise ZeroDivisionError + except Exception as ex: + self.assertIs(type(ex), RuntimeError) + self.assertEqual(ex.args[0], 'issue29692:Chained') + self.assertIsInstance(ex.__cause__, ZeroDivisionError) + + try: + with test_issue29692(): + raise StopIteration('issue29692:Unchained') + except Exception as ex: + self.assertIs(type(ex), StopIteration) + self.assertEqual(ex.args[0], 'issue29692:Unchained') + self.assertIsNone(ex.__cause__) + def _create_contextmanager_attribs(self): def attribs(**kw): def decorate(func): diff --git a/Misc/NEWS b/Misc/NEWS index dd1fa12d7c0be8..6e2db58a92f451 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -31,6 +31,9 @@ Core and Builtins Library ------- +- bpo-29692: Fixed arbitrary unchaining of RuntimeError exceptions in + contextlib.contextmanager. + Patch by Siddharth Velankar. - bpo-29998: Pickling and copying ImportError now preserves name and path attributes. From 97a40b7a5b2979fb17e1751c139fd4ba1ebd5276 Mon Sep 17 00:00:00 2001 From: Nevada Sanchez Date: Thu, 13 Apr 2017 06:21:05 -0400 Subject: [PATCH 0223/2287] bpo-29869: Allow underscores in numeric literals in lib2to3. (GH-752) --- Lib/lib2to3/pgen2/tokenize.py | 16 ++++++++-------- Lib/lib2to3/tests/data/py3_test_grammar.py | 22 ++++++++++++++++++++++ 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/Lib/lib2to3/pgen2/tokenize.py b/Lib/lib2to3/pgen2/tokenize.py index d14db60f7da89e..fba0fa2c00dccd 100644 --- a/Lib/lib2to3/pgen2/tokenize.py +++ b/Lib/lib2to3/pgen2/tokenize.py @@ -54,16 +54,16 @@ def maybe(*choices): return group(*choices) + '?' Ignore = Whitespace + any(r'\\\r?\n' + Whitespace) + maybe(Comment) Name = r'[a-zA-Z_]\w*' -Binnumber = r'0[bB][01]*' -Hexnumber = r'0[xX][\da-fA-F]*[lL]?' -Octnumber = r'0[oO]?[0-7]*[lL]?' -Decnumber = r'[1-9]\d*[lL]?' +Binnumber = r'0[bB]_?[01]+(?:_[01]+)*' +Hexnumber = r'0[xX]_?[\da-fA-F]+(?:_[\da-fA-F]+)*[lL]?' +Octnumber = r'0[oO]?_?[0-7]+(?:_[0-7]+)*[lL]?' +Decnumber = group(r'[1-9]\d*(?:_\d+)*[lL]?', '0[lL]?') Intnumber = group(Binnumber, Hexnumber, Octnumber, Decnumber) -Exponent = r'[eE][-+]?\d+' -Pointfloat = group(r'\d+\.\d*', r'\.\d+') + maybe(Exponent) -Expfloat = r'\d+' + Exponent +Exponent = r'[eE][-+]?\d+(?:_\d+)*' +Pointfloat = group(r'\d+(?:_\d+)*\.(?:\d+(?:_\d+)*)?', r'\.\d+(?:_\d+)*') + maybe(Exponent) +Expfloat = r'\d+(?:_\d+)*' + Exponent Floatnumber = group(Pointfloat, Expfloat) -Imagnumber = group(r'\d+[jJ]', Floatnumber + r'[jJ]') +Imagnumber = group(r'\d+(?:_\d+)*[jJ]', Floatnumber + r'[jJ]') Number = group(Imagnumber, Floatnumber, Intnumber) # Tail end of ' string. diff --git a/Lib/lib2to3/tests/data/py3_test_grammar.py b/Lib/lib2to3/tests/data/py3_test_grammar.py index cf31a5411a855a..0b9bee0ab42ea6 100644 --- a/Lib/lib2to3/tests/data/py3_test_grammar.py +++ b/Lib/lib2to3/tests/data/py3_test_grammar.py @@ -72,6 +72,28 @@ def testLongIntegers(self): x = 0b100000000000000000000000000000000000000000000000000000000000000000000 x = 0B111111111111111111111111111111111111111111111111111111111111111111111 + def testUnderscoresInNumbers(self): + # Integers + x = 1_0 + x = 123_456_7_89 + x = 0xabc_123_4_5 + x = 0X_abc_123 + x = 0B11_01 + x = 0b_11_01 + x = 0o45_67 + x = 0O_45_67 + + # Floats + x = 3_1.4 + x = 03_1.4 + x = 3_1. + x = .3_1 + x = 3.1_4 + x = 0_3.1_4 + x = 3e1_4 + x = 3_1e+4_1 + x = 3_1E-4_1 + def testFloats(self): x = 3.14 x = 314. From 84c2d75489a84174d8993aea292828662e35a50f Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 13 Apr 2017 04:03:16 -0700 Subject: [PATCH 0224/2287] Revert "bpo-29869: Allow underscores in numeric literals in lib2to3. (GH-752)" (GH-1109) This reverts commit 97a40b7a5b2979fb17e1751c139fd4ba1ebd5276. The commit is supposed to go to the master branch first. --- Lib/lib2to3/pgen2/tokenize.py | 16 ++++++++-------- Lib/lib2to3/tests/data/py3_test_grammar.py | 22 ---------------------- 2 files changed, 8 insertions(+), 30 deletions(-) diff --git a/Lib/lib2to3/pgen2/tokenize.py b/Lib/lib2to3/pgen2/tokenize.py index fba0fa2c00dccd..d14db60f7da89e 100644 --- a/Lib/lib2to3/pgen2/tokenize.py +++ b/Lib/lib2to3/pgen2/tokenize.py @@ -54,16 +54,16 @@ def maybe(*choices): return group(*choices) + '?' Ignore = Whitespace + any(r'\\\r?\n' + Whitespace) + maybe(Comment) Name = r'[a-zA-Z_]\w*' -Binnumber = r'0[bB]_?[01]+(?:_[01]+)*' -Hexnumber = r'0[xX]_?[\da-fA-F]+(?:_[\da-fA-F]+)*[lL]?' -Octnumber = r'0[oO]?_?[0-7]+(?:_[0-7]+)*[lL]?' -Decnumber = group(r'[1-9]\d*(?:_\d+)*[lL]?', '0[lL]?') +Binnumber = r'0[bB][01]*' +Hexnumber = r'0[xX][\da-fA-F]*[lL]?' +Octnumber = r'0[oO]?[0-7]*[lL]?' +Decnumber = r'[1-9]\d*[lL]?' Intnumber = group(Binnumber, Hexnumber, Octnumber, Decnumber) -Exponent = r'[eE][-+]?\d+(?:_\d+)*' -Pointfloat = group(r'\d+(?:_\d+)*\.(?:\d+(?:_\d+)*)?', r'\.\d+(?:_\d+)*') + maybe(Exponent) -Expfloat = r'\d+(?:_\d+)*' + Exponent +Exponent = r'[eE][-+]?\d+' +Pointfloat = group(r'\d+\.\d*', r'\.\d+') + maybe(Exponent) +Expfloat = r'\d+' + Exponent Floatnumber = group(Pointfloat, Expfloat) -Imagnumber = group(r'\d+(?:_\d+)*[jJ]', Floatnumber + r'[jJ]') +Imagnumber = group(r'\d+[jJ]', Floatnumber + r'[jJ]') Number = group(Imagnumber, Floatnumber, Intnumber) # Tail end of ' string. diff --git a/Lib/lib2to3/tests/data/py3_test_grammar.py b/Lib/lib2to3/tests/data/py3_test_grammar.py index 0b9bee0ab42ea6..cf31a5411a855a 100644 --- a/Lib/lib2to3/tests/data/py3_test_grammar.py +++ b/Lib/lib2to3/tests/data/py3_test_grammar.py @@ -72,28 +72,6 @@ def testLongIntegers(self): x = 0b100000000000000000000000000000000000000000000000000000000000000000000 x = 0B111111111111111111111111111111111111111111111111111111111111111111111 - def testUnderscoresInNumbers(self): - # Integers - x = 1_0 - x = 123_456_7_89 - x = 0xabc_123_4_5 - x = 0X_abc_123 - x = 0B11_01 - x = 0b_11_01 - x = 0o45_67 - x = 0O_45_67 - - # Floats - x = 3_1.4 - x = 03_1.4 - x = 3_1. - x = .3_1 - x = 3.1_4 - x = 0_3.1_4 - x = 3e1_4 - x = 3_1e+4_1 - x = 3_1E-4_1 - def testFloats(self): x = 3.14 x = 314. From 119d94ad37a99ecb0b8329467d04cd9d909e310e Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Thu, 13 Apr 2017 16:17:01 +0300 Subject: [PATCH 0225/2287] bpo-29791: Clarify that flush is keyword-only argument (GH-1093) Reported by Lucio Ricardo Montero Valenzuela. (cherry picked from commit 61b9ac93712df8092a25223cd56fa6528359792b) --- Doc/library/functions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 90fb07af227d98..9126535eecb85c 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1125,7 +1125,7 @@ are always available. They are listed here in alphabetical order. .. function:: print(*objects, sep=' ', end='\\n', file=sys.stdout, flush=False) Print *objects* to the text stream *file*, separated by *sep* and followed - by *end*. *sep*, *end* and *file*, if present, must be given as keyword + by *end*. *sep*, *end*, *file* and *flush*, if present, must be given as keyword arguments. All non-keyword arguments are converted to strings like :func:`str` does and From 936633282220768a6fec9bd6bb53ee9e3ec354df Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 13 Apr 2017 19:41:19 +0300 Subject: [PATCH 0226/2287] bpo-30021: Add examples for re.escape(). (#1048) (#1115) And fix the parameter name. (cherry picked from commit 8fc7bc2b7631ee819ee614e47b6f44bacebe1574) --- Doc/library/re.rst | 17 ++++++++++++++--- Doc/tools/susp-ignored.csv | 2 ++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst index 9cced512706554..944c6fb10d6c25 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -784,11 +784,22 @@ form. Unmatched groups are replaced with an empty string. -.. function:: escape(string) +.. function:: escape(pattern) - Escape all the characters in pattern except ASCII letters, numbers and ``'_'``. + Escape all the characters in *pattern* except ASCII letters, numbers and ``'_'``. This is useful if you want to match an arbitrary literal string that may - have regular expression metacharacters in it. + have regular expression metacharacters in it. For example:: + + >>> print(re.escape('python.exe')) + python\.exe + + >>> legal_chars = string.ascii_lowercase + string.digits + "!#$%&'*+-.^_`|~:" + >>> print('[%s]+' % re.escape(legal_chars)) + [abcdefghijklmnopqrstuvwxyz0123456789\!\#\$\%\&\'\*\+\-\.\^_\`\|\~\:]+ + + >>> operators = ['+', '-', '*', '/', '**'] + >>> print('|'.join(map(re.escape, sorted(operators, reverse=True)))) + \/|\-|\+|\*\*|\* .. versionchanged:: 3.3 The ``'_'`` character is no longer escaped. diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index 166374cb90cec1..57b0cf12f53712 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -302,6 +302,8 @@ whatsnew/3.2,,:feed,>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe: whatsnew/3.2,,:gz,">>> with tarfile.open(name='myarchive.tar.gz', mode='w:gz') as tf:" whatsnew/3.2,,:location,zope9-location = ${zope9:location} whatsnew/3.2,,:prefix,zope-conf = ${custom:prefix}/etc/zope.conf +library/re,,`,!#$%&'*+-.^_`|~: +library/re,,`,\!\#\$\%\&\'\*\+\-\.\^_\`\|\~\: library/tarfile,,:xz,'x:xz' library/xml.etree.elementtree,,:sometag,prefix:sometag library/xml.etree.elementtree,,:fictional," Date: Thu, 13 Apr 2017 14:11:48 -0700 Subject: [PATCH 0227/2287] convert from long long to PyLong loselessly (#1106) (#1121) --- Modules/_testcapimodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index f09205f63cc5ab..b25f4434ffa35c 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -3812,7 +3812,7 @@ test_PyTime_AsTimeval(PyObject *self, PyObject *args) if (_PyTime_AsTimeval(t, &tv, round) < 0) return NULL; - seconds = PyLong_FromLong((long long)tv.tv_sec); + seconds = PyLong_FromLongLong(tv.tv_sec); if (seconds == NULL) return NULL; return Py_BuildValue("Nl", seconds, tv.tv_usec); From c5c24cfaf9fe9a38f0901756cd797bd12524a8b7 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 13 Apr 2017 16:37:51 -0700 Subject: [PATCH 0228/2287] [3.6] Fix a typo in Doc/library/functions.rst (GH-1117) (GH-1123) Replace `For object's ... ` with `For objects ...` (cherry picked from commit 873ef20d0007b4b120933473e6252d2309a70102) --- Doc/library/functions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 9126535eecb85c..138f7d027cb86f 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -610,7 +610,7 @@ are always available. They are listed here in alphabetical order. .. note:: - For object's with custom :meth:`__hash__` methods, note that :func:`hash` + For objects with custom :meth:`__hash__` methods, note that :func:`hash` truncates the return value based on the bit width of the host machine. See :meth:`__hash__` for details. From 2cdf087d1fd48f7d0f95b5a0b31b9a624fa84751 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 13 Apr 2017 16:54:49 -0700 Subject: [PATCH 0229/2287] [3.6] bpo-29869: Allow underscores in numeric literals in lib2to3. (GH-1119) (GH-1122) * Allow underscores in numeric literals in lib2to3. * Stricter literal parsing for Python 3.6 in lib2to3.pgen2.tokenize. * Add test case for underscores in literals in Python 3. (cherry picked from commit a6e395dffadf8c5124903c01ad69fefa36b1a935) --- Lib/lib2to3/pgen2/tokenize.py | 16 ++++++++-------- Lib/lib2to3/tests/data/py3_test_grammar.py | 22 ++++++++++++++++++++++ 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/Lib/lib2to3/pgen2/tokenize.py b/Lib/lib2to3/pgen2/tokenize.py index d14db60f7da89e..fba0fa2c00dccd 100644 --- a/Lib/lib2to3/pgen2/tokenize.py +++ b/Lib/lib2to3/pgen2/tokenize.py @@ -54,16 +54,16 @@ def maybe(*choices): return group(*choices) + '?' Ignore = Whitespace + any(r'\\\r?\n' + Whitespace) + maybe(Comment) Name = r'[a-zA-Z_]\w*' -Binnumber = r'0[bB][01]*' -Hexnumber = r'0[xX][\da-fA-F]*[lL]?' -Octnumber = r'0[oO]?[0-7]*[lL]?' -Decnumber = r'[1-9]\d*[lL]?' +Binnumber = r'0[bB]_?[01]+(?:_[01]+)*' +Hexnumber = r'0[xX]_?[\da-fA-F]+(?:_[\da-fA-F]+)*[lL]?' +Octnumber = r'0[oO]?_?[0-7]+(?:_[0-7]+)*[lL]?' +Decnumber = group(r'[1-9]\d*(?:_\d+)*[lL]?', '0[lL]?') Intnumber = group(Binnumber, Hexnumber, Octnumber, Decnumber) -Exponent = r'[eE][-+]?\d+' -Pointfloat = group(r'\d+\.\d*', r'\.\d+') + maybe(Exponent) -Expfloat = r'\d+' + Exponent +Exponent = r'[eE][-+]?\d+(?:_\d+)*' +Pointfloat = group(r'\d+(?:_\d+)*\.(?:\d+(?:_\d+)*)?', r'\.\d+(?:_\d+)*') + maybe(Exponent) +Expfloat = r'\d+(?:_\d+)*' + Exponent Floatnumber = group(Pointfloat, Expfloat) -Imagnumber = group(r'\d+[jJ]', Floatnumber + r'[jJ]') +Imagnumber = group(r'\d+(?:_\d+)*[jJ]', Floatnumber + r'[jJ]') Number = group(Imagnumber, Floatnumber, Intnumber) # Tail end of ' string. diff --git a/Lib/lib2to3/tests/data/py3_test_grammar.py b/Lib/lib2to3/tests/data/py3_test_grammar.py index cf31a5411a855a..0b9bee0ab42ea6 100644 --- a/Lib/lib2to3/tests/data/py3_test_grammar.py +++ b/Lib/lib2to3/tests/data/py3_test_grammar.py @@ -72,6 +72,28 @@ def testLongIntegers(self): x = 0b100000000000000000000000000000000000000000000000000000000000000000000 x = 0B111111111111111111111111111111111111111111111111111111111111111111111 + def testUnderscoresInNumbers(self): + # Integers + x = 1_0 + x = 123_456_7_89 + x = 0xabc_123_4_5 + x = 0X_abc_123 + x = 0B11_01 + x = 0b_11_01 + x = 0o45_67 + x = 0O_45_67 + + # Floats + x = 3_1.4 + x = 03_1.4 + x = 3_1. + x = .3_1 + x = 3.1_4 + x = 0_3.1_4 + x = 3e1_4 + x = 3_1e+4_1 + x = 3_1E-4_1 + def testFloats(self): x = 3.14 x = 314. From cbc46afa59dcc43c2c8c90ae7a0a0dc404325a89 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 13 Apr 2017 19:26:16 -0700 Subject: [PATCH 0230/2287] [3.6] bpo-29694: race condition in pathlib mkdir with flags parents=True (GH-1089). (GH-1126) (cherry picked from commit 22a594a0047d7706537ff2ac676cdc0f1dcb329c) --- Lib/pathlib.py | 4 ++-- Lib/test/test_pathlib.py | 30 ++++++++++++++++++++++++++++++ Misc/NEWS | 4 ++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 8c1cb96bad3075..70f5cba76ffa8a 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -1230,8 +1230,8 @@ def mkdir(self, mode=0o777, parents=False, exist_ok=False): except FileNotFoundError: if not parents or self.parent == self: raise - self.parent.mkdir(parents=True) - self._accessor.mkdir(self, mode) + self.parent.mkdir(parents=True, exist_ok=True) + self.mkdir(mode, parents=False, exist_ok=exist_ok) except OSError: # Cannot rely on checking for EEXIST, since the operating system # could give priority to other errors like EACCES or EROFS diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 3ff9726d4359ec..846f721e8d9abb 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -8,6 +8,7 @@ import stat import tempfile import unittest +from unittest import mock from test import support android_not_root = support.android_not_root @@ -1816,6 +1817,35 @@ def test_mkdir_no_parents_file(self): p.mkdir(exist_ok=True) self.assertEqual(cm.exception.errno, errno.EEXIST) + def test_mkdir_concurrent_parent_creation(self): + for pattern_num in range(32): + p = self.cls(BASE, 'dirCPC%d' % pattern_num) + self.assertFalse(p.exists()) + + def my_mkdir(path, mode=0o777): + path = str(path) + # Emulate another process that would create the directory + # just before we try to create it ourselves. We do it + # in all possible pattern combinations, assuming that this + # function is called at most 5 times (dirCPC/dir1/dir2, + # dirCPC/dir1, dirCPC, dirCPC/dir1, dirCPC/dir1/dir2). + if pattern.pop(): + os.mkdir(path, mode) # from another process + concurrently_created.add(path) + os.mkdir(path, mode) # our real call + + pattern = [bool(pattern_num & (1 << n)) for n in range(5)] + concurrently_created = set() + p12 = p / 'dir1' / 'dir2' + try: + with mock.patch("pathlib._normal_accessor.mkdir", my_mkdir): + p12.mkdir(parents=True, exist_ok=False) + except FileExistsError: + self.assertIn(str(p12), concurrently_created) + else: + self.assertNotIn(str(p12), concurrently_created) + self.assertTrue(p.exists()) + @with_symlinks def test_symlink_to(self): P = self.cls(BASE) diff --git a/Misc/NEWS b/Misc/NEWS index 6e2db58a92f451..e623457cdd18ce 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -31,6 +31,10 @@ Core and Builtins Library ------- + +- bpo-29694: Fixed race condition in pathlib mkdir with flags + parents=True. Patch by Armin Rigo. + - bpo-29692: Fixed arbitrary unchaining of RuntimeError exceptions in contextlib.contextmanager. Patch by Siddharth Velankar. From 413a8913aee255d0635e4ddbb9c343d9e5e76fea Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Fri, 14 Apr 2017 13:37:46 +0200 Subject: [PATCH 0231/2287] Relax test timing (bpo-29861) to avoid sporadic failures (#1120) (#1132) (cherry picked from commit 685cdb9acc3fca04a9897d88b89771ddfd50e772) --- Lib/test/_test_multiprocessing.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 771bbf24265b91..57ada127465d75 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -2080,6 +2080,7 @@ def test_release_task_refs(self): self.pool.map(identity, objs) del objs + time.sleep(DELTA) # let threaded cleanup code run self.assertEqual(set(wr() for wr in refs), {None}) # With a process pool, copies of the objects are returned, check # they were released too. From 7ac96ec60e944bbfa290c869225dc48b542b6884 Mon Sep 17 00:00:00 2001 From: Jack McCracken Date: Fri, 14 Apr 2017 10:44:34 -0400 Subject: [PATCH 0232/2287] Fix misplaced positional argument in OS X support library (#1137) --- Lib/_osx_support.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/_osx_support.py b/Lib/_osx_support.py index eadf06f20e2507..e37852e2536c33 100644 --- a/Lib/_osx_support.py +++ b/Lib/_osx_support.py @@ -210,7 +210,7 @@ def _remove_universal_flags(_config_vars): # Do not alter a config var explicitly overridden by env var if cv in _config_vars and cv not in os.environ: flags = _config_vars[cv] - flags = re.sub(r'-arch\s+\w+\s', ' ', flags, re.ASCII) + flags = re.sub(r'-arch\s+\w+\s', ' ', flags, flags=re.ASCII) flags = re.sub('-isysroot [^ \t]*', ' ', flags) _save_modified_value(_config_vars, cv, flags) From 2e30eb6a98fb9b47e840528b41f1fc4446c69f36 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Fri, 14 Apr 2017 09:59:34 -0700 Subject: [PATCH 0233/2287] improve alignment autoconf test (#1129) (#1139) Replace the deprecated AC_TRY_RUN with AC_RUN_IFELSE. Also, standardize the variable name and allow for caching of the result. --- aclocal.m4 | 4 ++-- configure | 35 +++++++++++++++++++++++++---------- configure.ac | 19 +++++++++---------- 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/aclocal.m4 b/aclocal.m4 index 9a9cc557281571..2a745e57466cae 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -13,7 +13,7 @@ m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -dnl serial 11 (pkg-config-0.29) +dnl serial 11 (pkg-config-0.29.1) dnl dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson @@ -55,7 +55,7 @@ dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], -[m4_define([PKG_MACROS_VERSION], [0.29]) +[m4_define([PKG_MACROS_VERSION], [0.29.1]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ diff --git a/configure b/configure index 8bdb82ba4a7bce..6a1b9e4edc2c23 100755 --- a/configure +++ b/configure @@ -784,6 +784,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -894,6 +895,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1146,6 +1148,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1283,7 +1294,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1436,6 +1447,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -9697,8 +9709,11 @@ esac # check for systems that require aligned memory access { $as_echo "$as_me:${as_lineno-$LINENO}: checking aligned memory access is required" >&5 $as_echo_n "checking aligned memory access is required... " >&6; } -if test "$cross_compiling" = yes; then : - aligned_required=yes +if ${ac_cv_aligned_required+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_aligned_required=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -9715,26 +9730,26 @@ int main() return 1; return 0; } - _ACEOF if ac_fn_c_try_run "$LINENO"; then : - aligned_required=no + ac_cv_aligned_required=no else - aligned_required=yes + ac_cv_aligned_required=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi -if test "$aligned_required" = yes ; then +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_aligned_required" >&5 +$as_echo "$ac_cv_aligned_required" >&6; } +if test "$ac_cv_aligned_required" = yes ; then $as_echo "#define HAVE_ALIGNED_REQUIRED 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $aligned_required" >&5 -$as_echo "$aligned_required" >&6; } - # str, bytes and memoryview hash algorithm diff --git a/configure.ac b/configure.ac index 6b331d5742745f..2c8e246f22f53e 100644 --- a/configure.ac +++ b/configure.ac @@ -2696,7 +2696,8 @@ esac # check for systems that require aligned memory access AC_MSG_CHECKING(aligned memory access is required) -AC_TRY_RUN([ +AC_CACHE_VAL(ac_cv_aligned_required, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ int main() { char s[16]; @@ -2708,18 +2709,16 @@ int main() if (*p1 == *p2) return 1; return 0; -} - ], - [aligned_required=no], - [aligned_required=yes], - [aligned_required=yes]) - -if test "$aligned_required" = yes ; then +}]])], +[ac_cv_aligned_required=no], +[ac_cv_aligned_required=yes], +[ac_cv_aligned_required=yes]) +]) +AC_MSG_RESULT($ac_cv_aligned_required) +if test "$ac_cv_aligned_required" = yes ; then AC_DEFINE([HAVE_ALIGNED_REQUIRED], [1], [Define if aligned memory access is required]) fi -AC_MSG_RESULT($aligned_required) - # str, bytes and memoryview hash algorithm AH_TEMPLATE(Py_HASH_ALGORITHM, From 8e7201342dc6eef201bfa4f533ad89a8144fd693 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 14 Apr 2017 18:34:11 -0700 Subject: [PATCH 0234/2287] [3.6] bpo-29738: Fix memory leak in _get_crl_dp (GH-526) (GH-1142) * Remove conditional on free of `dps`, since `dps` is now allocated for all versions of OpenSSL * Remove call to `x509_check_ca` since it was only used to cache the `crldp` field of the certificate CRL_DIST_POINTS_free is available in all supported versions of OpenSSL (recent 0.9.8+) and LibreSSL. (cherry picked from commit 2849cc34a8db93d448a62d69c462402347b50dcb) --- Modules/_ssl.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Modules/_ssl.c b/Modules/_ssl.c index c0a7b8e1052c33..2a2c18fe2f7309 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -1210,10 +1210,6 @@ _get_crl_dp(X509 *certificate) { int i, j; PyObject *lst, *res = NULL; -#if OPENSSL_VERSION_NUMBER >= 0x10001000L - /* Calls x509v3_cache_extensions and sets up crldp */ - X509_check_ca(certificate); -#endif dps = X509_get_ext_d2i(certificate, NID_crl_distribution_points, NULL, NULL); if (dps == NULL) @@ -1258,9 +1254,7 @@ _get_crl_dp(X509 *certificate) { done: Py_XDECREF(lst); -#if OPENSSL_VERSION_NUMBER < 0x10001000L - sk_DIST_POINT_free(dps); -#endif + CRL_DIST_POINTS_free(dps); return res; } From 05bfbcd233b2f5ba0d0634a380092d6ead6b35e1 Mon Sep 17 00:00:00 2001 From: Michael Seifert Date: Sat, 15 Apr 2017 04:03:41 +0200 Subject: [PATCH 0235/2287] [3.6] bpo-30059: Include Py_Ellipsis in C API documentation (GH-1018) (GH-1149) --- Doc/c-api/slice.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Doc/c-api/slice.rst b/Doc/c-api/slice.rst index a825164918f446..8b695e065aeffd 100644 --- a/Doc/c-api/slice.rst +++ b/Doc/c-api/slice.rst @@ -56,3 +56,14 @@ Slice Objects .. versionchanged:: 3.2 The parameter type for the *slice* parameter was ``PySliceObject*`` before. + + +Ellipsis Object +--------------- + + +.. c:var:: PyObject *Py_Ellipsis + + The Python ``Ellipsis`` object. This object has no methods. It needs to be + treated just like any other object with respect to reference counts. Like + :c:data:`Py_None` it is a singleton object. From d5fa5f3ce7d9003bbd3975d1bf634043305ae18f Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Sat, 15 Apr 2017 13:25:15 +0800 Subject: [PATCH 0236/2287] bpo-30068: add missing iter(self) in _io._IOBase.readlines when hint is present (#1130) (#1150) --- Lib/test/test_io.py | 1 + Misc/NEWS | 8 +++++--- Modules/_io/iobase.c | 25 +++++++++++++++++-------- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 8f895fe0bfb885..e04baefef081d4 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -3498,6 +3498,7 @@ def test_io_after_close(self): self.assertRaises(ValueError, f.readinto1, bytearray(1024)) self.assertRaises(ValueError, f.readline) self.assertRaises(ValueError, f.readlines) + self.assertRaises(ValueError, f.readlines, 1) self.assertRaises(ValueError, f.seek, 0) self.assertRaises(ValueError, f.tell) self.assertRaises(ValueError, f.truncate) diff --git a/Misc/NEWS b/Misc/NEWS index e623457cdd18ce..7628ed5cab7987 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,12 +32,14 @@ Core and Builtins Library ------- +- bpo-30068: _io._IOBase.readlines will check if it's closed first when + hint is present. + - bpo-29694: Fixed race condition in pathlib mkdir with flags parents=True. Patch by Armin Rigo. -- bpo-29692: Fixed arbitrary unchaining of RuntimeError exceptions in - contextlib.contextmanager. - Patch by Siddharth Velankar. +- bpo-29692: Fixed arbitrary unchaining of RuntimeError exceptions in + contextlib.contextmanager. Patch by Siddharth Velankar. - bpo-29998: Pickling and copying ImportError now preserves name and path attributes. diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index 472ef3b97cd38e..f7986d7e52f957 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -650,7 +650,7 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) /*[clinic end generated code: output=2f50421677fa3dea input=1961c4a95e96e661]*/ { Py_ssize_t length = 0; - PyObject *result; + PyObject *result, *it = NULL; result = PyList_New(0); if (result == NULL) @@ -664,19 +664,22 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) PyObject *ret = _PyObject_CallMethodId(result, &PyId_extend, "O", self); if (ret == NULL) { - Py_DECREF(result); - return NULL; + goto error; } Py_DECREF(ret); return result; } + it = PyObject_GetIter(self); + if (it == NULL) { + goto error; + } + while (1) { - PyObject *line = PyIter_Next(self); + PyObject *line = PyIter_Next(it); if (line == NULL) { if (PyErr_Occurred()) { - Py_DECREF(result); - return NULL; + goto error; } else break; /* StopIteration raised */ @@ -684,8 +687,7 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) if (PyList_Append(result, line) < 0) { Py_DECREF(line); - Py_DECREF(result); - return NULL; + goto error; } length += PyObject_Size(line); Py_DECREF(line); @@ -693,7 +695,14 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) if (length > hint) break; } + + Py_DECREF(it); return result; + + error: + Py_XDECREF(it); + Py_DECREF(result); + return NULL; } /*[clinic input] From 8e5b52a8da07e781bda50ba0a7065b1058495a37 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 16 Apr 2017 12:04:45 +0300 Subject: [PATCH 0237/2287] bpo-30017: Allowed calling the close() method of the zip entry writer object (#1041) (#1092) multiple times. Writing to closed zip entry writer object now always produce a ValueError. (cherry picked from commit 4c0d9ea995da595e90e08813b89510de59907802) --- Lib/test/test_zipfile.py | 42 ++++++++++++++++++++++++++++++++++++++++ Lib/zipfile.py | 4 ++++ Misc/NEWS | 3 +++ 3 files changed, 49 insertions(+) diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index d39f05fdb7788e..d09ad96fc8baaa 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -734,6 +734,48 @@ class LzmaTestZip64InSmallFiles(AbstractTestZip64InSmallFiles, compression = zipfile.ZIP_LZMA +class AbstractWriterTests: + + def tearDown(self): + unlink(TESTFN2) + + def test_close_after_close(self): + data = b'content' + with zipfile.ZipFile(TESTFN2, "w", self.compression) as zipf: + w = zipf.open('test', 'w') + w.write(data) + w.close() + self.assertTrue(w.closed) + w.close() + self.assertTrue(w.closed) + self.assertEqual(zipf.read('test'), data) + + def test_write_after_close(self): + data = b'content' + with zipfile.ZipFile(TESTFN2, "w", self.compression) as zipf: + w = zipf.open('test', 'w') + w.write(data) + w.close() + self.assertTrue(w.closed) + self.assertRaises(ValueError, w.write, b'') + self.assertEqual(zipf.read('test'), data) + +class StoredWriterTests(AbstractWriterTests, unittest.TestCase): + compression = zipfile.ZIP_STORED + +@requires_zlib +class DeflateWriterTests(AbstractWriterTests, unittest.TestCase): + compression = zipfile.ZIP_DEFLATED + +@requires_bz2 +class Bzip2WriterTests(AbstractWriterTests, unittest.TestCase): + compression = zipfile.ZIP_BZIP2 + +@requires_lzma +class LzmaWriterTests(AbstractWriterTests, unittest.TestCase): + compression = zipfile.ZIP_LZMA + + class PyZipFileTests(unittest.TestCase): def assertCompiledIn(self, name, namelist): if name + 'o' not in namelist: diff --git a/Lib/zipfile.py b/Lib/zipfile.py index d7f5beba996e6e..06eedec340bc17 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -981,6 +981,8 @@ def writable(self): return True def write(self, data): + if self.closed: + raise ValueError('I/O operation on closed file.') nbytes = len(data) self._file_size += nbytes self._crc = crc32(data, self._crc) @@ -991,6 +993,8 @@ def write(self, data): return nbytes def close(self): + if self.closed: + return super().close() # Flush any data from the compressor, and update header info if self._compressor: diff --git a/Misc/NEWS b/Misc/NEWS index 7628ed5cab7987..673211d72dda51 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,9 @@ Core and Builtins Library ------- +- bpo-30017: Allowed calling the close() method of the zip entry writer object + multiple times. Writing to a closed writer now always produces a ValueError. + - bpo-30068: _io._IOBase.readlines will check if it's closed first when hint is present. From 680fea4067537a9b9c79aadd44a3a19e83cd2dbf Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 19 Apr 2017 21:22:49 +0300 Subject: [PATCH 0238/2287] bpo-30061: Check if PyObject_Size()/PySequence_Size()/PyMapping_Size() (#1096) (#1180) raised an error. (cherry picked from commit bf623ae8843dc30b28c574bec8d29fc14be59d86) --- Lib/test/test_io.py | 16 ++++++++ Misc/NEWS | 5 +++ Modules/_io/iobase.c | 13 +++++-- Modules/_winapi.c | 17 ++++++--- Modules/cjkcodecs/multibytecodec.c | 3 ++ Modules/posixmodule.c | 60 +++++++++++++++++++++--------- Objects/setobject.c | 12 ++++-- 7 files changed, 95 insertions(+), 31 deletions(-) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index e04baefef081d4..5a7617cd9f9cbf 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -543,6 +543,22 @@ def test_readline(self): with self.open(support.TESTFN, "r") as f: self.assertRaises(TypeError, f.readline, 5.3) + def test_readline_nonsizeable(self): + # Issue #30061 + # Crash when readline() returns an object without __len__ + class R(self.IOBase): + def readline(self): + return None + self.assertRaises((TypeError, StopIteration), next, R()) + + def test_next_nonsizeable(self): + # Issue #30061 + # Crash when __next__() returns an object without __len__ + class R(self.IOBase): + def __next__(self): + return None + self.assertRaises(TypeError, R().readlines, 1) + def test_raw_bytes_io(self): f = self.BytesIO() self.write_ops(f) diff --git a/Misc/NEWS b/Misc/NEWS index 673211d72dda51..44a4b873b1454b 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,11 @@ Core and Builtins Library ------- +- bpo-30061: Fixed crashes in IOBase methods __next__() and readlines() when + readline() or __next__() respectively return non-sizeable object. + Fixed possible other errors caused by not checking results of PyObject_Size(), + PySequence_Size(), or PyMapping_Size(). + - bpo-30017: Allowed calling the close() method of the zip entry writer object multiple times. Writing to a closed writer now always produces a ValueError. diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index f7986d7e52f957..c8642040ae426a 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -625,7 +625,8 @@ iobase_iternext(PyObject *self) if (line == NULL) return NULL; - if (PyObject_Size(line) == 0) { + if (PyObject_Size(line) <= 0) { + /* Error or empty */ Py_DECREF(line); return NULL; } @@ -676,6 +677,7 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) } while (1) { + Py_ssize_t line_length; PyObject *line = PyIter_Next(it); if (line == NULL) { if (PyErr_Occurred()) { @@ -689,11 +691,14 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) Py_DECREF(line); goto error; } - length += PyObject_Size(line); + line_length = PyObject_Size(line); Py_DECREF(line); - - if (length > hint) + if (line_length < 0) { + goto error; + } + if (line_length > hint - length) break; + length += line_length; } Py_DECREF(it); diff --git a/Modules/_winapi.c b/Modules/_winapi.c index 91d4f0172c3c50..248f4582c60fb4 100644 --- a/Modules/_winapi.c +++ b/Modules/_winapi.c @@ -722,17 +722,22 @@ getenvironment(PyObject* environment) return NULL; } - envsize = PyMapping_Length(environment); - keys = PyMapping_Keys(environment); values = PyMapping_Values(environment); if (!keys || !values) goto error; + envsize = PySequence_Fast_GET_SIZE(keys); + if (PySequence_Fast_GET_SIZE(values) != envsize) { + PyErr_SetString(PyExc_RuntimeError, + "environment changed size during iteration"); + goto error; + } + totalsize = 1; /* trailing null character */ for (i = 0; i < envsize; i++) { - PyObject* key = PyList_GET_ITEM(keys, i); - PyObject* value = PyList_GET_ITEM(values, i); + PyObject* key = PySequence_Fast_GET_ITEM(keys, i); + PyObject* value = PySequence_Fast_GET_ITEM(values, i); if (! PyUnicode_Check(key) || ! PyUnicode_Check(value)) { PyErr_SetString(PyExc_TypeError, @@ -760,8 +765,8 @@ getenvironment(PyObject* environment) end = buffer + totalsize; for (i = 0; i < envsize; i++) { - PyObject* key = PyList_GET_ITEM(keys, i); - PyObject* value = PyList_GET_ITEM(values, i); + PyObject* key = PySequence_Fast_GET_ITEM(keys, i); + PyObject* value = PySequence_Fast_GET_ITEM(values, i); if (!PyUnicode_AsUCS4(key, p, end - p, 0)) goto error; p += PyUnicode_GET_LENGTH(key); diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index d1da189ddd3bef..d6efc77d20c883 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -1670,6 +1670,9 @@ _multibytecodec_MultibyteStreamWriter_writelines(MultibyteStreamWriterObject *se if (r == -1) return NULL; } + /* PySequence_Length() can fail */ + if (PyErr_Occurred()) + return NULL; Py_RETURN_NONE; } diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 2ea5e2def9acff..f4bbc8931b39fa 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -6650,7 +6650,7 @@ static PyObject * os_setgroups(PyObject *module, PyObject *groups) /*[clinic end generated code: output=3fcb32aad58c5ecd input=fa742ca3daf85a7e]*/ { - int i, len; + Py_ssize_t i, len; gid_t grouplist[MAX_GROUPS]; if (!PySequence_Check(groups)) { @@ -6658,6 +6658,9 @@ os_setgroups(PyObject *module, PyObject *groups) return NULL; } len = PySequence_Size(groups); + if (len < 0) { + return NULL; + } if (len > MAX_GROUPS) { PyErr_SetString(PyExc_ValueError, "too many groups"); return NULL; @@ -7886,9 +7889,9 @@ os_read_impl(PyObject *module, int fd, Py_ssize_t length) #if (defined(HAVE_SENDFILE) && (defined(__FreeBSD__) || defined(__DragonFly__) \ || defined(__APPLE__))) || defined(HAVE_READV) || defined(HAVE_WRITEV) static Py_ssize_t -iov_setup(struct iovec **iov, Py_buffer **buf, PyObject *seq, int cnt, int type) +iov_setup(struct iovec **iov, Py_buffer **buf, PyObject *seq, Py_ssize_t cnt, int type) { - int i, j; + Py_ssize_t i, j; Py_ssize_t blen, total = 0; *iov = PyMem_New(struct iovec, cnt); @@ -7965,8 +7968,7 @@ static Py_ssize_t os_readv_impl(PyObject *module, int fd, PyObject *buffers) /*[clinic end generated code: output=792da062d3fcebdb input=e679eb5dbfa0357d]*/ { - int cnt; - Py_ssize_t n; + Py_ssize_t cnt, n; int async_err = 0; struct iovec *iov; Py_buffer *buf; @@ -7978,6 +7980,8 @@ os_readv_impl(PyObject *module, int fd, PyObject *buffers) } cnt = PySequence_Size(buffers); + if (cnt < 0) + return -1; if (iov_setup(&iov, &buf, buffers, cnt, PyBUF_WRITABLE) < 0) return -1; @@ -8116,15 +8120,24 @@ posix_sendfile(PyObject *self, PyObject *args, PyObject *kwdict) "sendfile() headers must be a sequence"); return NULL; } else { - Py_ssize_t i = 0; /* Avoid uninitialized warning */ - sf.hdr_cnt = PySequence_Size(headers); - if (sf.hdr_cnt > 0 && - (i = iov_setup(&(sf.headers), &hbuf, - headers, sf.hdr_cnt, PyBUF_SIMPLE)) < 0) + Py_ssize_t i = PySequence_Size(headers); + if (i < 0) + return NULL; + if (i > INT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "sendfile() header is too large"); return NULL; + } + if (i > 0) { + sf.hdr_cnt = (int)i; + i = iov_setup(&(sf.headers), &hbuf, + headers, sf.hdr_cnt, PyBUF_SIMPLE); + if (i < 0) + return NULL; #ifdef __APPLE__ - sbytes += i; + sbytes += i; #endif + } } } if (trailers != NULL) { @@ -8133,15 +8146,24 @@ posix_sendfile(PyObject *self, PyObject *args, PyObject *kwdict) "sendfile() trailers must be a sequence"); return NULL; } else { - Py_ssize_t i = 0; /* Avoid uninitialized warning */ - sf.trl_cnt = PySequence_Size(trailers); - if (sf.trl_cnt > 0 && - (i = iov_setup(&(sf.trailers), &tbuf, - trailers, sf.trl_cnt, PyBUF_SIMPLE)) < 0) + Py_ssize_t i = PySequence_Size(trailers); + if (i < 0) + return NULL; + if (i > INT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "sendfile() trailer is too large"); return NULL; + } + if (i > 0) { + sf.trl_cnt = (int)i; + i = iov_setup(&(sf.trailers), &tbuf, + trailers, sf.trl_cnt, PyBUF_SIMPLE); + if (i < 0) + return NULL; #ifdef __APPLE__ - sbytes += i; + sbytes += i; #endif + } } } @@ -8411,7 +8433,7 @@ static Py_ssize_t os_writev_impl(PyObject *module, int fd, PyObject *buffers) /*[clinic end generated code: output=56565cfac3aac15b input=5b8d17fe4189d2fe]*/ { - int cnt; + Py_ssize_t cnt; Py_ssize_t result; int async_err = 0; struct iovec *iov; @@ -8423,6 +8445,8 @@ os_writev_impl(PyObject *module, int fd, PyObject *buffers) return -1; } cnt = PySequence_Size(buffers); + if (cnt < 0) + return -1; if (iov_setup(&iov, &buf, buffers, cnt, PyBUF_SIMPLE) < 0) { return -1; diff --git a/Objects/setobject.c b/Objects/setobject.c index 9fe28138c0012b..c1bc1e1234799f 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1550,20 +1550,26 @@ set_difference(PySetObject *so, PyObject *other) PyObject *key; Py_hash_t hash; setentry *entry; - Py_ssize_t pos = 0; + Py_ssize_t pos = 0, other_size; int rv; if (PySet_GET_SIZE(so) == 0) { return set_copy(so); } - if (!PyAnySet_Check(other) && !PyDict_CheckExact(other)) { + if (PyAnySet_Check(other)) { + other_size = PySet_GET_SIZE(other); + } + else if (PyDict_CheckExact(other)) { + other_size = PyDict_Size(other); + } + else { return set_copy_and_difference(so, other); } /* If len(so) much more than len(other), it's more efficient to simply copy * so and then iterate other looking for common elements. */ - if ((PySet_GET_SIZE(so) >> 2) > PyObject_Size(other)) { + if ((PySet_GET_SIZE(so) >> 2) > other_size) { return set_copy_and_difference(so, other); } From 39dedb6e1a18069ce8f5c8e6076e9d9ef9d6d515 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 19 Apr 2017 23:22:19 +0300 Subject: [PATCH 0239/2287] [3.6] bpo-30070: Fixed leaks and crashes in errors handling in the parser module. (GH-1131). (#1184) (cherry picked from commit a79f4c219531c05fc8f670c1e4bbf12c081935d3) --- Lib/test/test_parser.py | 81 +++++++++++++++++++++++++ Misc/NEWS | 2 + Modules/parsermodule.c | 131 ++++++++++++++++++++++++---------------- 3 files changed, 162 insertions(+), 52 deletions(-) diff --git a/Lib/test/test_parser.py b/Lib/test/test_parser.py index d6e6f7157782ec..70cabb28598218 100644 --- a/Lib/test/test_parser.py +++ b/Lib/test/test_parser.py @@ -1,4 +1,6 @@ +import copy import parser +import pickle import unittest import operator import struct @@ -424,6 +426,52 @@ def test_junk(self): # not even remotely valid: self.check_bad_tree((1, 2, 3), "") + def test_illegal_terminal(self): + tree = \ + (257, + (269, + (270, + (271, + (277, + (1,))), + (4, ''))), + (4, ''), + (0, '')) + self.check_bad_tree(tree, "too small items in terminal node") + tree = \ + (257, + (269, + (270, + (271, + (277, + (1, b'pass'))), + (4, ''))), + (4, ''), + (0, '')) + self.check_bad_tree(tree, "non-string second item in terminal node") + tree = \ + (257, + (269, + (270, + (271, + (277, + (1, 'pass', '0', 0))), + (4, ''))), + (4, ''), + (0, '')) + self.check_bad_tree(tree, "non-integer third item in terminal node") + tree = \ + (257, + (269, + (270, + (271, + (277, + (1, 'pass', 0, 0))), + (4, ''))), + (4, ''), + (0, '')) + self.check_bad_tree(tree, "too many items in terminal node") + def test_illegal_yield_1(self): # Illegal yield statement: def f(): return 1; yield 1 tree = \ @@ -628,6 +676,24 @@ def test_missing_import_source(self): (4, ''), (0, '')) self.check_bad_tree(tree, "from import fred") + def test_illegal_encoding(self): + # Illegal encoding declaration + tree = \ + (339, + (257, (0, ''))) + self.check_bad_tree(tree, "missed encoding") + tree = \ + (339, + (257, (0, '')), + b'iso-8859-1') + self.check_bad_tree(tree, "non-string encoding") + tree = \ + (339, + (257, (0, '')), + '\udcff') + with self.assertRaises(UnicodeEncodeError): + parser.sequence2st(tree) + class CompileTestCase(unittest.TestCase): @@ -772,6 +838,21 @@ def test_comparisons(self): self.assertRaises(TypeError, operator.lt, st1, 1815) self.assertRaises(TypeError, operator.gt, b'waterloo', st2) + def test_copy_pickle(self): + sts = [ + parser.expr('2 + 3'), + parser.suite('x = 2; y = x + 3'), + parser.expr('list(x**3 for x in range(20))') + ] + for st in sts: + st_copy = copy.copy(st) + self.assertEqual(st_copy.totuple(), st.totuple()) + st_copy = copy.deepcopy(st) + self.assertEqual(st_copy.totuple(), st.totuple()) + for proto in range(pickle.HIGHEST_PROTOCOL+1): + st_copy = pickle.loads(pickle.dumps(st, proto)) + self.assertEqual(st_copy.totuple(), st.totuple()) + check_sizeof = support.check_sizeof @support.cpython_only diff --git a/Misc/NEWS b/Misc/NEWS index 44a4b873b1454b..cb9fab656ec692 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,8 @@ Core and Builtins Library ------- +- bpo-30070: Fixed leaks and crashes in errors handling in the parser module. + - bpo-30061: Fixed crashes in IOBase methods __next__() and readlines() when readline() or __next__() respectively return non-sizeable object. Fixed possible other errors caused by not checking results of PyObject_Size(), diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index b2566951d06de1..a4443350ef1cdc 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -698,7 +698,7 @@ validate_node(node *tree) short a_label = dfa_state->s_arc[arc].a_lbl; assert(a_label < _PyParser_Grammar.g_ll.ll_nlabels); if (_PyParser_Grammar.g_ll.ll_label[a_label].lb_type == ch_type) { - /* The child is acceptable; if non-terminal, validate it recursively. */ + /* The child is acceptable; if non-terminal, validate it recursively. */ if (ISNONTERMINAL(ch_type) && !validate_node(ch)) return 0; @@ -776,32 +776,35 @@ parser_tuple2st(PyST_Object *self, PyObject *args, PyObject *kw) */ tree = build_node_tree(tuple); if (tree != 0) { - node *validation_root = tree; + node *validation_root = NULL; int tree_type = 0; switch (TYPE(tree)) { case eval_input: /* Might be an eval form. */ tree_type = PyST_EXPR; + validation_root = tree; break; case encoding_decl: /* This looks like an encoding_decl so far. */ - if (NCH(tree) != 1) + if (NCH(tree) == 1) { + tree_type = PyST_SUITE; + validation_root = CHILD(tree, 0); + } + else { err_string("Error Parsing encoding_decl"); - validation_root = CHILD(tree, 0); - /* Fall through */ + } + break; case file_input: /* This looks like an exec form so far. */ - tree_type = PyST_SUITE; + validation_root = tree; break; default: /* This is a fragment, at best. */ - PyNode_Free(tree); err_string("parse tree does not use a valid start symbol"); - return (0); } - if (validate_node(validation_root)) + if (validation_root != NULL && validate_node(validation_root)) st = parser_newstobject(tree, tree_type); else PyNode_Free(tree); @@ -831,6 +834,9 @@ build_node_children(PyObject *tuple, node *root, int *line_num) Py_ssize_t i; int err; + if (len < 0) { + return NULL; + } for (i = 1; i < len; ++i) { /* elem must always be a sequence, however simple */ PyObject* elem = PySequence_GetItem(tuple, i); @@ -851,7 +857,7 @@ build_node_children(PyObject *tuple, node *root, int *line_num) if (type == -1 && PyErr_Occurred()) { Py_DECREF(temp); Py_DECREF(elem); - return 0; + return NULL; } } Py_DECREF(temp); @@ -863,7 +869,7 @@ build_node_children(PyObject *tuple, node *root, int *line_num) PyErr_SetObject(parser_error, err); Py_XDECREF(err); Py_XDECREF(elem); - return (0); + return NULL; } if (ISTERMINAL(type)) { Py_ssize_t len = PyObject_Size(elem); @@ -872,11 +878,14 @@ build_node_children(PyObject *tuple, node *root, int *line_num) if ((len != 2) && (len != 3)) { err_string("terminal nodes must have 2 or 3 entries"); - return 0; + Py_DECREF(elem); + return NULL; } temp = PySequence_GetItem(elem, 1); - if (temp == NULL) - return 0; + if (temp == NULL) { + Py_DECREF(elem); + return NULL; + } if (!PyUnicode_Check(temp)) { PyErr_Format(parser_error, "second item in terminal node must be a string," @@ -884,46 +893,49 @@ build_node_children(PyObject *tuple, node *root, int *line_num) Py_TYPE(temp)->tp_name); Py_DECREF(temp); Py_DECREF(elem); - return 0; + return NULL; } if (len == 3) { PyObject *o = PySequence_GetItem(elem, 2); - if (o != NULL) { - if (PyLong_Check(o)) { - int num = _PyLong_AsInt(o); - if (num == -1 && PyErr_Occurred()) { - Py_DECREF(o); - Py_DECREF(temp); - Py_DECREF(elem); - return 0; - } - *line_num = num; - } - else { - PyErr_Format(parser_error, - "third item in terminal node must be an" - " integer, found %s", - Py_TYPE(temp)->tp_name); + if (o == NULL) { + Py_DECREF(temp); + Py_DECREF(elem); + return NULL; + } + if (PyLong_Check(o)) { + int num = _PyLong_AsInt(o); + if (num == -1 && PyErr_Occurred()) { Py_DECREF(o); Py_DECREF(temp); Py_DECREF(elem); - return 0; + return NULL; } + *line_num = num; + } + else { + PyErr_Format(parser_error, + "third item in terminal node must be an" + " integer, found %s", + Py_TYPE(temp)->tp_name); Py_DECREF(o); + Py_DECREF(temp); + Py_DECREF(elem); + return NULL; } + Py_DECREF(o); } temp_str = PyUnicode_AsUTF8AndSize(temp, &len); if (temp_str == NULL) { Py_DECREF(temp); - Py_XDECREF(elem); - return 0; + Py_DECREF(elem); + return NULL; } strn = (char *)PyObject_MALLOC(len + 1); if (strn == NULL) { Py_DECREF(temp); - Py_XDECREF(elem); + Py_DECREF(elem); PyErr_NoMemory(); - return 0; + return NULL; } (void) memcpy(strn, temp_str, len + 1); Py_DECREF(temp); @@ -933,20 +945,21 @@ build_node_children(PyObject *tuple, node *root, int *line_num) * It has to be one or the other; this is an error. * Raise an exception. */ - PyObject *err = Py_BuildValue("os", elem, "unknown node type."); + PyObject *err = Py_BuildValue("Os", elem, "unknown node type."); PyErr_SetObject(parser_error, err); Py_XDECREF(err); - Py_XDECREF(elem); - return (0); + Py_DECREF(elem); + return NULL; } err = PyNode_AddChild(root, type, strn, *line_num, 0); if (err == E_NOMEM) { - Py_XDECREF(elem); + Py_DECREF(elem); PyObject_FREE(strn); - return (node *) PyErr_NoMemory(); + PyErr_NoMemory(); + return NULL; } if (err == E_OVERFLOW) { - Py_XDECREF(elem); + Py_DECREF(elem); PyObject_FREE(strn); PyErr_SetString(PyExc_ValueError, "unsupported number of child nodes"); @@ -957,14 +970,14 @@ build_node_children(PyObject *tuple, node *root, int *line_num) node* new_child = CHILD(root, i - 1); if (new_child != build_node_children(elem, new_child, line_num)) { - Py_XDECREF(elem); - return (0); + Py_DECREF(elem); + return NULL; } } else if (type == NEWLINE) { /* It's true: we increment the */ ++(*line_num); /* line number *after* the newline! */ } - Py_XDECREF(elem); + Py_DECREF(elem); } return root; } @@ -999,10 +1012,23 @@ build_node_tree(PyObject *tuple) if (num == encoding_decl) { encoding = PySequence_GetItem(tuple, 2); + if (encoding == NULL) { + PyErr_SetString(parser_error, "missed encoding"); + return NULL; + } + if (!PyUnicode_Check(encoding)) { + PyErr_Format(parser_error, + "encoding must be a string, found %.200s", + Py_TYPE(encoding)->tp_name); + Py_DECREF(encoding); + return NULL; + } /* tuple isn't borrowed anymore here, need to DECREF */ tuple = PySequence_GetSlice(tuple, 0, 2); - if (tuple == NULL) + if (tuple == NULL) { + Py_DECREF(encoding); return NULL; + } } res = PyNode_New(num); if (res != NULL) { @@ -1015,31 +1041,33 @@ build_node_tree(PyObject *tuple) const char *temp; temp = PyUnicode_AsUTF8AndSize(encoding, &len); if (temp == NULL) { - Py_DECREF(res); + PyNode_Free(res); Py_DECREF(encoding); Py_DECREF(tuple); return NULL; } res->n_str = (char *)PyObject_MALLOC(len + 1); if (res->n_str == NULL) { - Py_DECREF(res); + PyNode_Free(res); Py_DECREF(encoding); Py_DECREF(tuple); PyErr_NoMemory(); return NULL; } (void) memcpy(res->n_str, temp, len + 1); - Py_DECREF(encoding); - Py_DECREF(tuple); } } + if (encoding != NULL) { + Py_DECREF(encoding); + Py_DECREF(tuple); + } } else { /* The tuple is illegal -- if the number is neither TERMINAL nor * NONTERMINAL, we can't use it. Not sure the implementation * allows this condition, but the API doesn't preclude it. */ - PyObject *err = Py_BuildValue("os", tuple, + PyObject *err = Py_BuildValue("Os", tuple, "Illegal component tuple."); PyErr_SetObject(parser_error, err); Py_XDECREF(err); @@ -1074,7 +1102,6 @@ parser__pickler(PyObject *self, PyObject *args) result = Py_BuildValue("O(O)", pickle_constructor, tuple); Py_DECREF(tuple); } - Py_DECREF(empty_dict); Py_DECREF(newargs); } finally: From e2546172622dd52692cf0e26c2b931f942f345b6 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 19 Apr 2017 23:59:02 +0300 Subject: [PATCH 0240/2287] [3.6] bpo-30065: Fixed arguments validation in _posixsubprocess.fork_exec(). (GH-1110) (#1186) (cherry picked from commit 66bffd1) --- Lib/multiprocessing/util.py | 2 +- Lib/subprocess.py | 3 ++- Lib/test/test_capi.py | 6 +++--- Lib/test/test_subprocess.py | 13 ++++++++++- Modules/_posixsubprocess.c | 43 ++++++++++++++++++++----------------- 5 files changed, 41 insertions(+), 26 deletions(-) diff --git a/Lib/multiprocessing/util.py b/Lib/multiprocessing/util.py index 1a2c0db40b9cc6..0ce274ceca6057 100644 --- a/Lib/multiprocessing/util.py +++ b/Lib/multiprocessing/util.py @@ -386,7 +386,7 @@ def _close_stdin(): def spawnv_passfds(path, args, passfds): import _posixsubprocess - passfds = sorted(passfds) + passfds = tuple(sorted(map(int, passfds))) errpipe_read, errpipe_write = os.pipe() try: return _posixsubprocess.fork_exec( diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 0db6571f291dae..172126929160bf 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -1253,7 +1253,8 @@ def _execute_child(self, args, executable, preexec_fn, close_fds, fds_to_keep.add(errpipe_write) self.pid = _posixsubprocess.fork_exec( args, executable_list, - close_fds, sorted(fds_to_keep), cwd, env_list, + close_fds, tuple(sorted(map(int, fds_to_keep))), + cwd, env_list, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 6c3625d4879138..08aa3ffdf6b4f1 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -98,7 +98,7 @@ class Z(object): def __len__(self): return 1 self.assertRaises(TypeError, _posixsubprocess.fork_exec, - 1,Z(),3,[1, 2],5,6,7,8,9,10,11,12,13,14,15,16,17) + 1,Z(),3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17) # Issue #15736: overflow in _PySequence_BytesToCharpArray() class Z(object): def __len__(self): @@ -106,7 +106,7 @@ def __len__(self): def __getitem__(self, i): return b'x' self.assertRaises(MemoryError, _posixsubprocess.fork_exec, - 1,Z(),3,[1, 2],5,6,7,8,9,10,11,12,13,14,15,16,17) + 1,Z(),3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17) @unittest.skipUnless(_posixsubprocess, '_posixsubprocess required for this test.') def test_subprocess_fork_exec(self): @@ -116,7 +116,7 @@ def __len__(self): # Issue #15738: crash in subprocess_fork_exec() self.assertRaises(TypeError, _posixsubprocess.fork_exec, - Z(),[b'1'],3,[1, 2],5,6,7,8,9,10,11,12,13,14,15,16,17) + Z(),[b'1'],3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17) @unittest.skipIf(MISSING_C_DOCSTRINGS, "Signature information for builtins requires docstrings") diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 3c871dde5c532f..d8d6d82713cded 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -2431,7 +2431,7 @@ def test_fork_exec(self): with self.assertRaises(TypeError): _posixsubprocess.fork_exec( args, exe_list, - True, [], cwd, env_list, + True, (), cwd, env_list, -1, -1, -1, -1, 1, 2, 3, 4, True, True, func) @@ -2443,6 +2443,16 @@ def test_fork_exec(self): def test_fork_exec_sorted_fd_sanity_check(self): # Issue #23564: sanity check the fork_exec() fds_to_keep sanity check. import _posixsubprocess + class BadInt: + first = True + def __init__(self, value): + self.value = value + def __int__(self): + if self.first: + self.first = False + return self.value + raise ValueError + gc_enabled = gc.isenabled() try: gc.enable() @@ -2453,6 +2463,7 @@ def test_fork_exec_sorted_fd_sanity_check(self): (18, 23, 42, 2**63), # Out of range. (5, 4), # Not sorted. (6, 7, 7, 8), # Duplicate. + (BadInt(1), BadInt(2)), ): with self.assertRaises( ValueError, diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index 5007a39bc2443d..d1434d59f818b4 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -111,13 +111,17 @@ _is_fdescfs_mounted_on_dev_fd(void) static int _sanity_check_python_fd_sequence(PyObject *fd_sequence) { - Py_ssize_t seq_idx, seq_len = PySequence_Length(fd_sequence); + Py_ssize_t seq_idx; long prev_fd = -1; - for (seq_idx = 0; seq_idx < seq_len; ++seq_idx) { - PyObject* py_fd = PySequence_Fast_GET_ITEM(fd_sequence, seq_idx); - long iter_fd = PyLong_AsLong(py_fd); + for (seq_idx = 0; seq_idx < PyTuple_GET_SIZE(fd_sequence); ++seq_idx) { + PyObject* py_fd = PyTuple_GET_ITEM(fd_sequence, seq_idx); + long iter_fd; + if (!PyLong_Check(py_fd)) { + return 1; + } + iter_fd = PyLong_AsLong(py_fd); if (iter_fd < 0 || iter_fd <= prev_fd || iter_fd > INT_MAX) { - /* Negative, overflow, not a Long, unsorted, too big for a fd. */ + /* Negative, overflow, unsorted, too big for a fd. */ return 1; } prev_fd = iter_fd; @@ -132,13 +136,12 @@ _is_fd_in_sorted_fd_sequence(int fd, PyObject *fd_sequence) { /* Binary search. */ Py_ssize_t search_min = 0; - Py_ssize_t search_max = PySequence_Length(fd_sequence) - 1; + Py_ssize_t search_max = PyTuple_GET_SIZE(fd_sequence) - 1; if (search_max < 0) return 0; do { long middle = (search_min + search_max) / 2; - long middle_fd = PyLong_AsLong( - PySequence_Fast_GET_ITEM(fd_sequence, middle)); + long middle_fd = PyLong_AsLong(PyTuple_GET_ITEM(fd_sequence, middle)); if (fd == middle_fd) return 1; if (fd > middle_fd) @@ -154,9 +157,9 @@ make_inheritable(PyObject *py_fds_to_keep, int errpipe_write) { Py_ssize_t i, len; - len = PySequence_Length(py_fds_to_keep); + len = PyTuple_GET_SIZE(py_fds_to_keep); for (i = 0; i < len; ++i) { - PyObject* fdobj = PySequence_Fast_GET_ITEM(py_fds_to_keep, i); + PyObject* fdobj = PyTuple_GET_ITEM(py_fds_to_keep, i); long fd = PyLong_AsLong(fdobj); assert(!PyErr_Occurred()); assert(0 <= fd && fd <= INT_MAX); @@ -213,14 +216,13 @@ static void _close_fds_by_brute_force(long start_fd, PyObject *py_fds_to_keep) { long end_fd = safe_get_max_fd(); - Py_ssize_t num_fds_to_keep = PySequence_Length(py_fds_to_keep); + Py_ssize_t num_fds_to_keep = PyTuple_GET_SIZE(py_fds_to_keep); Py_ssize_t keep_seq_idx; int fd_num; /* As py_fds_to_keep is sorted we can loop through the list closing * fds inbetween any in the keep list falling within our range. */ for (keep_seq_idx = 0; keep_seq_idx < num_fds_to_keep; ++keep_seq_idx) { - PyObject* py_keep_fd = PySequence_Fast_GET_ITEM(py_fds_to_keep, - keep_seq_idx); + PyObject* py_keep_fd = PyTuple_GET_ITEM(py_fds_to_keep, keep_seq_idx); int keep_fd = PyLong_AsLong(py_keep_fd); if (keep_fd < start_fd) continue; @@ -306,7 +308,7 @@ _close_open_fds_safe(int start_fd, PyObject* py_fds_to_keep) /* Close all open file descriptors from start_fd and higher. - * Do not close any in the sorted py_fds_to_keep list. + * Do not close any in the sorted py_fds_to_keep tuple. * * This function violates the strict use of async signal safe functions. :( * It calls opendir(), readdir() and closedir(). Of these, the one most @@ -562,8 +564,9 @@ subprocess_fork_exec(PyObject* self, PyObject *args) #endif if (!PyArg_ParseTuple( - args, "OOpOOOiiiiiiiiiiO:fork_exec", - &process_args, &executable_list, &close_fds, &py_fds_to_keep, + args, "OOpO!OOiiiiiiiiiiO:fork_exec", + &process_args, &executable_list, + &close_fds, &PyTuple_Type, &py_fds_to_keep, &cwd_obj, &env_list, &p2cread, &p2cwrite, &c2pread, &c2pwrite, &errread, &errwrite, &errpipe_read, &errpipe_write, @@ -574,10 +577,6 @@ subprocess_fork_exec(PyObject* self, PyObject *args) PyErr_SetString(PyExc_ValueError, "errpipe_write must be >= 3"); return NULL; } - if (PySequence_Length(py_fds_to_keep) < 0) { - PyErr_SetString(PyExc_ValueError, "cannot get length of fds_to_keep"); - return NULL; - } if (_sanity_check_python_fd_sequence(py_fds_to_keep)) { PyErr_SetString(PyExc_ValueError, "bad value(s) in fds_to_keep"); return NULL; @@ -631,6 +630,10 @@ subprocess_fork_exec(PyObject* self, PyObject *args) goto cleanup; for (arg_num = 0; arg_num < num_args; ++arg_num) { PyObject *borrowed_arg, *converted_arg; + if (PySequence_Fast_GET_SIZE(fast_args) != num_args) { + PyErr_SetString(PyExc_RuntimeError, "args changed during iteration"); + goto cleanup; + } borrowed_arg = PySequence_Fast_GET_ITEM(fast_args, arg_num); if (PyUnicode_FSConverter(borrowed_arg, &converted_arg) == 0) goto cleanup; From 5fb4bf91e78e128a22b5b58da179f09d0b307f2d Mon Sep 17 00:00:00 2001 From: cocoatomo Date: Thu, 20 Apr 2017 12:54:06 +0900 Subject: [PATCH 0241/2287] bpo-19225: Remove duplicated description for standard warning categories (GH-1068) --- Doc/c-api/exceptions.rst | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 3516a1690384f7..c75408db770a22 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -291,16 +291,11 @@ an error value). is the function calling :c:func:`PyErr_WarnEx`, 2 is the function above that, and so forth. - Warning categories must be subclasses of :c:data:`Warning`; the default warning - category is :c:data:`RuntimeWarning`. The standard Python warning categories are - available as global variables whose names are ``PyExc_`` followed by the Python - exception name. These have the type :c:type:`PyObject\*`; they are all class - objects. Their names are :c:data:`PyExc_Warning`, :c:data:`PyExc_UserWarning`, - :c:data:`PyExc_UnicodeWarning`, :c:data:`PyExc_DeprecationWarning`, - :c:data:`PyExc_SyntaxWarning`, :c:data:`PyExc_RuntimeWarning`, and - :c:data:`PyExc_FutureWarning`. :c:data:`PyExc_Warning` is a subclass of - :c:data:`PyExc_Exception`; the other warning categories are subclasses of - :c:data:`PyExc_Warning`. + Warning categories must be subclasses of :c:data:`PyExc_Warning`; + :c:data:`PyExc_Warning` is a subclass of :c:data:`PyExc_Exception`; + the default warning category is :c:data:`PyExc_RuntimeWarning`. The standard + Python warning categories are available as global variables whose names are + enumerated at :ref:`standarwarningcategories`. For information about warning control, see the documentation for the :mod:`warnings` module and the :option:`-W` option in the command line @@ -963,8 +958,10 @@ Notes: Only defined on Windows; protect code that uses this by testing that the preprocessor macro ``MS_WINDOWS`` is defined. -Standard Warnings -================= +.. _standarwarningcategories: + +Standard Warning Categories +=========================== All standard Python warning categories are available as global variables whose names are ``PyExc_`` followed by the Python exception name. These have the type From 596e714d79a22d1d53f26ae1a579dcd43f15865a Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Thu, 20 Apr 2017 07:36:57 +0300 Subject: [PATCH 0242/2287] bpo-30078: Add an example of passing a path to unittest (GH-1178) (cherry picked from commit f7e62cf8adfb8ab6a6a870903defe8ff218a0383) --- Lib/unittest/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/unittest/main.py b/Lib/unittest/main.py index 09fefe11649bd3..807604f08dfd14 100644 --- a/Lib/unittest/main.py +++ b/Lib/unittest/main.py @@ -14,6 +14,7 @@ %(prog)s test_module - run tests from test_module %(prog)s module.TestClass - run tests from module.TestClass %(prog)s module.Class.test_method - run specified test method + %(prog)s path/to/test_file.py - run tests from test_file.py """ MODULE_EXAMPLES = """\ From 83a90b9aeda3a4c10e8393893ed4ec8adc861e62 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Thu, 20 Apr 2017 07:42:32 +0300 Subject: [PATCH 0243/2287] Remove redundant comma in argparse HOWTO (GH-1141) Reported by Sean Canavan on docs@p.o. (cherry picked from commit 8526fb74edf5ac9ca175b7cdcb0d82bb8780d2cf) --- Doc/howto/argparse.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/howto/argparse.rst b/Doc/howto/argparse.rst index 7e161a59add8ae..9d770f5232b440 100644 --- a/Doc/howto/argparse.rst +++ b/Doc/howto/argparse.rst @@ -221,7 +221,7 @@ before proceeding. Introducing Optional arguments ============================== -So far we, have been playing with positional arguments. Let us +So far we have been playing with positional arguments. Let us have a look on how to add optional ones:: import argparse From df5df13fdc3a71bcf2295acc2cba7f22cfe2d669 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Thu, 20 Apr 2017 17:26:25 +0900 Subject: [PATCH 0244/2287] [3.6] bpo-12414: Update code_sizeof() to take in account co_extra memory. (#1168) (#1198) --- Lib/test/test_sys.py | 8 +++++--- Misc/ACKS | 1 + Misc/NEWS | 4 ++++ Objects/codeobject.c | 10 +++++++--- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index df9ebd40859e21..e151f493d4e36c 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -913,13 +913,15 @@ def inner(): return inner check(get_cell().__closure__[0], size('P')) # code - check(get_cell().__code__, size('6i13P')) - check(get_cell.__code__, size('6i13P')) + def check_code_size(a, expected_size): + self.assertGreaterEqual(sys.getsizeof(a), expected_size) + check_code_size(get_cell().__code__, size('6i13P')) + check_code_size(get_cell.__code__, size('6i13P')) def get_cell2(x): def inner(): return x return inner - check(get_cell2.__code__, size('6i13P') + 1) + check_code_size(get_cell2.__code__, size('6i13P') + calcsize('n')) # complex check(complex(0,1), size('2d')) # method_descriptor (descriptor object) diff --git a/Misc/ACKS b/Misc/ACKS index 72070e19f65701..ac2c4edc733576 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1060,6 +1060,7 @@ R. David Murray Matti Mäki Jörg Müller Kaushik N +Dong-hee Na Dale Nagata John Nagle Takahiro Nakayama diff --git a/Misc/NEWS b/Misc/NEWS index cb9fab656ec692..b1f79d61240281 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ What's New in Python 3.6.2 release candidate 1? Core and Builtins ----------------- +- bpo-12414: sys.getsizeof() on a code object now returns the sizes + which includes the code struct and sizes of objects which it references. + Patch by Dong-hee Na. + - bpo-29949: Fix memory usage regression of set and frozenset object. - bpo-29935: Fixed error messages in the index() method of tuple, list and deque diff --git a/Objects/codeobject.c b/Objects/codeobject.c index df8b9538fe9ed5..22c4f856cd83e6 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -446,11 +446,15 @@ code_dealloc(PyCodeObject *co) static PyObject * code_sizeof(PyCodeObject *co, void *unused) { - Py_ssize_t res; + Py_ssize_t res = _PyObject_SIZE(Py_TYPE(co)); + _PyCodeObjectExtra *co_extra = (_PyCodeObjectExtra*) co->co_extra; - res = _PyObject_SIZE(Py_TYPE(co)); if (co->co_cell2arg != NULL && co->co_cellvars != NULL) - res += PyTuple_GET_SIZE(co->co_cellvars) * sizeof(unsigned char); + res += PyTuple_GET_SIZE(co->co_cellvars) * sizeof(Py_ssize_t); + + if (co_extra != NULL) + res += co_extra->ce_size * sizeof(co_extra->ce_extras[0]); + return PyLong_FromSsize_t(res); } From 430020500c56259d31e07d32771f017952bad4e0 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 20 Apr 2017 07:12:37 -0700 Subject: [PATCH 0245/2287] [3.6] bpo-30109: Fix reindent.py (GH-1207) (GH-1208) Skip the file if it has bad encoding. (cherry picked from commit 58f3c9dc8f5626abe09ac9738c34f6ba99ce2972) --- Lib/test/test_tools/test_reindent.py | 7 +++++++ Tools/scripts/reindent.py | 6 +++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_tools/test_reindent.py b/Lib/test/test_tools/test_reindent.py index d7c20e1e5c7206..34df0c5d511904 100644 --- a/Lib/test/test_tools/test_reindent.py +++ b/Lib/test/test_tools/test_reindent.py @@ -7,6 +7,7 @@ import os import unittest from test.support.script_helper import assert_python_ok +from test.support import findfile from test.test_tools import scriptsdir, skip_if_missing @@ -23,6 +24,12 @@ def test_help(self): self.assertEqual(out, b'') self.assertGreater(err, b'') + def test_reindent_file_with_bad_encoding(self): + bad_coding_path = findfile('bad_coding.py') + rc, out, err = assert_python_ok(self.script, '-r', bad_coding_path) + self.assertEqual(out, b'') + self.assertNotEqual(err, b'') + if __name__ == '__main__': unittest.main() diff --git a/Tools/scripts/reindent.py b/Tools/scripts/reindent.py index 18424dea1437ac..f6dadaac5a5206 100755 --- a/Tools/scripts/reindent.py +++ b/Tools/scripts/reindent.py @@ -118,7 +118,11 @@ def check(file): if verbose: print("checking", file, "...", end=' ') with open(file, 'rb') as f: - encoding, _ = tokenize.detect_encoding(f.readline) + try: + encoding, _ = tokenize.detect_encoding(f.readline) + except SyntaxError as se: + errprint("%s: SyntaxError: %s" % (file, str(se))) + return try: with open(file, encoding=encoding) as f: r = Reindenter(f) From 7a113a0cbf545588d61286fcc0e89141cf211735 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 20 Apr 2017 22:55:06 +0300 Subject: [PATCH 0246/2287] bpo-29802: Fix the cleaning up issue in PyUnicode_FSDecoder(). (#1217) --- Objects/unicodeobject.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 7871043681533d..4e0c663e338a52 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -3902,6 +3902,7 @@ PyUnicode_FSDecoder(PyObject* arg, void* addr) PyObject *output = NULL; if (arg == NULL) { Py_DECREF(*(PyObject**)addr); + *(PyObject**)addr = NULL; return 1; } From 483729526e06cda0befc241190bb586d472a72e8 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 20 Apr 2017 20:55:59 -0700 Subject: [PATCH 0247/2287] [3.6] Add missing .gitignore entries for VS2015 IntelliSense DB (GH-1223) (#1225) (cherry picked from commit 8e675286a92f33837cfffac5914b5175dac5d573) --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index db27597aac57da..9392fe5defd6f5 100644 --- a/.gitignore +++ b/.gitignore @@ -52,6 +52,8 @@ PCbuild/*.suo PCbuild/*.*sdf PCbuild/*-pgi PCbuild/*-pgo +PCbuild/*.VC.db +PCbuild/*.VC.opendb PCbuild/.vs/ PCbuild/amd64/ PCbuild/obj/ From b984a05d557e78b928f38098d0b6c0e95f737b9a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 21 Apr 2017 18:27:29 +0200 Subject: [PATCH 0248/2287] bpo-30107: don't dump core on expected test_io crash (#1235) (#1241) test_io has two unit tests which trigger a deadlock: * test_daemon_threads_shutdown_stdout_deadlock() * test_daemon_threads_shutdown_stderr_deadlock() These tests call Py_FatalError() if the expected bug is triggered which calls abort(). Use test.support.SuppressCrashReport to prevent the creation on a core dump, to fix the warning: Warning -- files was modified by test_io Before: [] After: ['python.core'] (cherry picked from commit 2a1aed04b0943636f605543522e16cca1dc23e70) --- Lib/test/test_io.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 5a7617cd9f9cbf..8c91ad2ad8aa1c 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -3720,6 +3720,7 @@ def check_daemon_threads_shutdown_deadlock(self, stream_name): import sys import time import threading + from test.support import SuppressCrashReport file = sys.{stream_name} @@ -3728,6 +3729,10 @@ def run(): file.write('.') file.flush() + crash = SuppressCrashReport() + crash.__enter__() + # don't call __exit__(): the crash occurs at Python shutdown + thread = threading.Thread(target=run) thread.daemon = True thread.start() From 1ccbe6007e5569ab25170f8ecddd5fbbc2ef36b0 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Fri, 21 Apr 2017 11:28:46 -0700 Subject: [PATCH 0249/2287] bpo-29191: Add liblzma.vcxproj to pcbuild.sln and other missing entries (GH-1222) (GH-1244) liblzma is missing from pcbuild.sln. This causes the build of _lzma to fail when building the solution and not using build.bat. --- PCbuild/pcbuild.sln | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/PCbuild/pcbuild.sln b/PCbuild/pcbuild.sln index 0e65811ae70731..580879930a83d0 100644 --- a/PCbuild/pcbuild.sln +++ b/PCbuild/pcbuild.sln @@ -96,6 +96,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testconsole", "_testconsol EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_asyncio", "_asyncio.vcxproj", "{384C224A-7474-476E-A01B-750EA7DE918C}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liblzma", "liblzma.vcxproj", "{12728250-16EC-4DC6-94D7-E21DD88947F8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -728,6 +730,38 @@ Global {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|Win32.Build.0 = Release|Win32 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|x64.ActiveCfg = Release|x64 {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|x64.Build.0 = Release|x64 + {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|Win32.ActiveCfg = Debug|Win32 + {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|Win32.Build.0 = Debug|Win32 + {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|x64.ActiveCfg = Debug|x64 + {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|x64.Build.0 = Debug|x64 + {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {384C224A-7474-476E-A01B-750EA7DE918C}.Release|Win32.ActiveCfg = Release|Win32 + {384C224A-7474-476E-A01B-750EA7DE918C}.Release|Win32.Build.0 = Release|Win32 + {384C224A-7474-476E-A01B-750EA7DE918C}.Release|x64.ActiveCfg = Release|x64 + {384C224A-7474-476E-A01B-750EA7DE918C}.Release|x64.Build.0 = Release|x64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|Win32.ActiveCfg = Debug|Win32 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|Win32.Build.0 = Debug|Win32 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|x64.ActiveCfg = Debug|x64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|x64.Build.0 = Debug|x64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|Win32.ActiveCfg = Release|Win32 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|Win32.Build.0 = Release|Win32 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|x64.ActiveCfg = Release|x64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 3a8f8ea2aca46f9ef1e715f2c924357b6719525f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 21 Apr 2017 23:17:33 +0200 Subject: [PATCH 0250/2287] bpo-30125: Fix faulthandler.disable() on Windows (#1243) On Windows, faulthandler.disable() now removes the exception handler installed by faulthandler.enable(). --- Lib/test/test_faulthandler.py | 12 ++++++++++++ Modules/faulthandler.c | 13 +++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py index bdd8d1a2a6163f..01cbae3f200b1a 100644 --- a/Lib/test/test_faulthandler.py +++ b/Lib/test/test_faulthandler.py @@ -755,6 +755,18 @@ def test_raise_exception(self): 3, name) + @unittest.skipUnless(MS_WINDOWS, 'specific to Windows') + def test_disable_windows_exc_handler(self): + code = dedent(""" + import faulthandler + faulthandler.enable() + faulthandler.disable() + code = faulthandler._EXCEPTION_ACCESS_VIOLATION + faulthandler._raise_exception(code) + """) + output, exitcode = self.get_output(code) + self.assertEqual(output, []) + self.assertEqual(exitcode, 0xC0000005) if __name__ == "__main__": diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index 2f8b624fd160d9..61fc4908b0fe9b 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -55,6 +55,9 @@ static struct { int fd; int all_threads; PyInterpreterState *interp; +#ifdef MS_WINDOWS + void *exc_handler; +#endif } fatal_error = {0, NULL, -1, 0}; #ifdef FAULTHANDLER_LATER @@ -462,7 +465,8 @@ faulthandler_enable(void) } #ifdef MS_WINDOWS - AddVectoredExceptionHandler(1, faulthandler_exc_handler); + assert(fatal_error.exc_handler == NULL); + fatal_error.exc_handler = AddVectoredExceptionHandler(1, faulthandler_exc_handler); #endif return 0; } @@ -514,7 +518,12 @@ faulthandler_disable(void) faulthandler_disable_fatal_handler(handler); } } - +#ifdef MS_WINDOWS + if (fatal_error.exc_handler != NULL) { + RemoveVectoredExceptionHandler(fatal_error.exc_handler); + fatal_error.exc_handler = NULL; + } +#endif Py_CLEAR(fatal_error.file); } From 414e0283a351e7b070c3f13aa24cadc5fdd9a230 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 21 Apr 2017 19:28:29 -0700 Subject: [PATCH 0251/2287] [3.6] Correct the README link in Unix install docs (GH-1245) (GH-1248) (cherry picked from commit d1ae24e8880fe00d006eb2996af815c35fbcfb33) --- Doc/using/unix.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/using/unix.rst b/Doc/using/unix.rst index 97f0a49ca771e5..604688ce94cc32 100644 --- a/Doc/using/unix.rst +++ b/Doc/using/unix.rst @@ -77,7 +77,7 @@ The build process consists in the usual :: make install invocations. Configuration options and caveats for specific Unix platforms are -extensively documented in the :source:`README` file in the root of the Python +extensively documented in the :source:`README.rst` file in the root of the Python source tree. .. warning:: From a3d8dda7d899bf41ab7eb2c6148459ad276fe295 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 21 Apr 2017 19:58:28 -0700 Subject: [PATCH 0252/2287] bpo-30098: Clarify that run_coroutine_threadsafe expects asyncio.Future (GH-1170) (#1247) (cherry picked from commit ae5b3260dd459845aad8a30491b76d471577785d) --- Lib/asyncio/tasks.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 4d79367d5cb600..f91e70aecbad94 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -517,7 +517,8 @@ def ensure_future(coro_or_future, *, loop=None): elif compat.PY35 and inspect.isawaitable(coro_or_future): return ensure_future(_wrap_awaitable(coro_or_future), loop=loop) else: - raise TypeError('A Future, a coroutine or an awaitable is required') + raise TypeError('An asyncio.Future, a coroutine or an awaitable is ' + 'required') @coroutine From 9d022f169ec64987b29359ae0e904026aab07a64 Mon Sep 17 00:00:00 2001 From: Louie Lu Date: Sat, 22 Apr 2017 19:48:53 +0800 Subject: [PATCH 0253/2287] [3.6] Fix trailing colon and newline in test.rst (GH-1250) (#1254) (cherry picked from commit 7fae81e1672d0b4110d31ea6a765b54f63a2e54b) --- Doc/library/test.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/library/test.rst b/Doc/library/test.rst index fab3e1fe4cc6ad..9d4ff7ad8b45a3 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -570,7 +570,8 @@ The :mod:`test.support` module defines the following functions: def load_tests(*args): return load_package_tests(os.path.dirname(__file__), *args) -.. function:: detect_api_mismatch(ref_api, other_api, *, ignore=()): + +.. function:: detect_api_mismatch(ref_api, other_api, *, ignore=()) Returns the set of attributes, functions or methods of *ref_api* not found on *other_api*, except for a defined list of items to be From f2ed2858eea7569c8915b3611ca5ec92ae10b17f Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 23 Apr 2017 08:50:14 +0300 Subject: [PATCH 0254/2287] [3.6] bpo-15718: Document the upper bound constrain on the __len__ return value. (GH-1256) (#1259) (cherry picked from commit 85157cd) --- Doc/reference/datamodel.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 095a2380b379bc..35925a065fd495 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -2011,6 +2011,14 @@ through the container; for mappings, :meth:`__iter__` should be the same as :meth:`__bool__` method and whose :meth:`__len__` method returns zero is considered to be false in a Boolean context. + .. impl-detail:: + + In CPython, the length is required to be at most :attr:`sys.maxsize`. + If the length is larger than :attr:`!sys.maxsize` some features (such as + :func:`len`) may raise :exc:`OverflowError`. To prevent raising + :exc:`!OverflowError` by truth value testing, an object must define a + :meth:`__bool__` method. + .. method:: object.__length_hint__(self) @@ -2021,6 +2029,7 @@ through the container; for mappings, :meth:`__iter__` should be the same as .. versionadded:: 3.4 + .. note:: Slicing is done exclusively with the following three methods. A call like :: From ea0efa3bc1d0b832da75519c6f85d767ae44feda Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 23 Apr 2017 21:05:01 -0700 Subject: [PATCH 0255/2287] [3.6] bpo-29751: Improve PyLong_FromString documentation (GH-915) (#1266) (cherry picked from commit 26896f2832324dde85cdd63d525571ca669f6f0b) --- Doc/c-api/long.rst | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index f592cb65c3e3a9..f50680b3d29558 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -85,13 +85,12 @@ All integers are implemented as "long" integer objects of arbitrary size. Return a new :c:type:`PyLongObject` based on the string value in *str*, which is interpreted according to the radix in *base*. If *pend* is non-*NULL*, *\*pend* will point to the first character in *str* which follows the - representation of the number. If *base* is ``0``, the radix will be - determined based on the leading characters of *str*: if *str* starts with - ``'0x'`` or ``'0X'``, radix 16 will be used; if *str* starts with ``'0o'`` or - ``'0O'``, radix 8 will be used; if *str* starts with ``'0b'`` or ``'0B'``, - radix 2 will be used; otherwise radix 10 will be used. If *base* is not - ``0``, it must be between ``2`` and ``36``, inclusive. Leading spaces are - ignored. If there are no digits, :exc:`ValueError` will be raised. + representation of the number. If *base* is ``0``, *str* is interpreted using + the :ref:`integers` definition; in this case, leading zeros in a + non-zero decimal number raises a :exc:`ValueError`. If *base* is not ``0``, + it must be between ``2`` and ``36``, inclusive. Leading spaces and single + underscores after a base specifier and between digits are ignored. If there + are no digits, :exc:`ValueError` will be raised. .. c:function:: PyObject* PyLong_FromUnicode(Py_UNICODE *u, Py_ssize_t length, int base) From 16b6f971bd8afc72b439b83324eba744460adb67 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 25 Apr 2017 18:23:05 -0700 Subject: [PATCH 0256/2287] [3.6] bpo-28851: Improve namedtuple documentation (GH-1274) (GH-1286) Clarify that a sequence of strings is the preferred value for 'field_names'. (cherry picked from commit 97bf722fcd1de1236824377e052369dc7686b644) --- Doc/library/collections.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index 8e2eb4d9b0382f..2d51f0cfdc094d 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -771,9 +771,9 @@ they add the ability to access fields by name instead of position index. helpful docstring (with typename and field_names) and a helpful :meth:`__repr__` method which lists the tuple contents in a ``name=value`` format. - The *field_names* are a single string with each fieldname separated by whitespace - and/or commas, for example ``'x y'`` or ``'x, y'``. Alternatively, *field_names* - can be a sequence of strings such as ``['x', 'y']``. + The *field_names* are a sequence of strings such as ``['x', 'y']``. + Alternatively, *field_names* can be a single string with each fieldname + separated by whitespace and/or commas, for example ``'x y'`` or ``'x, y'``. Any valid Python identifier may be used for a fieldname except for names starting with an underscore. Valid identifiers consist of letters, digits, From 9f6828119df23fca9e799f47e02baabe87adca2a Mon Sep 17 00:00:00 2001 From: Louie Lu Date: Wed, 26 Apr 2017 16:45:31 +0800 Subject: [PATCH 0257/2287] bpo-28698: Fix c_wchar_p doc example (GH-1160) (cherry picked from commit 0d637e236d7099f7b724026c8cb7bd83d8e12e6b) --- Doc/library/ctypes.rst | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 3840935ce04eb6..51a3a360fa3e1e 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -284,7 +284,7 @@ the correct type and value:: >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") - c_wchar_p('Hello, World') + c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>> @@ -309,11 +309,15 @@ bytes objects are immutable):: >>> s = "Hello, World" >>> c_s = c_wchar_p(s) >>> print(c_s) - c_wchar_p('Hello, World') + c_wchar_p(139966785747344) + >>> print(c_s.value) + Hello World >>> c_s.value = "Hi, there" - >>> print(c_s) - c_wchar_p('Hi, there') - >>> print(s) # first object is unchanged + >>> print(c_s) # the memory location has changed + c_wchar_p(139966783348904) + >>> print(c_s.value) + Hi, there + >>> print(s) # first object is unchanged Hello, World >>> From 04f389b8b357c8507b6c9642adcb8b956489e034 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Wed, 26 Apr 2017 17:25:37 +0300 Subject: [PATCH 0258/2287] bpo-29974: Improve typing.TYPE_CHECKING example (GH-982) * Fix PEP 8 (SomeType instead of some_type) * Add a function parameter annotation * Explain, using wording from PEP 484 and PEP 526, why one annotation is in quotes and another is not. Suggested by Ivan Levkevskyi. (cherry picked from commit 87c07fe9d908d0a2143fcc8369255c6ff3241503) --- Doc/library/typing.rst | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 2cfc37f695ef2d..1780739ad1dd43 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1041,5 +1041,10 @@ The module defines the following classes, functions and decorators: if TYPE_CHECKING: import expensive_mod - def fun(): - local_var: expensive_mod.some_type = other_fun() + def fun(arg: 'expensive_mod.SomeType') -> None: + local_var: expensive_mod.AnotherType = other_fun() + + Note that the first type annotation must be enclosed in quotes, making it a + "forward reference", to hide the ``expensive_mod`` reference from the + interpreter runtime. Type annotations for local variables are not + evaluated, so the second annotation does not need to be enclosed in quotes. From 2fc3c543fc93d6211de8dcfaeac3a0fd10a356e0 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Thu, 27 Apr 2017 01:55:55 +0900 Subject: [PATCH 0259/2287] [3.6] bpo-30142: Remove "callable" from the 2to3fixer documentation. (GH-1303) --- Doc/library/2to3.rst | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst index ace1bfaf8cb9d6..4c9a528d42e703 100644 --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -199,13 +199,6 @@ and off individually. They are described here in more detail. because the :class:`memoryview` API is similar but not exactly the same as that of :class:`buffer`. -.. 2to3fixer:: callable - - Converts ``callable(x)`` to ``isinstance(x, collections.Callable)``, adding - an import to :mod:`collections` if needed. Note ``callable(x)`` has returned - in Python 3.2, so if you do not intend to support Python 3.1, you can disable - this fixer. - .. 2to3fixer:: dict Fixes dictionary iteration methods. :meth:`dict.iteritems` is converted to From 33a5568f69301562d536852d12b9e03cd8dfc3a4 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 26 Apr 2017 22:18:53 -0700 Subject: [PATCH 0260/2287] [3.6] bpo-30182: Use the correct name for ISO in Unicode HOWTO. (GH-1312) (GH-1313) (cherry picked from commit 6fde770e4e940c19cd62de0b6aeb77840690843e) --- Doc/howto/unicode.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst index a48ae1f5faba7e..9649b9c609c255 100644 --- a/Doc/howto/unicode.rst +++ b/Doc/howto/unicode.rst @@ -43,9 +43,9 @@ hold values ranging from 0 to 255. ASCII codes only went up to 127, so some machines assigned values between 128 and 255 to accented characters. Different machines had different codes, however, which led to problems exchanging files. Eventually various commonly used sets of values for the 128--255 range emerged. -Some were true standards, defined by the International Standards Organization, -and some were *de facto* conventions that were invented by one company or -another and managed to catch on. +Some were true standards, defined by the International Organization for +Standardization, and some were *de facto* conventions that were invented by one +company or another and managed to catch on. 255 characters aren't very many. For example, you can't fit both the accented characters used in Western Europe and the Cyrillic alphabet used for Russian From 4dc3b9cf2a868a8378ecbc2221a15e7b59e8e944 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 27 Apr 2017 18:25:03 +0200 Subject: [PATCH 0261/2287] bpo-30175: Skip client cert tests of test_imaplib (#1320) (#1323) * bpo-30175: Skip client cert tests of test_imaplib The IMAP server cyrus.andrew.cmu.edu doesn't accept our randomly generated client x509 certificate anymore. * bpo-30188: Catch EOFError in NetworkedNNTPTests test_nntplib fails randomly with EOFError in NetworkedNNTPTests.setUpClass(). Catch EOFError to skip tests in that case. (cherry picked from commit 5bccca58b9b2b3a925b16750bedbd907695ea8d7) --- Lib/test/test_imaplib.py | 6 ++++++ Lib/test/test_nntplib.py | 7 ++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py index fac6b57081283b..9df37b1de58361 100644 --- a/Lib/test/test_imaplib.py +++ b/Lib/test/test_imaplib.py @@ -966,6 +966,9 @@ def test_logincapa(self): _server = self.imap_class(self.host, self.port) self.check_logincapa(_server) + @unittest.skipIf(True, + "bpo-30175: FIXME: cyrus.andrew.cmu.edu doesn't accept " + "our randomly generated client x509 certificate anymore") def test_logincapa_with_client_certfile(self): with transient_internet(self.host): with support.check_warnings(('', DeprecationWarning)): @@ -973,6 +976,9 @@ def test_logincapa_with_client_certfile(self): certfile=CERTFILE) self.check_logincapa(_server) + @unittest.skipIf(True, + "bpo-30175: FIXME: cyrus.andrew.cmu.edu doesn't accept " + "our randomly generated client x509 certificate anymore") def test_logincapa_with_client_ssl_context(self): with transient_internet(self.host): _server = self.imap_class( diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py index c46ded11866589..3e84f3429ee854 100644 --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -286,7 +286,12 @@ class NetworkedNNTPTests(NetworkedNNTPTestsMixin, unittest.TestCase): def setUpClass(cls): support.requires("network") with support.transient_internet(cls.NNTP_HOST): - cls.server = cls.NNTP_CLASS(cls.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) + try: + cls.server = cls.NNTP_CLASS(cls.NNTP_HOST, timeout=TIMEOUT, + usenetrc=False) + except EOFError: + raise unittest.SkipTest(f"{cls} got EOF error on connecting " + f"to {cls.NNTP_HOST!r}") @classmethod def tearDownClass(cls): From c9ca57eeea4d9da748d84281506c5803512b79ac Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 28 Apr 2017 03:27:51 +0200 Subject: [PATCH 0262/2287] bpo-30107: Make SuppressCrashReport quiet on macOS (#1279) (#1335) On macOS, SuppressCrashReport now redirects /usr/bin/defaults command stderr into a pipe to not pollute stderr. It fixes a test_io.test_daemon_threads_shutdown_stderr_deadlock() failure when the CrashReporter domain doesn't exists. Message logged into stderr: 2017-04-24 16:57:21.432 defaults[41046:2462851] The domain/default pair of (com.apple.CrashReporter, DialogType) does not exist (cherry picked from commit d819ad9832292d854e9710493ecdf959b69802e3) --- Lib/test/support/__init__.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 15d8fc849b9a0a..1621e3de402c36 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -2433,6 +2433,7 @@ def __enter__(self): (0, self.old_value[1])) except (ValueError, OSError): pass + if sys.platform == 'darwin': # Check if the 'Crash Reporter' on OSX was configured # in 'Developer' mode and warn that it will get triggered @@ -2440,10 +2441,14 @@ def __enter__(self): # # This assumes that this context manager is used in tests # that might trigger the next manager. - value = subprocess.Popen(['/usr/bin/defaults', 'read', - 'com.apple.CrashReporter', 'DialogType'], - stdout=subprocess.PIPE).communicate()[0] - if value.strip() == b'developer': + cmd = ['/usr/bin/defaults', 'read', + 'com.apple.CrashReporter', 'DialogType'] + proc = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + with proc: + stdout = proc.communicate()[0] + if stdout.strip() == b'developer': print("this test triggers the Crash Reporter, " "that is intentional", end='', flush=True) From caa59c156d1e6ff3d005e0112bb27c5bed4afb71 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 28 Apr 2017 04:13:37 +0200 Subject: [PATCH 0263/2287] [3.6] bpo-30106: Fix test_asyncore.test_quick_connect() (#1336) * Fix/optimize test_asyncore.test_quick_connect() (#1188) Don't use addCleanup() in test_quick_connect() because it keeps the Thread object alive and so @reap_threads fails on its timeout of 1 second. "./python -m test -v test_asyncore -m test_quick_connect" now takes 185 ms, instead of 11 seconds. Other minor changes: * Use "with sock:" to close the socket instead of try/finally: sock.close() * Use self.skipTest() in test_quick_connect() to remove one indentation level and notice user that the test is specific to AF_INET and AF_INET6 * bpo-30106: Fix tearDown() of test_asyncore (#1194) Call asyncore.close_all() with ignore_all=True in the tearDown() method of the test_asyncore base test case. It should prevent keeping alive sockets in asyncore.socket_map if close() fails with an unexpected error. Revert also an unwanted change of my previous commit: remove name parameter of Thread in test_quick_connect(). * bpo-30106: Fix test_asyncore.test_quick_connect() (#1234) test_quick_connect() runs a thread up to 50 seconds, whereas the socket is connected in 0.2 second and then the thread is expected to end in less than 3 second. On Linux, the thread ends quickly because select() seems to always return quickly. On FreeBSD, sometimes select() fails with timeout and so the thread runs much longer than expected. Fix the thread timeout to fix a race condition in the test. --- Lib/test/test_asyncore.py | 80 +++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py index d05462b7efce35..dc2f716e0bb828 100644 --- a/Lib/test/test_asyncore.py +++ b/Lib/test/test_asyncore.py @@ -502,7 +502,7 @@ def handle_connect(self): class BaseTestAPI: def tearDown(self): - asyncore.close_all() + asyncore.close_all(ignore_all=True) def loop_waiting_for_flag(self, instance, timeout=5): timeout = float(timeout) / 100 @@ -755,50 +755,50 @@ def test_bind(self): def test_set_reuse_addr(self): if HAS_UNIX_SOCKETS and self.family == socket.AF_UNIX: self.skipTest("Not applicable to AF_UNIX sockets.") - sock = socket.socket(self.family) - try: - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - except OSError: - unittest.skip("SO_REUSEADDR not supported on this platform") - else: - # if SO_REUSEADDR succeeded for sock we expect asyncore - # to do the same - s = asyncore.dispatcher(socket.socket(self.family)) - self.assertFalse(s.socket.getsockopt(socket.SOL_SOCKET, - socket.SO_REUSEADDR)) - s.socket.close() - s.create_socket(self.family) - s.set_reuse_addr() - self.assertTrue(s.socket.getsockopt(socket.SOL_SOCKET, - socket.SO_REUSEADDR)) - finally: - sock.close() + + with socket.socket(self.family) as sock: + try: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + except OSError: + unittest.skip("SO_REUSEADDR not supported on this platform") + else: + # if SO_REUSEADDR succeeded for sock we expect asyncore + # to do the same + s = asyncore.dispatcher(socket.socket(self.family)) + self.assertFalse(s.socket.getsockopt(socket.SOL_SOCKET, + socket.SO_REUSEADDR)) + s.socket.close() + s.create_socket(self.family) + s.set_reuse_addr() + self.assertTrue(s.socket.getsockopt(socket.SOL_SOCKET, + socket.SO_REUSEADDR)) @unittest.skipUnless(threading, 'Threading required for this test.') @support.reap_threads def test_quick_connect(self): # see: http://bugs.python.org/issue10340 - if self.family in (socket.AF_INET, getattr(socket, "AF_INET6", object())): - server = BaseServer(self.family, self.addr) - t = threading.Thread(target=lambda: asyncore.loop(timeout=0.1, - count=500)) - t.start() - def cleanup(): - t.join(timeout=TIMEOUT) - if t.is_alive(): - self.fail("join() timed out") - self.addCleanup(cleanup) - - s = socket.socket(self.family, socket.SOCK_STREAM) - s.settimeout(.2) - s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, - struct.pack('ii', 1, 0)) - try: - s.connect(server.address) - except OSError: - pass - finally: - s.close() + if self.family not in (socket.AF_INET, getattr(socket, "AF_INET6", object())): + self.skipTest("test specific to AF_INET and AF_INET6") + + server = BaseServer(self.family, self.addr) + # run the thread 500 ms: the socket should be connected in 200 ms + t = threading.Thread(target=lambda: asyncore.loop(timeout=0.1, + count=5)) + t.start() + try: + with socket.socket(self.family, socket.SOCK_STREAM) as s: + s.settimeout(.2) + s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, + struct.pack('ii', 1, 0)) + + try: + s.connect(server.address) + except OSError: + pass + finally: + t.join(timeout=TIMEOUT) + if t.is_alive(): + self.fail("join() timed out") class TestAPI_UseIPv4Sockets(BaseTestAPI): family = socket.AF_INET From cb21f5f3d2005b891df0b76e3fc4d4676e285f21 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 28 Apr 2017 04:13:53 +0200 Subject: [PATCH 0264/2287] bpo-30131: test_logging now joins queue threads (#1298) (#1317) QueueListenerTest of test_logging now closes the multiprocessing Queue and joins its thread to prevent leaking dangling threads to following tests. Add also @support.reap_threads to detect earlier if a test leaks threads (and try to "cleanup" these threads). (cherry picked from commit 8ca2f2faefa8dba323a2e4c4b86efb633d7a53cf) --- Lib/test/test_logging.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 9dedc098ba5aca..0a2584c6103c32 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -3163,6 +3163,7 @@ def setup_and_log(log_queue, ident): handler.close() @patch.object(logging.handlers.QueueListener, 'handle') + @support.reap_threads def test_handle_called_with_queue_queue(self, mock_handle): for i in range(self.repeat): log_queue = queue.Queue() @@ -3172,10 +3173,13 @@ def test_handle_called_with_queue_queue(self, mock_handle): @support.requires_multiprocessing_queue @patch.object(logging.handlers.QueueListener, 'handle') + @support.reap_threads def test_handle_called_with_mp_queue(self, mock_handle): for i in range(self.repeat): log_queue = multiprocessing.Queue() self.setup_and_log(log_queue, '%s_%s' % (self.id(), i)) + log_queue.close() + log_queue.join_thread() self.assertEqual(mock_handle.call_count, 5 * self.repeat, 'correct number of handled log messages') @@ -3188,6 +3192,7 @@ def get_all_from_queue(log_queue): return [] @support.requires_multiprocessing_queue + @support.reap_threads def test_no_messages_in_queue_after_stop(self): """ Five messages are logged then the QueueListener is stopped. This @@ -3200,6 +3205,9 @@ def test_no_messages_in_queue_after_stop(self): self.setup_and_log(queue, '%s_%s' %(self.id(), i)) # time.sleep(1) items = list(self.get_all_from_queue(queue)) + queue.close() + queue.join_thread() + expected = [[], [logging.handlers.QueueListener._sentinel]] self.assertIn(items, expected, 'Found unexpected messages in queue: %s' % ( From e005dd9a6da7dfa34f47a6989a7e0a6b1ad04949 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 28 Apr 2017 16:06:48 +0200 Subject: [PATCH 0265/2287] bpo-30125: disable faulthandler in ctypes test_SEH (#1237) (#1343) Disable faulthandler to run test_SEH() of test_ctypes to prevent the following log with a traceback: Windows fatal exception: access violation Add support.disable_faulthandler() context manager. (cherry picked from commit a36e939aeb3b5a2c56561eb24f0e339eee9f3f9d) --- Lib/ctypes/test/test_win32.py | 12 ++++++++---- Lib/test/support/__init__.py | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Lib/ctypes/test/test_win32.py b/Lib/ctypes/test/test_win32.py index da1624015e198c..5d85ad6200b319 100644 --- a/Lib/ctypes/test/test_win32.py +++ b/Lib/ctypes/test/test_win32.py @@ -41,15 +41,19 @@ class FunctionCallTestCase(unittest.TestCase): @unittest.skipIf(sys.executable.lower().endswith('_d.exe'), "SEH not enabled in debug builds") def test_SEH(self): - # Call functions with invalid arguments, and make sure - # that access violations are trapped and raise an - # exception. - self.assertRaises(OSError, windll.kernel32.GetModuleHandleA, 32) + # Disable faulthandler to prevent logging the warning: + # "Windows fatal exception: access violation" + with support.disable_faulthandler(): + # Call functions with invalid arguments, and make sure + # that access violations are trapped and raise an + # exception. + self.assertRaises(OSError, windll.kernel32.GetModuleHandleA, 32) def test_noargs(self): # This is a special case on win32 x64 windll.user32.GetDesktopWindow() + @unittest.skipUnless(sys.platform == "win32", 'Windows-specific test') class TestWintypes(unittest.TestCase): def test_HWND(self): diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 1621e3de402c36..2d60adc3dc0fd1 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -2586,3 +2586,19 @@ def setswitchinterval(interval): if _is_android_emulator: interval = minimum_interval return sys.setswitchinterval(interval) + + +@contextlib.contextmanager +def disable_faulthandler(): + # use sys.__stderr__ instead of sys.stderr, since regrtest replaces + # sys.stderr with a StringIO which has no file descriptor when a test + # is run with -W/--verbose3. + fd = sys.__stderr__.fileno() + + is_enabled = faulthandler.is_enabled() + try: + faulthandler.disable() + yield + finally: + if is_enabled: + faulthandler.enable(file=fd, all_threads=True) From 712114b3f9f5f98f03c66a80607b6f7101c5cc90 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 28 Apr 2017 20:05:05 +0300 Subject: [PATCH 0266/2287] [3.6] bpo-30197: Enhance functions swap_attr() and swap_item() in test.support. (GH-1341) (#1345) They now work when delete replaced attribute or item inside the with statement. The old value of the attribute or item (or None if it doesn't exist) now will be assigned to the target of the "as" clause, if there is one. (cherry picked from commit d1a1def7bf221b04dcf3fc3a67aa19aa2f622f83) --- Lib/test/support/__init__.py | 16 ++++++++++++---- Lib/test/test_support.py | 29 +++++++++++++++++++++++------ Lib/test/test_tempfile.py | 5 ++--- Misc/NEWS | 9 +++++++++ 4 files changed, 46 insertions(+), 13 deletions(-) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 2d60adc3dc0fd1..f8d177990bfb03 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -2105,12 +2105,15 @@ def swap_attr(obj, attr, new_val): restoring the old value at the end of the block. If `attr` doesn't exist on `obj`, it will be created and then deleted at the end of the block. + + The old value (or None if it doesn't exist) will be assigned to the + target of the "as" clause, if there is one. """ if hasattr(obj, attr): real_val = getattr(obj, attr) setattr(obj, attr, new_val) try: - yield + yield real_val finally: setattr(obj, attr, real_val) else: @@ -2118,7 +2121,8 @@ def swap_attr(obj, attr, new_val): try: yield finally: - delattr(obj, attr) + if hasattr(obj, attr): + delattr(obj, attr) @contextlib.contextmanager def swap_item(obj, item, new_val): @@ -2132,12 +2136,15 @@ def swap_item(obj, item, new_val): restoring the old value at the end of the block. If `item` doesn't exist on `obj`, it will be created and then deleted at the end of the block. + + The old value (or None if it doesn't exist) will be assigned to the + target of the "as" clause, if there is one. """ if item in obj: real_val = obj[item] obj[item] = new_val try: - yield + yield real_val finally: obj[item] = real_val else: @@ -2145,7 +2152,8 @@ def swap_item(obj, item, new_val): try: yield finally: - del obj[item] + if item in obj: + del obj[item] def strip_python_stderr(stderr): """Strip the stderr of a Python process from potential debug output diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index e83a4d6426a8b2..ddd65092312a3b 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -282,17 +282,34 @@ def test_python_is_optimized(self): def test_swap_attr(self): class Obj: - x = 1 + pass obj = Obj() - with support.swap_attr(obj, "x", 5): + obj.x = 1 + with support.swap_attr(obj, "x", 5) as x: self.assertEqual(obj.x, 5) + self.assertEqual(x, 1) self.assertEqual(obj.x, 1) + with support.swap_attr(obj, "y", 5) as y: + self.assertEqual(obj.y, 5) + self.assertIsNone(y) + self.assertFalse(hasattr(obj, 'y')) + with support.swap_attr(obj, "y", 5): + del obj.y + self.assertFalse(hasattr(obj, 'y')) def test_swap_item(self): - D = {"item":1} - with support.swap_item(D, "item", 5): - self.assertEqual(D["item"], 5) - self.assertEqual(D["item"], 1) + D = {"x":1} + with support.swap_item(D, "x", 5) as x: + self.assertEqual(D["x"], 5) + self.assertEqual(x, 1) + self.assertEqual(D["x"], 1) + with support.swap_item(D, "y", 5) as y: + self.assertEqual(D["y"], 5) + self.assertIsNone(y) + self.assertNotIn("y", D) + with support.swap_item(D, "y", 5): + del D["y"] + self.assertNotIn("y", D) class RefClass: attribute1 = None diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index 51df1ecd7d18e6..d0cf04b0cb67ca 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -273,13 +273,12 @@ def raise_OSError(*args, **kwargs): tempfile._get_default_tempdir() self.assertEqual(os.listdir(our_temp_directory), []) - open = io.open def bad_writer(*args, **kwargs): - fp = open(*args, **kwargs) + fp = orig_open(*args, **kwargs) fp.write = raise_OSError return fp - with support.swap_attr(io, "open", bad_writer): + with support.swap_attr(io, "open", bad_writer) as orig_open: # test again with failing write() with self.assertRaises(FileNotFoundError): tempfile._get_default_tempdir() diff --git a/Misc/NEWS b/Misc/NEWS index b1f79d61240281..936e2b02017f8e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -114,6 +114,15 @@ Documentation - bpo-26985: Add missing info of code object in inspect documentation. +Tests +----- + +- bpo-30197: Enhanced functions swap_attr() and swap_item() in the + test.support module. They now work when delete replaced attribute or item + inside the with statement. The old value of the attribute or item (or None + if it doesn't exist) now will be assigned to the target of the "as" clause, + if there is one. + What's New in Python 3.6.1? =========================== From 5a8dcec93936de816cef5c17522e48fca9c30b43 Mon Sep 17 00:00:00 2001 From: csabella Date: Sat, 29 Apr 2017 20:42:03 -0400 Subject: [PATCH 0267/2287] [3.6] bpo-30208: DOC: fix small typos in IDLE (#1356) (cherry picked from commit d9af73330f46d79cc0c56d369f65ebeec3cb5334) --- Doc/library/idle.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index 07c2a25d6a012c..1a2dac0233c4d2 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -244,7 +244,7 @@ Go to File/Line single: stack viewer Debugger (toggle) - When actived, code entered in the Shell or run from an Editor will run + When activated, code entered in the Shell or run from an Editor will run under the debugger. In the Editor, breakpoints can be set with the context menu. This feature is still incomplete and somewhat experimental. @@ -372,7 +372,7 @@ the :kbd:`Command` key on Mac OSX. * :kbd:`C-l` center window around the insertion point - * :kbd:`C-b` go backwards one character without deleting (usually you can + * :kbd:`C-b` go backward one character without deleting (usually you can also use the cursor key for this) * :kbd:`C-f` go forward one character without deleting (usually you can @@ -394,7 +394,7 @@ After a block-opening statement, the next line is indented by 4 spaces (in the Python Shell window by one tab). After certain keywords (break, return etc.) the next line is dedented. In leading indentation, :kbd:`Backspace` deletes up to 4 spaces if they are there. :kbd:`Tab` inserts spaces (in the Python -Shell window one tab), number depends on Indent width. Currently tabs +Shell window one tab), number depends on Indent width. Currently, tabs are restricted to four spaces due to Tcl/Tk limitations. See also the indent/dedent region commands in the edit menu. @@ -418,7 +418,7 @@ If there is only one possible completion for the characters entered, a :kbd:`C-space` will open a completions window. In an empty string, this will contain the files in the current directory. On a blank line, it will contain the built-in and user-defined functions and -classes in the current name spaces, plus any modules imported. If some +classes in the current namespaces, plus any modules imported. If some characters have been entered, the ACW will attempt to be more specific. If a string of characters is typed, the ACW selection will jump to the @@ -557,7 +557,7 @@ IDLE-console differences As much as possible, the result of executing Python code with IDLE is the same as executing the same code in a console window. However, the different -interface and operation occasionally affects visible results. For instance, +interface and operation occasionally affect visible results. For instance, ``sys.modules`` starts with more entries. IDLE also replaces ``sys.stdin``, ``sys.stdout``, and ``sys.stderr`` with @@ -583,7 +583,7 @@ If firewall software complains anyway, you can ignore it. If the attempt to make the socket connection fails, Idle will notify you. Such failures are sometimes transient, but if persistent, the problem -may be either a firewall blocking the connecton or misconfiguration of +may be either a firewall blocking the connection or misconfiguration of a particular system. Until the problem is fixed, one can run Idle with the -n command line switch. @@ -619,14 +619,14 @@ Setting preferences The font preferences, highlighting, keys, and general preferences can be changed via Configure IDLE on the Option menu. Keys can be user defined; -IDLE ships with four built in key sets. In addition a user can create a +IDLE ships with four built-in key sets. In addition, a user can create a custom key set in the Configure IDLE dialog under the keys tab. Extensions ^^^^^^^^^^ -IDLE contains an extension facility. Peferences for extensions can be +IDLE contains an extension facility. Preferences for extensions can be changed with Configure Extensions. See the beginning of config-extensions.def in the idlelib directory for further information. The default extensions are currently: From 750ff5f8df8faef842470518c58dae2a251114c9 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 29 Apr 2017 22:18:40 -0700 Subject: [PATCH 0268/2287] [3.6] Improve the grammar in windows.rst (GH-1330) (GH-1360) (cherry picked from commit 80a3da4d4aad0b51893e1e2f696b6252eca80e07) --- Doc/using/windows.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 3e4b70e8a17ef7..68687e9f3ec367 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -550,9 +550,9 @@ Shebang Lines If the first line of a script file starts with ``#!``, it is known as a "shebang" line. Linux and other Unix like operating systems have native -support for such lines and are commonly used on such systems to indicate how -a script should be executed. This launcher allows the same facilities to be -using with Python scripts on Windows and the examples above demonstrate their +support for such lines and they are commonly used on such systems to indicate +how a script should be executed. This launcher allows the same facilities to +be used with Python scripts on Windows and the examples above demonstrate their use. To allow shebang lines in Python scripts to be portable between Unix and From 78b23ab6827410960577c01a33df8afc8fd4496e Mon Sep 17 00:00:00 2001 From: Mariatta Date: Mon, 1 May 2017 22:55:53 -0700 Subject: [PATCH 0269/2287] [3.6] Clean up some confusing text left by PROTOCOL_SSLv23 -> PROTOCOL_TLS transition (GH-1355) (#1371) (cherry picked from commit d4069de5112f0408801ff2479476827bb3e0e8fc) --- Doc/library/ssl.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index bbb13745b203e6..0ce73c14095480 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -610,13 +610,13 @@ Constants .. data:: PROTOCOL_TLS Selects the highest protocol version that both the client and server support. - Despite the name, this option can select "TLS" protocols as well as "SSL". + Despite the name, this option can select both "SSL" and "TLS" protocols. .. versionadded:: 3.6 .. data:: PROTOCOL_TLS_CLIENT - Auto-negotiate the highest protocol version like :data:`PROTOCOL_SSLv23`, + Auto-negotiate the highest protocol version like :data:`PROTOCOL_TLS`, but only support client-side :class:`SSLSocket` connections. The protocol enables :data:`CERT_REQUIRED` and :attr:`~SSLContext.check_hostname` by default. @@ -625,7 +625,7 @@ Constants .. data:: PROTOCOL_TLS_SERVER - Auto-negotiate the highest protocol version like :data:`PROTOCOL_SSLv23`, + Auto-negotiate the highest protocol version like :data:`PROTOCOL_TLS`, but only support server-side :class:`SSLSocket` connections. .. versionadded:: 3.6 From 809101f14f27ddb394cd77c477470761ecf99f41 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 2 May 2017 10:47:37 +0200 Subject: [PATCH 0270/2287] bpo-30104: Use -fno-strict-aliasing on clang (#1376) Python/dtoa.c is not compiled correctly with clang 4.0 and optimization level -O2 or higher, because of an aliasing issue on the double/ULong[2] union. Only compile dtoa.c with -fno-strict-aliasing. LLVM bug report: https://bugs.llvm.org//show_bug.cgi?id=31928 --- Makefile.pre.in | 9 +++++++++ configure | 35 ++++++++++++++++++++++++++++------- configure.ac | 34 +++++++++++++++++++++++++++------- 3 files changed, 64 insertions(+), 14 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 8f27d7320c1d69..3eef424b303cfe 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -107,6 +107,8 @@ ARFLAGS= @ARFLAGS@ CFLAGSFORSHARED=@CFLAGSFORSHARED@ # C flags used for building the interpreter object files PY_CORE_CFLAGS= $(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED) -DPy_BUILD_CORE +# Strict or non-strict aliasing flags used to compile dtoa.c, see above +CFLAGS_ALIASING=@CFLAGS_ALIASING@ # Machine-dependent subdirectories @@ -1535,6 +1537,13 @@ config.status: $(srcdir)/configure .c.o: $(CC) -c $(PY_CORE_CFLAGS) -o $@ $< +# bpo-30104: dtoa.c uses union to cast double to unsigned long[2]. clang 4.0 +# with -O2 or higher and strict aliasing miscompiles the ratio() function +# causing rounding issues. Compile dtoa.c using -fno-strict-aliasing on clang. +# https://bugs.llvm.org//show_bug.cgi?id=31928 +Python/dtoa.o: Python/dtoa.c + $(CC) -c $(PY_CORE_CFLAGS) $(CFLAGS_ALIASING) -o $@ $< + # Run reindent on the library reindent: ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/reindent.py -r $(srcdir)/Lib diff --git a/configure b/configure index 6a1b9e4edc2c23..227d1d24b379db 100755 --- a/configure +++ b/configure @@ -668,6 +668,7 @@ OTHER_LIBTOOL_OPT UNIVERSAL_ARCH_FLAGS CFLAGS_NODIST BASECFLAGS +CFLAGS_ALIASING OPT LLVM_PROF_FOUND target_os @@ -6851,6 +6852,7 @@ esac # tweak OPT based on compiler and platform, only if the user didn't set # it on the command line + if test "${OPT-unset}" = "unset" then case $GCC in @@ -6863,30 +6865,49 @@ then WRAP="-fwrapv" fi - # Clang also needs -fwrapv case $CC in - *clang*) WRAP="-fwrapv" - ;; + *clang*) + cc_is_clang=1 + ;; + *) + if $CC --version 2>&1 | grep -q clang + then + cc_is_clang=1 + else + cc_is_clang= + fi esac + if test -n "${cc_is_clang}" + then + # Clang also needs -fwrapv + WRAP="-fwrapv" + # bpo-30104: disable strict aliasing to compile correctly dtoa.c, + # see Makefile.pre.in for more information + CFLAGS_ALIASING="-fno-strict-aliasing" + fi + case $ac_cv_prog_cc_g in yes) if test "$Py_DEBUG" = 'true' ; then # Optimization messes up debuggers, so turn it off for # debug builds. if "$CC" -v --help 2>/dev/null |grep -- -Og > /dev/null; then - OPT="-g -Og -Wall $STRICT_PROTO" + OPT="-g -Og -Wall" else - OPT="-g -O0 -Wall $STRICT_PROTO" + OPT="-g -O0 -Wall" fi else - OPT="-g $WRAP -O3 -Wall $STRICT_PROTO" + OPT="-g $WRAP -O3 -Wall" fi ;; *) - OPT="-O3 -Wall $STRICT_PROTO" + OPT="-O3 -Wall" ;; esac + + OPT="$OPT $STRICT_PROTO" + case $ac_sys_system in SCO_SV*) OPT="$OPT -m486 -DSCO5" ;; diff --git a/configure.ac b/configure.ac index 2c8e246f22f53e..6978b9090de9f6 100644 --- a/configure.ac +++ b/configure.ac @@ -1447,6 +1447,7 @@ esac # tweak OPT based on compiler and platform, only if the user didn't set # it on the command line AC_SUBST(OPT) +AC_SUBST(CFLAGS_ALIASING) if test "${OPT-unset}" = "unset" then case $GCC in @@ -1459,30 +1460,49 @@ then WRAP="-fwrapv" fi - # Clang also needs -fwrapv case $CC in - *clang*) WRAP="-fwrapv" - ;; + *clang*) + cc_is_clang=1 + ;; + *) + if $CC --version 2>&1 | grep -q clang + then + cc_is_clang=1 + else + cc_is_clang= + fi esac + if test -n "${cc_is_clang}" + then + # Clang also needs -fwrapv + WRAP="-fwrapv" + # bpo-30104: disable strict aliasing to compile correctly dtoa.c, + # see Makefile.pre.in for more information + CFLAGS_ALIASING="-fno-strict-aliasing" + fi + case $ac_cv_prog_cc_g in yes) if test "$Py_DEBUG" = 'true' ; then # Optimization messes up debuggers, so turn it off for # debug builds. if "$CC" -v --help 2>/dev/null |grep -- -Og > /dev/null; then - OPT="-g -Og -Wall $STRICT_PROTO" + OPT="-g -Og -Wall" else - OPT="-g -O0 -Wall $STRICT_PROTO" + OPT="-g -O0 -Wall" fi else - OPT="-g $WRAP -O3 -Wall $STRICT_PROTO" + OPT="-g $WRAP -O3 -Wall" fi ;; *) - OPT="-O3 -Wall $STRICT_PROTO" + OPT="-O3 -Wall" ;; esac + + OPT="$OPT $STRICT_PROTO" + case $ac_sys_system in SCO_SV*) OPT="$OPT -m486 -DSCO5" ;; From 33a5d40de997fff5b60157c546a3bf711e083bcc Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 2 May 2017 11:45:42 +0200 Subject: [PATCH 0271/2287] bpo-30108: Restore sys.path in test_site (#1197) (#1378) Add setUpModule() and tearDownModule() functions to test_site to save/restore sys.path at the module level to prevent warning if the user site directory is created, since site.addsitedir() modifies sys.path. (cherry picked from commit b85c136903c6d2368162f7c4a58f258c9c69ead0) --- Lib/test/test_site.py | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index 342ec9e43d5de3..4029617aa1d9c1 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -27,14 +27,27 @@ import site -if site.ENABLE_USER_SITE and not os.path.isdir(site.USER_SITE): - # need to add user site directory for tests - try: - os.makedirs(site.USER_SITE) - site.addsitedir(site.USER_SITE) - except PermissionError as exc: - raise unittest.SkipTest('unable to create user site directory (%r): %s' - % (site.USER_SITE, exc)) + +OLD_SYS_PATH = None + + +def setUpModule(): + global OLD_SYS_PATH + OLD_SYS_PATH = sys.path[:] + + if site.ENABLE_USER_SITE and not os.path.isdir(site.USER_SITE): + # need to add user site directory for tests + try: + os.makedirs(site.USER_SITE) + # modify sys.path: will be restored by tearDownModule() + site.addsitedir(site.USER_SITE) + except PermissionError as exc: + raise unittest.SkipTest('unable to create user site directory (%r): %s' + % (site.USER_SITE, exc)) + + +def tearDownModule(): + sys.path[:] = OLD_SYS_PATH class HelperFunctionsTests(unittest.TestCase): From 30768958490c658fba0fe24f1cabbdad44be22ff Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 2 May 2017 15:50:42 +0200 Subject: [PATCH 0272/2287] bpo-30132: distutils BuildExtTestCase use temp_cwd (#1387) BuildExtTestCase of test_distutils now uses support.temp_cwd() in setUp() to remove files created in the current working in all BuildExtTestCase unit tests, not only test_build_ext(). Fix the following warning: Warning -- files was modified by test_distutils Before: [] After: ['vc140.pdb'] --- Lib/distutils/tests/test_build_ext.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Lib/distutils/tests/test_build_ext.py b/Lib/distutils/tests/test_build_ext.py index be7f5f38aafda7..c6502d61d54d0e 100644 --- a/Lib/distutils/tests/test_build_ext.py +++ b/Lib/distutils/tests/test_build_ext.py @@ -37,6 +37,13 @@ def setUp(self): from distutils.command import build_ext build_ext.USER_BASE = site.USER_BASE + # bpo-30132: On Windows, a .pdb file may be created in the current + # working directory. Create a temporary working directory to cleanup + # everything at the end of the test. + self.temp_cwd = support.temp_cwd() + self.temp_cwd.__enter__() + self.addCleanup(self.temp_cwd.__exit__, None, None, None) + def build_ext(self, *args, **kwargs): return build_ext(*args, **kwargs) From 3c422b92653df05c7034136b77f76376aa5aec4f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 2 May 2017 16:49:10 +0200 Subject: [PATCH 0273/2287] bpo-30199: test_ssl closes all asyncore channels (#1381) (#1390) AsyncoreEchoServer of test_ssl now calls asyncore.close_all(ignore_all=True) to ensure that asyncore.socket_map is cleared once the test completes, even if ConnectionHandler was not correctly unregistered. Fix the following warning: Warning -- asyncore.socket_map was modified by test_ssl Before: {} After: {6: } (cherry picked from commit 1dae7450c68bad498e57800387b24cb103c461fa) --- Lib/test/test_ssl.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index d203cddbdfb5ee..85c59a618ce1e9 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -2065,7 +2065,7 @@ class AsyncoreEchoServer(threading.Thread): class EchoServer (asyncore.dispatcher): - class ConnectionHandler (asyncore.dispatcher_with_send): + class ConnectionHandler(asyncore.dispatcher_with_send): def __init__(self, conn, certfile): self.socket = test_wrap_socket(conn, server_side=True, @@ -2156,6 +2156,8 @@ def __exit__(self, *args): self.join() if support.verbose: sys.stdout.write(" cleanup: successfully joined.\n") + # make sure that ConnectionHandler is removed from socket_map + asyncore.close_all(ignore_all=True) def start (self, flag=None): self.flag = flag From 4dae0d111dd7bb34ec730eea2327a3219acff211 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 2 May 2017 23:46:06 +0200 Subject: [PATCH 0274/2287] [3.6] bpo-30232: Support Git worktree in configure.ac (#1398) * bpo-30232: Support Git worktree in configure.ac (#1391) Don't test if .git/HEAD file exists, but only if the .git file (or directory) exists. (cherry picked from commit 5facdbb29169c2799c42f887cef4cd9d087b0167) * bpo-30232: Regenerate configure (#1396) Run autoconf. (cherry picked from commit 9ed34a89532763cf89f5e11fffb91ef7dee29fed) --- configure | 2 +- configure.ac | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 227d1d24b379db..3c611d6afa2617 100755 --- a/configure +++ b/configure @@ -2711,7 +2711,7 @@ fi -if test -e $srcdir/.git/HEAD +if test -e $srcdir/.git then # Extract the first word of "git", so it can be a program name with args. set dummy git; ac_word=$2 diff --git a/configure.ac b/configure.ac index 6978b9090de9f6..eda075dc755844 100644 --- a/configure.ac +++ b/configure.ac @@ -29,7 +29,7 @@ AC_SUBST(GITVERSION) AC_SUBST(GITTAG) AC_SUBST(GITBRANCH) -if test -e $srcdir/.git/HEAD +if test -e $srcdir/.git then AC_CHECK_PROG(HAS_GIT, git, found, not-found) else From 0c2ff0898db2db9cd9c643dfadbff11761bacf5f Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Wed, 3 May 2017 00:14:29 +0200 Subject: [PATCH 0275/2287] Backport bpo-30205 to 3.6 (#1403) --- Lib/test/test_socket.py | 4 ++++ Misc/NEWS | 2 ++ Modules/socketmodule.c | 6 +++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 2497e47c668bc3..80dfc405c71809 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -4660,6 +4660,10 @@ def bind(self, sock, path): else: raise + def testUnbound(self): + # Issue #30205 + self.assertIn(self.sock.getsockname(), ('', None)) + def testStrAddr(self): # Test binding to and retrieving a normal string pathname. path = os.path.abspath(support.TESTFN) diff --git a/Misc/NEWS b/Misc/NEWS index 936e2b02017f8e..3b615434692239 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,8 @@ Core and Builtins Library ------- +- bpo-30205: Fix getsockname() for unbound AF_UNIX sockets on Linux. + - bpo-30070: Fixed leaks and crashes in errors handling in the parser module. - bpo-30061: Fixed crashes in IOBase methods __next__() and readlines() when diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index f3654c97e76ce9..42aec59ca7f6e5 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -1212,9 +1212,9 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) { struct sockaddr_un *a = (struct sockaddr_un *) addr; #ifdef __linux__ - if (a->sun_path[0] == 0) { /* Linux abstract namespace */ - addrlen -= offsetof(struct sockaddr_un, sun_path); - return PyBytes_FromStringAndSize(a->sun_path, addrlen); + size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path); + if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */ + return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen); } else #endif /* linux */ From 564e89f43b8d64c165755e3c7a94e4daecfde5a3 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 3 May 2017 02:12:22 +0200 Subject: [PATCH 0276/2287] regrtest: always show before/after of modified env (#1192) (#1406) Buildbots don't run tests with -vv and so only log "xxx was modified by test_xxx" which is not enough to debug such random issue. In many cases, I'm unable to reproduce the warning and so unable to fix it. Always logging the value before and value after should help to debug such warning on buildbots. (cherry picked from commit ec4b17239d899550be4ee6104b61751bb3c70382) --- Lib/test/libregrtest/save_env.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Lib/test/libregrtest/save_env.py b/Lib/test/libregrtest/save_env.py index 96ad3af8df4cf7..8309f266bfbe9b 100644 --- a/Lib/test/libregrtest/save_env.py +++ b/Lib/test/libregrtest/save_env.py @@ -279,7 +279,6 @@ def __exit__(self, exc_type, exc_val, exc_tb): if not self.quiet and not self.pgo: print(f"Warning -- {name} was modified by {self.testname}", file=sys.stderr, flush=True) - if self.verbose > 1: - print(f" Before: {original}\n After: {current} ", - file=sys.stderr, flush=True) + print(f" Before: {original}\n After: {current} ", + file=sys.stderr, flush=True) return False From 5bcf01d4cdc78f6b01e5017ff60da7dbfc34c36b Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 2 May 2017 21:35:43 -0700 Subject: [PATCH 0277/2287] [3.6] Fix typo in selectors.rst (GH-1383) (#1414) decriptor -> descriptor (cherry picked from commit b0d82036549074357717d130a772d1e2ebc8ea01) --- Doc/library/selectors.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/selectors.rst b/Doc/library/selectors.rst index 1624d88aaed38d..6d864a836de075 100644 --- a/Doc/library/selectors.rst +++ b/Doc/library/selectors.rst @@ -68,7 +68,7 @@ constants below: .. class:: SelectorKey A :class:`SelectorKey` is a :class:`~collections.namedtuple` used to - associate a file object to its underlying file decriptor, selected event + associate a file object to its underlying file descriptor, selected event mask and attached data. It is returned by several :class:`BaseSelector` methods. From e612c28513b406779d187e5f816445c7d40d292b Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 3 May 2017 09:38:01 -0700 Subject: [PATCH 0278/2287] [3.6] bpo-28556: Routine updates to typing (GH-1366) (#1416) - Add NoReturn type - Use WrapperDescriptorType (original PR by Jim Fasarakis-Hilliard) - Minor bug-fixes (cherry picked from commit f06e0218ef6007667f5d61184b85a81a0466d3ae) --- Lib/test/test_typing.py | 51 +++++++++++++++++++++++++++++++++++++---- Lib/typing.py | 35 ++++++++++++++++++++++++---- Misc/NEWS | 4 ++++ 3 files changed, 81 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index f0070ec975791a..b3cabda394497e 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -6,7 +6,7 @@ from unittest import TestCase, main, skipUnless, SkipTest from copy import copy, deepcopy -from typing import Any +from typing import Any, NoReturn from typing import TypeVar, AnyStr from typing import T, KT, VT # Not in __all__. from typing import Union, Optional @@ -102,10 +102,6 @@ def test_cannot_instantiate(self): with self.assertRaises(TypeError): type(Any)() - def test_cannot_subscript(self): - with self.assertRaises(TypeError): - Any[int] - def test_any_works_with_alias(self): # These expressions must simply not fail. typing.Match[Any] @@ -113,6 +109,40 @@ def test_any_works_with_alias(self): typing.IO[Any] +class NoReturnTests(BaseTestCase): + + def test_noreturn_instance_type_error(self): + with self.assertRaises(TypeError): + isinstance(42, NoReturn) + + def test_noreturn_subclass_type_error(self): + with self.assertRaises(TypeError): + issubclass(Employee, NoReturn) + with self.assertRaises(TypeError): + issubclass(NoReturn, Employee) + + def test_repr(self): + self.assertEqual(repr(NoReturn), 'typing.NoReturn') + + def test_not_generic(self): + with self.assertRaises(TypeError): + NoReturn[int] + + def test_cannot_subclass(self): + with self.assertRaises(TypeError): + class A(NoReturn): + pass + with self.assertRaises(TypeError): + class A(type(NoReturn)): + pass + + def test_cannot_instantiate(self): + with self.assertRaises(TypeError): + NoReturn() + with self.assertRaises(TypeError): + type(NoReturn)() + + class TypeVarTests(BaseTestCase): def test_basic_plain(self): @@ -2273,6 +2303,14 @@ def _fields(self): return 'no chance for this' """) + with self.assertRaises(AttributeError): + exec(""" +class XMethBad2(NamedTuple): + x: int + def _source(self): + return 'no chance for this as well' +""") + @skipUnless(PY36, 'Python 3.6 required') def test_namedtuple_keyword_usage(self): LocalEmployee = NamedTuple("LocalEmployee", name=str, age=int) @@ -2420,6 +2458,9 @@ def test_all(self): self.assertNotIn('sys', a) # Check that Text is defined. self.assertIn('Text', a) + # Check previously missing classes. + self.assertIn('SupportsBytes', a) + self.assertIn('SupportsComplex', a) if __name__ == '__main__': diff --git a/Lib/typing.py b/Lib/typing.py index 9a0f49099a3114..645bc6f8ae0edd 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -11,9 +11,9 @@ except ImportError: import collections as collections_abc # Fallback for PY3.2. try: - from types import SlotWrapperType, MethodWrapperType, MethodDescriptorType + from types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType except ImportError: - SlotWrapperType = type(object.__init__) + WrapperDescriptorType = type(object.__init__) MethodWrapperType = type(object().__str__) MethodDescriptorType = type(str.join) @@ -63,6 +63,8 @@ # Structural checks, a.k.a. protocols. 'Reversible', 'SupportsAbs', + 'SupportsBytes', + 'SupportsComplex', 'SupportsFloat', 'SupportsInt', 'SupportsRound', @@ -420,6 +422,31 @@ def __subclasscheck__(self, cls): Any = _Any(_root=True) +class _NoReturn(_FinalTypingBase, _root=True): + """Special type indicating functions that never return. + Example:: + + from typing import NoReturn + + def stop() -> NoReturn: + raise Exception('no way') + + This type is invalid in other positions, e.g., ``List[NoReturn]`` + will fail in static type checkers. + """ + + __slots__ = () + + def __instancecheck__(self, obj): + raise TypeError("NoReturn cannot be used with isinstance().") + + def __subclasscheck__(self, cls): + raise TypeError("NoReturn cannot be used with issubclass().") + + +NoReturn = _NoReturn(_root=True) + + class TypeVar(_TypingBase, _root=True): """Type variable. @@ -1450,7 +1477,7 @@ def _get_defaults(func): _allowed_types = (types.FunctionType, types.BuiltinFunctionType, types.MethodType, types.ModuleType, - SlotWrapperType, MethodWrapperType, MethodDescriptorType) + WrapperDescriptorType, MethodWrapperType, MethodDescriptorType) def get_type_hints(obj, globalns=None, localns=None): @@ -2051,7 +2078,7 @@ def _make_nmtuple(name, types): # attributes prohibited to set in NamedTuple class syntax _prohibited = ('__new__', '__init__', '__slots__', '__getnewargs__', '_fields', '_field_defaults', '_field_types', - '_make', '_replace', '_asdict') + '_make', '_replace', '_asdict', '_source') _special = ('__module__', '__name__', '__qualname__', '__annotations__') diff --git a/Misc/NEWS b/Misc/NEWS index 3b615434692239..1c9026e77f2e76 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,10 @@ Core and Builtins Library ------- +- bpo-28556: Various updates to typing module: add typing.NoReturn type, use + WrapperDescriptorType, minor bug-fixes. Original PRs by + Jim Fasarakis-Hilliard and Ivan Levkivskyi. + - bpo-30205: Fix getsockname() for unbound AF_UNIX sockets on Linux. - bpo-30070: Fixed leaks and crashes in errors handling in the parser module. From 833dcb62594cc7a834f63ac8f1c312f2ac24d393 Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Wed, 3 May 2017 11:56:44 -0500 Subject: [PATCH 0279/2287] Bump version in AppVeyor config (GH-1436) --- .github/appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/appveyor.yml b/.github/appveyor.yml index a369e52415bb17..a870e5b57d9250 100644 --- a/.github/appveyor.yml +++ b/.github/appveyor.yml @@ -1,4 +1,4 @@ -version: 3.6.1rc1+.{build} +version: 3.6.1+.{build} clone_depth: 5 build_script: - cmd: PCbuild\build.bat -e From af71364c3f0e9cd6cb9d83194315af0ee3c783d2 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 3 May 2017 18:41:20 -0700 Subject: [PATCH 0280/2287] [3.6] bpo-28315: Improve code examples in docs (GH-1372) (#1445) Replace File "", line 1, in ? with File "", line 1, in (cherry picked from commit 8856940cf2e82cb17db2b684cd5732fe658605ca) --- Doc/extending/newtypes.rst | 2 +- Doc/howto/functional.rst | 6 +++--- Doc/library/ctypes.rst | 30 +++++++++++++++--------------- Doc/library/doctest.rst | 6 +++--- Doc/library/fpectl.rst | 2 +- Doc/library/pdb.rst | 2 +- Doc/library/unicodedata.rst | 2 +- Doc/reference/expressions.rst | 2 +- Doc/tutorial/classes.rst | 2 +- Doc/tutorial/controlflow.rst | 2 +- Doc/tutorial/datastructures.rst | 2 +- Doc/tutorial/inputoutput.rst | 2 +- 12 files changed, 30 insertions(+), 30 deletions(-) diff --git a/Doc/extending/newtypes.rst b/Doc/extending/newtypes.rst index b8ce4377877e70..003b4e505d3247 100644 --- a/Doc/extending/newtypes.rst +++ b/Doc/extending/newtypes.rst @@ -124,7 +124,7 @@ our objects and in some error messages, for example:: >>> "" + noddy.new_noddy() Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in TypeError: cannot add type "noddy.Noddy" to string Note that the name is a dotted name that includes both the module name and the diff --git a/Doc/howto/functional.rst b/Doc/howto/functional.rst index 8ae9679894a578..a82dca7077e905 100644 --- a/Doc/howto/functional.rst +++ b/Doc/howto/functional.rst @@ -210,7 +210,7 @@ You can experiment with the iteration interface manually: 3 >>> next(it) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in StopIteration >>> @@ -474,7 +474,7 @@ Here's a sample usage of the ``generate_ints()`` generator: 2 >>> next(gen) Traceback (most recent call last): - File "stdin", line 1, in ? + File "stdin", line 1, in File "stdin", line 2, in generate_ints StopIteration @@ -577,7 +577,7 @@ And here's an example of changing the counter: 9 >>> next(it) #doctest: +SKIP Traceback (most recent call last): - File "t.py", line 15, in ? + File "t.py", line 15, in it.next() StopIteration diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 51a3a360fa3e1e..47bf89f59a5696 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -97,7 +97,7 @@ Functions are accessed as attributes of dll objects:: <_FuncPtr object at 0x...> >>> print(windll.kernel32.MyOwnFunction) # doctest: +WINDOWS Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in File "ctypes.py", line 239, in __getattr__ func = _StdcallFuncPtr(name, self) AttributeError: function 'MyOwnFunction' not found @@ -135,7 +135,7 @@ functions can be accessed by indexing the dll object with the ordinal number:: <_FuncPtr object at 0x...> >>> cdll.kernel32[0] # doctest: +WINDOWS Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in File "ctypes.py", line 310, in __getitem__ func = _StdcallFuncPtr(name, self) AttributeError: function ordinal 0 not found @@ -168,11 +168,11 @@ although an error is raised the function *has* been called:: >>> windll.kernel32.GetModuleHandleA() # doctest: +WINDOWS Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ValueError: Procedure probably called with not enough arguments (4 bytes missing) >>> windll.kernel32.GetModuleHandleA(0, 0) # doctest: +WINDOWS Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ValueError: Procedure probably called with too many arguments (4 bytes in excess) >>> @@ -181,13 +181,13 @@ The same exception is raised when you call an ``stdcall`` function with the >>> cdll.kernel32.GetModuleHandleA(None) # doctest: +WINDOWS Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ValueError: Procedure probably called with not enough arguments (4 bytes missing) >>> >>> windll.msvcrt.printf(b"spam") # doctest: +WINDOWS Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ValueError: Procedure probably called with too many arguments (4 bytes in excess) >>> @@ -200,7 +200,7 @@ argument values:: >>> windll.kernel32.GetModuleHandleA(32) # doctest: +WINDOWS Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in OSError: exception: access violation reading 0x00000020 >>> @@ -373,7 +373,7 @@ from within *IDLE* or *PythonWin*:: 19 >>> printf(b"%f bottles of beer\n", 42.5) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ArgumentError: argument 2: exceptions.TypeError: Don't know how to convert parameter 2 >>> @@ -436,7 +436,7 @@ prototype for a C function), and tries to convert the arguments to valid types:: >>> printf(b"%d %d %d", 1, 2, 3) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ArgumentError: argument 2: exceptions.TypeError: wrong type >>> printf(b"%s %d %f\n", b"X", 2, 3) X 2 3.000000 @@ -486,7 +486,7 @@ single character Python bytes object into a C char:: 'def' >>> strchr(b"abcdef", b"def") Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ArgumentError: argument 2: exceptions.TypeError: one character string expected >>> print(strchr(b"abcdef", b"x")) None @@ -512,7 +512,7 @@ useful to check for error return values and automatically raise an exception:: 486539264 >>> GetModuleHandle("something silly") # doctest: +WINDOWS Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in File "", line 3, in ValidHandle OSError: [Errno 126] The specified module could not be found. >>> @@ -583,7 +583,7 @@ Here is a simple example of a POINT structure, which contains two integers named 0 5 >>> POINT(1, 2, 3) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ValueError: too many initializers >>> @@ -786,7 +786,7 @@ new type:: >>> PI(42) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in TypeError: expected c_long instead of int >>> PI(c_int(42)) @@ -862,7 +862,7 @@ but not instances of other types:: >>> bar.values = (c_byte * 4)() Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in TypeError: incompatible types, c_byte_Array_4 instance instead of LP_c_long instance >>> @@ -913,7 +913,7 @@ work:: ... ("next", POINTER(cell))] ... Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in File "", line 2, in cell NameError: name 'cell' is not defined >>> diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst index 15b12f7aa786ea..587a0a09a94791 100644 --- a/Doc/library/doctest.rst +++ b/Doc/library/doctest.rst @@ -408,7 +408,7 @@ Simple example:: >>> [1, 2, 3].remove(42) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ValueError: list.remove(x): x not in list That doctest succeeds if :exc:`ValueError` is raised, with the ``list.remove(x): @@ -432,7 +432,7 @@ multi-line detail:: >>> raise ValueError('multi\n line\ndetail') Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ValueError: multi line detail @@ -591,7 +591,7 @@ doctest decides whether actual output matches an example's expected output: >>> (1, 2)[3] = 'moo' Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in TypeError: object doesn't support item assignment passes under Python 2.3 and later Python versions with the flag specified, diff --git a/Doc/library/fpectl.rst b/Doc/library/fpectl.rst index e4b528cf0b0b6f..96607165ba4e3e 100644 --- a/Doc/library/fpectl.rst +++ b/Doc/library/fpectl.rst @@ -89,7 +89,7 @@ The following example demonstrates how to start up and test operation of the >>> import math >>> math.exp(1000) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in FloatingPointError: in math_1 diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst index 7c37bb7d248c91..6225a3a1f07996 100644 --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -76,7 +76,7 @@ The typical usage to inspect a crashed program is:: >>> import mymodule >>> mymodule.test() Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in File "./mymodule.py", line 4, in test test2() File "./mymodule.py", line 3, in test2 diff --git a/Doc/library/unicodedata.rst b/Doc/library/unicodedata.rst index 643180953fd23d..2a9777609527d0 100644 --- a/Doc/library/unicodedata.rst +++ b/Doc/library/unicodedata.rst @@ -158,7 +158,7 @@ Examples: 9 >>> unicodedata.decimal('a') Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ValueError: not a decimal >>> unicodedata.category('A') # 'L'etter, 'u'ppercase 'Lu' diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index c4f6c55c7ca3aa..43d2690cbba91b 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -905,7 +905,7 @@ keyword arguments (and any ``**expression`` arguments -- see below). So:: 2 1 >>> f(a=1, *(2,)) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in TypeError: f() got multiple values for keyword argument 'a' >>> f(1, *(2,)) 1 2 diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst index e134d5d62ea667..073444cf8b3985 100644 --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -784,7 +784,7 @@ using the :func:`next` built-in function; this example shows how it all works:: 'c' >>> next(it) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in next(it) StopIteration diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index 6a9bb4889ff857..54171bc96f0f08 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -475,7 +475,7 @@ Here's an example that fails due to this restriction:: ... >>> function(0, a=0) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in TypeError: function() got multiple values for keyword argument 'a' When a final formal parameter of the form ``**name`` is present, it receives a diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst index 6140ece046b975..1a73ac9d05936a 100644 --- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -261,7 +261,7 @@ it must be parenthesized. :: [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)] >>> # the tuple must be parenthesized, otherwise an error is raised >>> [x, x**2 for x in range(6)] - File "", line 1, in ? + File "", line 1, in [x, x**2 for x in range(6)] ^ SyntaxError: invalid syntax diff --git a/Doc/tutorial/inputoutput.rst b/Doc/tutorial/inputoutput.rst index beeaac36b9bd24..bad0302b037861 100644 --- a/Doc/tutorial/inputoutput.rst +++ b/Doc/tutorial/inputoutput.rst @@ -362,7 +362,7 @@ attempts to use the file object will automatically fail. :: >>> f.close() >>> f.read() Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ValueError: I/O operation on closed file It is good practice to use the :keyword:`with` keyword when dealing with file From 1bebd8a21948652a5f941c550dec06ea84d1d979 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 4 May 2017 06:50:28 +0300 Subject: [PATCH 0281/2287] [3.6] bpo-30184: Add tests for invalid use of PyArg_ParseTupleAndKeywords. (GH-1316). (#1441) (cherry picked from commit 5f161fd86dd5bb936a1a2a13391b13b7e59ec201) --- Lib/test/test_capi.py | 59 +++++++++++++++++++++++++++------------ Modules/_testcapimodule.c | 4 +-- 2 files changed, 43 insertions(+), 20 deletions(-) diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 08aa3ffdf6b4f1..216851c2d36c8b 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -490,9 +490,8 @@ def test_skipitem(self): # test the format unit when not skipped format = c + "i" try: - # (note: the format string must be bytes!) _testcapi.parse_tuple_and_keywords(tuple_1, dict_b, - format.encode("ascii"), keywords) + format, keywords) when_not_skipped = False except SystemError as e: s = "argument 1 (impossible)" @@ -504,7 +503,7 @@ def test_skipitem(self): optional_format = "|" + format try: _testcapi.parse_tuple_and_keywords(empty_tuple, dict_b, - optional_format.encode("ascii"), keywords) + optional_format, keywords) when_skipped = False except SystemError as e: s = "impossible: '{}'".format(format) @@ -517,40 +516,64 @@ def test_skipitem(self): self.assertIs(when_skipped, when_not_skipped, message) def test_parse_tuple_and_keywords(self): - # parse_tuple_and_keywords error handling tests + # Test handling errors in the parse_tuple_and_keywords helper itself self.assertRaises(TypeError, _testcapi.parse_tuple_and_keywords, (), {}, 42, []) self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords, - (), {}, b'', 42) + (), {}, '', 42) self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords, - (), {}, b'', [''] * 42) + (), {}, '', [''] * 42) self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords, - (), {}, b'', [42]) + (), {}, '', [42]) + + def test_bad_use(self): + # Test handling invalid format and keywords in + # PyArg_ParseTupleAndKeywords() + self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords, + (1,), {}, '||O', ['a']) + self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords, + (1, 2), {}, '|O|O', ['a', 'b']) + self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords, + (), {'a': 1}, '$$O', ['a']) + self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords, + (), {'a': 1, 'b': 2}, '$O$O', ['a', 'b']) + self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords, + (), {'a': 1}, '$|O', ['a']) + self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords, + (), {'a': 1, 'b': 2}, '$O|O', ['a', 'b']) + self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords, + (1,), {}, '|O', ['a', 'b']) + self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords, + (1,), {}, '|OO', ['a']) + self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords, + (), {}, '|$O', ['']) + self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords, + (), {}, '|OO', ['a', '']) def test_positional_only(self): parse = _testcapi.parse_tuple_and_keywords - parse((1, 2, 3), {}, b'OOO', ['', '', 'a']) - parse((1, 2), {'a': 3}, b'OOO', ['', '', 'a']) + parse((1, 2, 3), {}, 'OOO', ['', '', 'a']) + parse((1, 2), {'a': 3}, 'OOO', ['', '', 'a']) with self.assertRaisesRegex(TypeError, r'Function takes at least 2 positional arguments \(1 given\)'): - parse((1,), {'a': 3}, b'OOO', ['', '', 'a']) - parse((1,), {}, b'O|OO', ['', '', 'a']) + parse((1,), {'a': 3}, 'OOO', ['', '', 'a']) + parse((1,), {}, 'O|OO', ['', '', 'a']) with self.assertRaisesRegex(TypeError, r'Function takes at least 1 positional arguments \(0 given\)'): - parse((), {}, b'O|OO', ['', '', 'a']) - parse((1, 2), {'a': 3}, b'OO$O', ['', '', 'a']) + parse((), {}, 'O|OO', ['', '', 'a']) + parse((1, 2), {'a': 3}, 'OO$O', ['', '', 'a']) with self.assertRaisesRegex(TypeError, r'Function takes exactly 2 positional arguments \(1 given\)'): - parse((1,), {'a': 3}, b'OO$O', ['', '', 'a']) - parse((1,), {}, b'O|O$O', ['', '', 'a']) + parse((1,), {'a': 3}, 'OO$O', ['', '', 'a']) + parse((1,), {}, 'O|O$O', ['', '', 'a']) with self.assertRaisesRegex(TypeError, r'Function takes at least 1 positional arguments \(0 given\)'): - parse((), {}, b'O|O$O', ['', '', 'a']) + parse((), {}, 'O|O$O', ['', '', 'a']) with self.assertRaisesRegex(SystemError, r'Empty parameter name after \$'): - parse((1,), {}, b'O|$OO', ['', '', 'a']) + parse((1,), {}, 'O|$OO', ['', '', 'a']) with self.assertRaisesRegex(SystemError, 'Empty keyword'): - parse((1,), {}, b'O|OO', ['', 'a', '']) + parse((1,), {}, 'O|OO', ['', 'a', '']) @unittest.skipUnless(threading, 'Threading required for this test.') diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index b25f4434ffa35c..c76eefab4e80cf 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -1571,7 +1571,7 @@ parse_tuple_and_keywords(PyObject *self, PyObject *args) { PyObject *sub_args; PyObject *sub_kwargs; - char *sub_format; + const char *sub_format; PyObject *sub_keywords; Py_ssize_t i, size; @@ -1584,7 +1584,7 @@ parse_tuple_and_keywords(PyObject *self, PyObject *args) double buffers[8][4]; /* double ensures alignment where necessary */ - if (!PyArg_ParseTuple(args, "OOyO:parse_tuple_and_keywords", + if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords", &sub_args, &sub_kwargs, &sub_format, &sub_keywords)) return NULL; From 31906b42fd71c6baaf80429005c720b40dfe8fae Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 4 May 2017 13:21:10 +0200 Subject: [PATCH 0282/2287] bpo-30225: Fix is_valid_fd() on macOS Tiger (#1443) (#1449) is_valid_fd() now uses fstat() instead of dup() on macOS to return 0 on a pipe when the other side of the pipe is closed. fstat() fails with EBADF in that case, whereas dup() succeed. (cherry picked from commit 1c4670ea0cc3d208121af11b9b973e6bb268e570) --- Python/pylifecycle.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index af96d6d5fcb63c..640271fd20b709 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1044,6 +1044,14 @@ initsite(void) static int is_valid_fd(int fd) { +#ifdef __APPLE__ + /* bpo-30225: On macOS Tiger, when stdout is redirected to a pipe + and the other side of the pipe is closed, dup(1) succeed, whereas + fstat(1, &st) fails with EBADF. Prefer fstat() over dup() to detect + such error. */ + struct stat st; + return (fstat(fd, &st) == 0); +#else int fd2; if (fd < 0) return 0; @@ -1056,6 +1064,7 @@ is_valid_fd(int fd) close(fd2); _Py_END_SUPPRESS_IPH return fd2 >= 0; +#endif } /* returns Py_None if the fd is not valid */ From a7e48b544becc01dbf9059ed01f38997c6d0156c Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Thu, 4 May 2017 17:12:35 +0200 Subject: [PATCH 0283/2287] [3.6] bpo-30185: avoid KeyboardInterrupt tracebacks in forkserver (GH-1319) (#1454) * bpo-30185: avoid KeyboardInterrupt tracebacks in forkserver * Tweak comment. (cherry picked from commit 6dd4d734ed207ba16b017e38f8909de7ef187e29) --- Lib/multiprocessing/forkserver.py | 20 ++++++++++++++------ Misc/NEWS | 3 +++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/Lib/multiprocessing/forkserver.py b/Lib/multiprocessing/forkserver.py index f2c179e4e0afaa..d5ce6257456766 100644 --- a/Lib/multiprocessing/forkserver.py +++ b/Lib/multiprocessing/forkserver.py @@ -149,8 +149,15 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None): util._close_stdin() - # ignoring SIGCHLD means no need to reap zombie processes - handler = signal.signal(signal.SIGCHLD, signal.SIG_IGN) + # ignoring SIGCHLD means no need to reap zombie processes; + # letting SIGINT through avoids KeyboardInterrupt tracebacks + handlers = { + signal.SIGCHLD: signal.SIG_IGN, + signal.SIGINT: signal.SIG_DFL, + } + old_handlers = {sig: signal.signal(sig, val) + for (sig, val) in handlers.items()} + with socket.socket(socket.AF_UNIX, fileno=listener_fd) as listener, \ selectors.DefaultSelector() as selector: _forkserver._forkserver_address = listener.getsockname() @@ -175,7 +182,7 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None): code = 1 if os.fork() == 0: try: - _serve_one(s, listener, alive_r, handler) + _serve_one(s, listener, alive_r, old_handlers) except Exception: sys.excepthook(*sys.exc_info()) sys.stderr.flush() @@ -186,11 +193,12 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None): if e.errno != errno.ECONNABORTED: raise -def _serve_one(s, listener, alive_r, handler): - # close unnecessary stuff and reset SIGCHLD handler +def _serve_one(s, listener, alive_r, handlers): + # close unnecessary stuff and reset signal handlers listener.close() os.close(alive_r) - signal.signal(signal.SIGCHLD, handler) + for sig, val in handlers.items(): + signal.signal(sig, val) # receive fds from parent process fds = reduction.recvfds(s, MAXFDS_TO_SEND + 1) diff --git a/Misc/NEWS b/Misc/NEWS index 1c9026e77f2e76..f0d5a3ba2073c8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,9 @@ Core and Builtins Library ------- +- bpo-30185: Avoid KeyboardInterrupt tracebacks in forkserver helper process + when Ctrl-C is received. + - bpo-28556: Various updates to typing module: add typing.NoReturn type, use WrapperDescriptorType, minor bug-fixes. Original PRs by Jim Fasarakis-Hilliard and Ivan Levkivskyi. From 9d02f562961efd12d3c8317a10916db7f77330cc Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 5 May 2017 00:46:56 +0200 Subject: [PATCH 0284/2287] [3.6] bpo-23404: make touch becomes make regen-all (#1405) (#1461) * bpo-23404: make touch becomes make regen-all (#1405) Don't rebuild generated files based on file modification time anymore, the action is now explicit. Replace "make touch" with "make regen-all". Changes: * Remove "make touch", Tools/hg/hgtouch.py and .hgtouch * Add a new "make regen-all" command to rebuild all generated files * Add subcommands to only generate specific files: - regen-ast: Include/Python-ast.h and Python/Python-ast.c - regen-grammar: Include/graminit.h and Python/graminit.c - regen-importlib: Python/importlib_external.h and Python/importlib.h - regen-opcode: Include/opcode.h - regen-opcode-targets: Python/opcode_targets.h - regen-typeslots: Objects/typeslots.inc * Rename PYTHON_FOR_GEN to PYTHON_FOR_REGEN * pgen is now only built by by "make regen-grammar" * Add $(srcdir)/ prefix to paths to source files to handle correctly compilation outside the source directory Note: $(PYTHON_FOR_REGEN) is no more used nor needed by "make" default target building Python. (cherry picked from commit a5c62a8e9f0de6c4133825a5710984a3cd5e102b) * bpo-30273: Update sysconfig (#1464) The AST_H_DIR variable was removed from Makefile.pre.in by the commit a5c62a8e9f0de6c4133825a5710984a3cd5e102b (bpo-23404). AST_H_DIR was hardcoded to "Include", so replace the removed variable by its content. Remove also ASDLGEN variable from sysconfig example since this variable was also removed. (cherry picked from commit b109a1d3360fc4bb87b9887264e3634632d392ca) --- .hgtouch | 17 ---- Doc/library/sysconfig.rst | 1 - Lib/distutils/sysconfig.py | 2 +- Mac/BuildScript/build-installer.py | 4 - Makefile.pre.in | 149 ++++++++++++++--------------- Misc/NEWS | 6 +- Tools/hg/hgtouch.py | 129 ------------------------- configure | 32 +++---- configure.ac | 13 +-- 9 files changed, 91 insertions(+), 262 deletions(-) delete mode 100644 .hgtouch delete mode 100644 Tools/hg/hgtouch.py diff --git a/.hgtouch b/.hgtouch deleted file mode 100644 index b9be0f11fdb829..00000000000000 --- a/.hgtouch +++ /dev/null @@ -1,17 +0,0 @@ -# -*- Makefile -*- -# Define dependencies of generated files that are checked into hg. -# The syntax of this file uses make rule dependencies, without actions - -Python/importlib.h: Lib/importlib/_bootstrap.py Programs/_freeze_importlib.c - -Include/opcode.h: Lib/opcode.py Tools/scripts/generate_opcode_h.py - -Include/Python-ast.h: Parser/Python.asdl Parser/asdl.py Parser/asdl_c.py -Python/Python-ast.c: Include/Python-ast.h - -Python/opcode_targets.h: Python/makeopcodetargets.py Lib/opcode.py - -Objects/typeslots.inc: Include/typeslots.h Objects/typeslots.py - -Include/graminit.h: Grammar/Grammar Parser/acceler.c Parser/grammar1.c Parser/listnode.c Parser/node.c Parser/parser.c Parser/bitset.c Parser/metagrammar.c Parser/firstsets.c Parser/grammar.c Parser/pgen.c Objects/obmalloc.c Python/dynamic_annotations.c Python/mysnprintf.c Python/pyctype.c Parser/tokenizer_pgen.c Parser/printgrammar.c Parser/parsetok_pgen.c Parser/pgenmain.c -Python/graminit.c: Include/graminit.h Grammar/Grammar Parser/acceler.c Parser/grammar1.c Parser/listnode.c Parser/node.c Parser/parser.c Parser/bitset.c Parser/metagrammar.c Parser/firstsets.c Parser/grammar.c Parser/pgen.c Objects/obmalloc.c Python/dynamic_annotations.c Python/mysnprintf.c Python/pyctype.c Parser/tokenizer_pgen.c Parser/printgrammar.c Parser/parsetok_pgen.c Parser/pgenmain.c diff --git a/Doc/library/sysconfig.rst b/Doc/library/sysconfig.rst index 08b74a9affd24f..f066a765d00ec7 100644 --- a/Doc/library/sysconfig.rst +++ b/Doc/library/sysconfig.rst @@ -255,7 +255,6 @@ You can use :mod:`sysconfig` as a script with Python's *-m* option: AIX_GENUINE_CPLUSPLUS = "0" AR = "ar" ARFLAGS = "rc" - ASDLGEN = "./Parser/asdl_c.py" ... This call will print in the standard output the information returned by diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py index 8bf1a7016bdf42..90004acea88761 100644 --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -97,7 +97,7 @@ def get_python_inc(plat_specific=0, prefix=None): if plat_specific: return base if _sys_home: - incdir = os.path.join(_sys_home, get_config_var('AST_H_DIR')) + incdir = os.path.join(_sys_home, 'Include') else: incdir = os.path.join(get_config_var('srcdir'), 'Include') return os.path.normpath(incdir) diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index f59ae34df2549a..7b4376f42b88f3 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -1142,10 +1142,6 @@ def buildPython(): shellQuote(WORKDIR)[1:-1], shellQuote(WORKDIR)[1:-1])) - # bpo-29550: avoid using make touch until it is fixed for git - # print("Running make touch") - # runCommand("make touch") - print("Running make") runCommand("make") diff --git a/Makefile.pre.in b/Makefile.pre.in index 3eef424b303cfe..6e3a82f95df06d 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -229,7 +229,7 @@ LIBOBJS= @LIBOBJS@ PYTHON= python$(EXE) BUILDPYTHON= python$(BUILDEXE) -PYTHON_FOR_GEN=@PYTHON_FOR_GEN@ +PYTHON_FOR_REGEN=@PYTHON_FOR_REGEN@ PYTHON_FOR_BUILD=@PYTHON_FOR_BUILD@ _PYTHON_HOST_PLATFORM=@_PYTHON_HOST_PLATFORM@ BUILD_GNU_TYPE= @build@ @@ -273,11 +273,6 @@ IO_OBJS= \ Modules/_io/stringio.o ########################################################################## -# Grammar -GRAMMAR_H= Include/graminit.h -GRAMMAR_C= Python/graminit.c -GRAMMAR_INPUT= $(srcdir)/Grammar/Grammar - LIBFFI_INCLUDEDIR= @LIBFFI_INCLUDEDIR@ @@ -316,38 +311,9 @@ PARSER_HEADERS= \ PGENOBJS= $(POBJS) $(PGOBJS) -########################################################################## -# opcode.h generation -OPCODE_H_DIR= $(srcdir)/Include -OPCODE_H_SCRIPT= $(srcdir)/Tools/scripts/generate_opcode_h.py -OPCODE_H= $(OPCODE_H_DIR)/opcode.h -OPCODE_H_GEN= $(PYTHON_FOR_GEN) $(OPCODE_H_SCRIPT) $(srcdir)/Lib/opcode.py $(OPCODE_H) - -########################################################################## -# AST -AST_H_DIR= Include -AST_H= $(AST_H_DIR)/Python-ast.h -AST_C_DIR= Python -AST_C= $(AST_C_DIR)/Python-ast.c -AST_ASDL= $(srcdir)/Parser/Python.asdl - -ASDLGEN_FILES= $(srcdir)/Parser/asdl.py $(srcdir)/Parser/asdl_c.py -# Note that a build now requires Python to exist before the build starts. -# Use "hg touch" to fix up screwed up file mtimes in a checkout. -ASDLGEN= $(PYTHON_FOR_GEN) $(srcdir)/Parser/asdl_c.py - ########################################################################## # Python -OPCODETARGETS_H= \ - Python/opcode_targets.h - -OPCODETARGETGEN= \ - $(srcdir)/Python/makeopcodetargets.py - -OPCODETARGETGEN_FILES= \ - $(OPCODETARGETGEN) $(srcdir)/Lib/opcode.py - PYTHON_OBJS= \ Python/_warnings.o \ Python/Python-ast.o \ @@ -547,7 +513,8 @@ coverage-lcov: @echo "lcov report at $(COVERAGE_REPORT)/index.html" @echo -coverage-report: +# Force regeneration of parser and importlib +coverage-report: regen-grammar regen-importlib : # force rebuilding of parser and importlib @touch $(GRAMMAR_INPUT) @touch $(srcdir)/Lib/importlib/_bootstrap.py @@ -723,14 +690,24 @@ Programs/_freeze_importlib.o: Programs/_freeze_importlib.c Makefile Programs/_freeze_importlib: Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) $(LINKCC) $(PY_LDFLAGS) -o $@ Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) -Python/importlib_external.h: @GENERATED_COMMENT@ $(srcdir)/Lib/importlib/_bootstrap_external.py Programs/_freeze_importlib Python/marshal.c +.PHONY: regen-importlib +regen-importlib: Programs/_freeze_importlib + # Regenerate Python/importlib_external.h + # from Lib/importlib/_bootstrap_external.py using _freeze_importlib ./Programs/_freeze_importlib \ - $(srcdir)/Lib/importlib/_bootstrap_external.py Python/importlib_external.h - -Python/importlib.h: @GENERATED_COMMENT@ $(srcdir)/Lib/importlib/_bootstrap.py Programs/_freeze_importlib Python/marshal.c + $(srcdir)/Lib/importlib/_bootstrap_external.py \ + $(srcdir)/Python/importlib_external.h + # Regenerate Python/importlib.h from Lib/importlib/_bootstrap.py + # using _freeze_importlib ./Programs/_freeze_importlib \ - $(srcdir)/Lib/importlib/_bootstrap.py Python/importlib.h + $(srcdir)/Lib/importlib/_bootstrap.py \ + $(srcdir)/Python/importlib.h + + +############################################################################ +# Regenerate all generated files +regen-all: regen-opcode regen-opcode-targets regen-typeslots regen-grammar regen-ast regen-importlib ############################################################################ # Special rules for object files @@ -789,15 +766,18 @@ Python/sysmodule.o: $(srcdir)/Python/sysmodule.c Makefile $(IO_OBJS): $(IO_H) -$(GRAMMAR_H): @GENERATED_COMMENT@ $(GRAMMAR_INPUT) $(PGEN) - @$(MKDIR_P) Include - $(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C) -$(GRAMMAR_C): @GENERATED_COMMENT@ $(GRAMMAR_H) - touch $(GRAMMAR_C) - $(PGEN): $(PGENOBJS) $(CC) $(OPT) $(PY_LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN) +.PHONY: regen-grammar +regen-grammar: $(PGEN) + # Regenerate Include/graminit.h and Python/graminit.c + # from Grammar/Grammar using pgen + @$(MKDIR_P) Include + $(PGEN) $(srcdir)/Grammar/Grammar \ + $(srcdir)/Include/graminit.h \ + $(srcdir)/Python/graminit.c + Parser/grammar.o: $(srcdir)/Parser/grammar.c \ $(srcdir)/Include/token.h \ $(srcdir)/Include/grammar.h @@ -809,18 +789,28 @@ Parser/printgrammar.o: $(srcdir)/Parser/printgrammar.c Parser/pgenmain.o: $(srcdir)/Include/parsetok.h -$(AST_H): $(AST_ASDL) $(ASDLGEN_FILES) - $(MKDIR_P) $(AST_H_DIR) - $(ASDLGEN) -h $(AST_H_DIR) $(AST_ASDL) - -$(AST_C): $(AST_H) $(AST_ASDL) $(ASDLGEN_FILES) - $(MKDIR_P) $(AST_C_DIR) - $(ASDLGEN) -c $(AST_C_DIR) $(AST_ASDL) - -$(OPCODE_H): $(srcdir)/Lib/opcode.py $(OPCODE_H_SCRIPT) - $(OPCODE_H_GEN) - -Python/compile.o Python/symtable.o Python/ast.o: $(GRAMMAR_H) $(AST_H) +.PHONY=regen-ast +regen-ast: + # Regenerate Include/Python-ast.h using Parser/asdl_c.py -h + $(MKDIR_P) $(srcdir)/Include + $(PYTHON_FOR_REGEN) $(srcdir)/Parser/asdl_c.py \ + -h $(srcdir)/Include \ + $(srcdir)/Parser/Python.asdl + # Regenerate Python/Python-ast.c using Parser/asdl_c.py -c + $(MKDIR_P) $(srcdir)/Python + $(PYTHON_FOR_REGEN) $(srcdir)/Parser/asdl_c.py \ + -c $(srcdir)/Python \ + $(srcdir)/Parser/Python.asdl + +.PHONY: regen-opcode +regen-opcode: + # Regenerate Include/opcode.h from Lib/opcode.py + # using Tools/scripts/generate_opcode_h.py + $(PYTHON_FOR_REGEN) $(srcdir)/Tools/scripts/generate_opcode_h.py \ + $(srcdir)/Lib/opcode.py \ + $(srcdir)/Include/opcode.h + +Python/compile.o Python/symtable.o Python/ast.o: $(srcdir)/Include/graminit.h $(srcdir)/Include/Python-ast.h Python/getplatform.o: $(srcdir)/Python/getplatform.c $(CC) -c $(PY_CORE_CFLAGS) -DPLATFORM='"$(MACHDEP)"' -o $@ $(srcdir)/Python/getplatform.c @@ -870,12 +860,16 @@ Objects/odictobject.o: $(srcdir)/Objects/dict-common.h Objects/dictobject.o: $(srcdir)/Objects/stringlib/eq.h $(srcdir)/Objects/dict-common.h Objects/setobject.o: $(srcdir)/Objects/stringlib/eq.h -$(OPCODETARGETS_H): $(OPCODETARGETGEN_FILES) - $(PYTHON_FOR_GEN) $(OPCODETARGETGEN) $(OPCODETARGETS_H) +.PHONY: regen-opcode-targets +regen-opcode-targets: + # Regenerate Python/opcode_targets.h from Lib/opcode.py + # using Python/makeopcodetargets.py + $(PYTHON_FOR_REGEN) $(srcdir)/Python/makeopcodetargets.py \ + $(srcdir)/Python/opcode_targets.h -Python/ceval.o: $(OPCODETARGETS_H) $(srcdir)/Python/ceval_gil.h +Python/ceval.o: $(srcdir)/Python/opcode_targets.h $(srcdir)/Python/ceval_gil.h -Python/frozen.o: Python/importlib.h Python/importlib_external.h +Python/frozen.o: $(srcdir)/Python/importlib.h $(srcdir)/Python/importlib_external.h # Generate DTrace probe macros, then rename them (PYTHON_ -> PyDTrace_) to # follow our naming conventions. dtrace(1) uses the output filename to generate @@ -890,8 +884,14 @@ Python/pydtrace.o: $(srcdir)/Include/pydtrace.d $(DTRACE_DEPS) $(DTRACE) $(DFLAGS) -o $@ -G -s $< $(DTRACE_DEPS) Objects/typeobject.o: Objects/typeslots.inc -Objects/typeslots.inc: $(srcdir)/Include/typeslots.h $(srcdir)/Objects/typeslots.py - $(PYTHON_FOR_GEN) $(srcdir)/Objects/typeslots.py < $(srcdir)/Include/typeslots.h Objects/typeslots.inc + +.PHONY: regen-typeslots +regen-typeslots: + # Regenerate Objects/typeslots.inc from Include/typeslotsh + # using Objects/typeslots.py + $(PYTHON_FOR_REGEN) $(srcdir)/Objects/typeslots.py \ + < $(srcdir)/Include/typeslots.h \ + $(srcdir)/Objects/typeslots.inc ############################################################################ # Header files @@ -944,7 +944,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/node.h \ $(srcdir)/Include/object.h \ $(srcdir)/Include/objimpl.h \ - $(OPCODE_H) \ + $(srcdir)/Include/opcode.h \ $(srcdir)/Include/osdefs.h \ $(srcdir)/Include/osmodule.h \ $(srcdir)/Include/patchlevel.h \ @@ -987,7 +987,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/weakrefobject.h \ pyconfig.h \ $(PARSER_HEADERS) \ - $(AST_H) \ + $(srcdir)/Include/Python-ast.h \ $(DTRACE_HEADERS) $(LIBRARY_OBJS) $(MODOBJS) Programs/python.o: $(PYTHON_HEADERS) @@ -1554,9 +1554,12 @@ recheck: $(SHELL) config.status --recheck $(SHELL) config.status -# Rebuild the configure script from configure.ac; also rebuild pyconfig.h.in +# Regenerate configure and pyconfig.h.in +.PHONY: autoconf autoconf: + # Regenerate the configure script from configure.ac using autoconf (cd $(srcdir); autoconf -Wall) + # Regenerate pyconfig.h.in from configure.ac using autoheader (cd $(srcdir); autoheader -Wall) # Create a tags file for vi @@ -1573,14 +1576,6 @@ TAGS:: etags Include/*.h; \ for i in $(SRCDIRS); do etags -a $$i/*.[ch]; done -# This fixes up the mtimes of checked-in generated files, assuming that they -# only *appear* to be outdated because of checkout order. -# This is run while preparing a source release tarball, and can be run manually -# to avoid bootstrap issues. -touch: - cd $(srcdir); \ - hg --config extensions.touch=Tools/hg/hgtouch.py touch -v - # Sanitation targets -- clean leaves libraries, executables and tags # files, which clobber removes as well pycremoval: @@ -1698,7 +1693,7 @@ Python/thread.o: @THREADHEADERS@ .PHONY: maninstall libinstall inclinstall libainstall sharedinstall .PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure .PHONY: frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools -.PHONY: frameworkaltinstallunixtools recheck autoconf clean clobber distclean +.PHONY: frameworkaltinstallunixtools recheck clean clobber distclean .PHONY: smelly funny patchcheck touch altmaninstall commoninstall .PHONY: gdbhooks diff --git a/Misc/NEWS b/Misc/NEWS index f0d5a3ba2073c8..6913bfc8b722f8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,7 +10,7 @@ What's New in Python 3.6.2 release candidate 1? Core and Builtins ----------------- -- bpo-12414: sys.getsizeof() on a code object now returns the sizes +- bpo-12414: sys.getsizeof() on a code object now returns the sizes which includes the code struct and sizes of objects which it references. Patch by Dong-hee Na. @@ -116,6 +116,10 @@ Library Build ----- +- bpo-23404: Don't regenerate generated files based on file modification time + anymore: the action is now explicit. Replace ``make touch`` with + ``make regen-all``. + - bpo-29643: Fix ``--enable-optimization`` didn't work. Documentation diff --git a/Tools/hg/hgtouch.py b/Tools/hg/hgtouch.py deleted file mode 100644 index fbca469ba94c25..00000000000000 --- a/Tools/hg/hgtouch.py +++ /dev/null @@ -1,129 +0,0 @@ -"""Bring time stamps of generated checked-in files into the right order - -A versioned configuration file .hgtouch specifies generated files, in the -syntax of make rules. - - output: input1 input2 - -In addition to the dependency syntax, #-comments are supported. -""" -import errno -import os -import time - -def parse_config(repo): - try: - fp = repo.wfile(".hgtouch") - except IOError, e: - if e.errno != errno.ENOENT: - raise - return {} - result = {} - with fp: - for line in fp: - # strip comments - line = line.split('#')[0].strip() - if ':' not in line: - continue - outputs, inputs = line.split(':', 1) - outputs = outputs.split() - inputs = inputs.split() - for o in outputs: - try: - result[o].extend(inputs) - except KeyError: - result[o] = inputs - return result - -def check_rule(ui, repo, modified, basedir, output, inputs): - """Verify that the output is newer than any of the inputs. - Return (status, stamp), where status is True if the update succeeded, - and stamp is the newest time stamp assigned to any file (might be in - the future). - - If basedir is nonempty, it gives a directory in which the tree is to - be checked. - """ - f_output = repo.wjoin(os.path.join(basedir, output)) - try: - o_time = os.stat(f_output).st_mtime - except OSError: - ui.warn("Generated file %s does not exist\n" % output) - return False, 0 - youngest = 0 # youngest dependency - backdate = None - backdate_source = None - for i in inputs: - f_i = repo.wjoin(os.path.join(basedir, i)) - try: - i_time = os.stat(f_i).st_mtime - except OSError: - ui.warn(".hgtouch input file %s does not exist\n" % i) - return False, 0 - if i in modified: - # input is modified. Need to backdate at least to i_time - if backdate is None or backdate > i_time: - backdate = i_time - backdate_source = i - continue - youngest = max(i_time, youngest) - if backdate is not None: - ui.warn("Input %s for file %s locally modified\n" % (backdate_source, output)) - # set to 1s before oldest modified input - backdate -= 1 - os.utime(f_output, (backdate, backdate)) - return False, 0 - if youngest >= o_time: - ui.note("Touching %s\n" % output) - youngest += 1 - os.utime(f_output, (youngest, youngest)) - return True, youngest - else: - # Nothing to update - return True, 0 - -def do_touch(ui, repo, basedir): - if basedir: - if not os.path.isdir(repo.wjoin(basedir)): - ui.warn("Abort: basedir %r does not exist\n" % basedir) - return - modified = [] - else: - modified = repo.status()[0] - dependencies = parse_config(repo) - success = True - tstamp = 0 # newest time stamp assigned - # try processing all rules in topological order - hold_back = {} - while dependencies: - output, inputs = dependencies.popitem() - # check whether any of the inputs is generated - for i in inputs: - if i in dependencies: - hold_back[output] = inputs - continue - _success, _tstamp = check_rule(ui, repo, modified, basedir, output, inputs) - success = success and _success - tstamp = max(tstamp, _tstamp) - # put back held back rules - dependencies.update(hold_back) - hold_back = {} - now = time.time() - if tstamp > now: - # wait until real time has passed the newest time stamp, to - # avoid having files dated in the future - time.sleep(tstamp-now) - if hold_back: - ui.warn("Cyclic dependency involving %s\n" % (' '.join(hold_back.keys()))) - return False - return success - -def touch(ui, repo, basedir): - "touch generated files that are older than their sources after an update." - do_touch(ui, repo, basedir) - -cmdtable = { - "touch": (touch, - [('b', 'basedir', '', 'base dir of the tree to apply touching')], - "hg touch [-b BASEDIR]") -} diff --git a/configure b/configure index 3c611d6afa2617..97d3301f8e1891 100755 --- a/configure +++ b/configure @@ -750,9 +750,8 @@ UNIVERSALSDK CONFIG_ARGS SOVERSION VERSION -GENERATED_COMMENT PYTHON_FOR_BUILD -PYTHON_FOR_GEN +PYTHON_FOR_REGEN host_os host_vendor host_cpu @@ -2881,11 +2880,11 @@ do set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_PYTHON_FOR_GEN+:} false; then : +if ${ac_cv_prog_PYTHON_FOR_REGEN+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$PYTHON_FOR_GEN"; then - ac_cv_prog_PYTHON_FOR_GEN="$PYTHON_FOR_GEN" # Let the user override the test. + if test -n "$PYTHON_FOR_REGEN"; then + ac_cv_prog_PYTHON_FOR_REGEN="$PYTHON_FOR_REGEN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -2894,7 +2893,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_PYTHON_FOR_GEN="$ac_prog" + ac_cv_prog_PYTHON_FOR_REGEN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -2904,25 +2903,20 @@ IFS=$as_save_IFS fi fi -PYTHON_FOR_GEN=$ac_cv_prog_PYTHON_FOR_GEN -if test -n "$PYTHON_FOR_GEN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_FOR_GEN" >&5 -$as_echo "$PYTHON_FOR_GEN" >&6; } +PYTHON_FOR_REGEN=$ac_cv_prog_PYTHON_FOR_REGEN +if test -n "$PYTHON_FOR_REGEN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_FOR_REGEN" >&5 +$as_echo "$PYTHON_FOR_REGEN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi - test -n "$PYTHON_FOR_GEN" && break + test -n "$PYTHON_FOR_REGEN" && break done -test -n "$PYTHON_FOR_GEN" || PYTHON_FOR_GEN="not-found" +test -n "$PYTHON_FOR_REGEN" || PYTHON_FOR_REGEN="python3" -if test "$PYTHON_FOR_GEN" = not-found; then - PYTHON_FOR_GEN='@echo "Cannot generate $@, python not found !" && \ - echo "To skip re-generation of $@ run or ." && \ - echo "Otherwise, set python in PATH and run configure or run ." && false &&' -fi if test "$cross_compiling" = yes; then @@ -2943,18 +2937,14 @@ $as_echo_n "checking for python interpreter for cross build... " >&6; } $as_echo "$interp" >&6; } PYTHON_FOR_BUILD='_PYTHON_PROJECT_BASE=$(abs_builddir) _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(shell test -f pybuilddir.txt && echo $(abs_builddir)/`cat pybuilddir.txt`:)$(srcdir)/Lib _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata_$(ABIFLAGS)_$(MACHDEP)_$(MULTIARCH) '$interp fi - # Used to comment out stuff for rebuilding generated files - GENERATED_COMMENT='#' elif test "$cross_compiling" = maybe; then as_fn_error $? "Cross compiling required --host=HOST-TUPLE and --build=ARCH" "$LINENO" 5 else PYTHON_FOR_BUILD='./$(BUILDPYTHON) -E' - GENERATED_COMMENT='' fi - if test "$prefix" != "/"; then prefix=`echo "$prefix" | sed -e 's/\/$//g'` fi diff --git a/configure.ac b/configure.ac index eda075dc755844..8abf2f96cc45ff 100644 --- a/configure.ac +++ b/configure.ac @@ -56,13 +56,8 @@ AC_SUBST(host) # pybuilddir.txt will be created by --generate-posix-vars in the Makefile rm -f pybuilddir.txt -AC_CHECK_PROGS(PYTHON_FOR_GEN, python$PACKAGE_VERSION python3 python, not-found) -if test "$PYTHON_FOR_GEN" = not-found; then - PYTHON_FOR_GEN='@echo "Cannot generate $@, python not found !" && \ - echo "To skip re-generation of $@ run or ." && \ - echo "Otherwise, set python in PATH and run configure or run ." && false &&' -fi -AC_SUBST(PYTHON_FOR_GEN) +AC_CHECK_PROGS(PYTHON_FOR_REGEN, python$PACKAGE_VERSION python3 python, python3) +AC_SUBST(PYTHON_FOR_REGEN) if test "$cross_compiling" = yes; then AC_MSG_CHECKING([for python interpreter for cross build]) @@ -80,16 +75,12 @@ if test "$cross_compiling" = yes; then AC_MSG_RESULT($interp) PYTHON_FOR_BUILD='_PYTHON_PROJECT_BASE=$(abs_builddir) _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(shell test -f pybuilddir.txt && echo $(abs_builddir)/`cat pybuilddir.txt`:)$(srcdir)/Lib _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata_$(ABIFLAGS)_$(MACHDEP)_$(MULTIARCH) '$interp fi - # Used to comment out stuff for rebuilding generated files - GENERATED_COMMENT='#' elif test "$cross_compiling" = maybe; then AC_MSG_ERROR([Cross compiling required --host=HOST-TUPLE and --build=ARCH]) else PYTHON_FOR_BUILD='./$(BUILDPYTHON) -E' - GENERATED_COMMENT='' fi AC_SUBST(PYTHON_FOR_BUILD) -AC_SUBST(GENERATED_COMMENT) dnl Ensure that if prefix is specified, it does not end in a slash. If dnl it does, we get path names containing '//' which is both ugly and From 39b73dd5131ce205dcee3b9e24ba0fc28934d79c Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 5 May 2017 10:40:30 +0300 Subject: [PATCH 0285/2287] [3.6] bpo-30243: Fixed the possibility of a crash in _json. (GH-1420) (#1469) It was possible to get a core dump by using uninitialized _json objects. Now __new__ methods create initialized objects. __init__ methods are removed.. (cherry picked from commit 76a3e51a403bc84ed536921866c86dd7d07aaa7e) --- Misc/NEWS | 4 +++ Modules/_json.c | 86 ++++++++++++------------------------------------- 2 files changed, 24 insertions(+), 66 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 6913bfc8b722f8..0a2e5eb3977561 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,10 @@ Core and Builtins Library ------- +- bpo-30243: Removed the __init__ methods of _json's scanner and encoder. + Misusing them could cause memory leaks or crashes. Now scanner and encoder + objects are completely initialized in the __new__ methods. + - bpo-30185: Avoid KeyboardInterrupt tracebacks in forkserver helper process when Ctrl-C is received. diff --git a/Modules/_json.c b/Modules/_json.c index faa213491b6387..a84b0851090779 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -89,16 +89,12 @@ static PyObject * _build_rval_index_tuple(PyObject *rval, Py_ssize_t idx); static PyObject * scanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds); -static int -scanner_init(PyObject *self, PyObject *args, PyObject *kwds); static void scanner_dealloc(PyObject *self); static int scanner_clear(PyObject *self); static PyObject * encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds); -static int -encoder_init(PyObject *self, PyObject *args, PyObject *kwds); static void encoder_dealloc(PyObject *self); static int @@ -1203,38 +1199,21 @@ static PyObject * scanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyScannerObject *s; - s = (PyScannerObject *)type->tp_alloc(type, 0); - if (s != NULL) { - s->strict = NULL; - s->object_hook = NULL; - s->object_pairs_hook = NULL; - s->parse_float = NULL; - s->parse_int = NULL; - s->parse_constant = NULL; - } - return (PyObject *)s; -} - -static int -scanner_init(PyObject *self, PyObject *args, PyObject *kwds) -{ - /* Initialize Scanner object */ PyObject *ctx; static char *kwlist[] = {"context", NULL}; - PyScannerObject *s; - - assert(PyScanner_Check(self)); - s = (PyScannerObject *)self; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:make_scanner", kwlist, &ctx)) - return -1; + return NULL; - if (s->memo == NULL) { - s->memo = PyDict_New(); - if (s->memo == NULL) - goto bail; + s = (PyScannerObject *)type->tp_alloc(type, 0); + if (s == NULL) { + return NULL; } + s->memo = PyDict_New(); + if (s->memo == NULL) + goto bail; + /* All of these will fail "gracefully" so we don't need to verify them */ s->strict = PyObject_GetAttrString(ctx, "strict"); if (s->strict == NULL) @@ -1255,16 +1234,11 @@ scanner_init(PyObject *self, PyObject *args, PyObject *kwds) if (s->parse_constant == NULL) goto bail; - return 0; + return (PyObject *)s; bail: - Py_CLEAR(s->strict); - Py_CLEAR(s->object_hook); - Py_CLEAR(s->object_pairs_hook); - Py_CLEAR(s->parse_float); - Py_CLEAR(s->parse_int); - Py_CLEAR(s->parse_constant); - return -1; + Py_DECREF(s); + return NULL; } PyDoc_STRVAR(scanner_doc, "JSON scanner object"); @@ -1306,7 +1280,7 @@ PyTypeObject PyScannerType = { 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ - scanner_init, /* tp_init */ + 0, /* tp_init */ 0,/* PyType_GenericAlloc, */ /* tp_alloc */ scanner_new, /* tp_new */ 0,/* PyObject_GC_Del, */ /* tp_free */ @@ -1315,25 +1289,6 @@ PyTypeObject PyScannerType = { static PyObject * encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { - PyEncoderObject *s; - s = (PyEncoderObject *)type->tp_alloc(type, 0); - if (s != NULL) { - s->markers = NULL; - s->defaultfn = NULL; - s->encoder = NULL; - s->indent = NULL; - s->key_separator = NULL; - s->item_separator = NULL; - s->sort_keys = NULL; - s->skipkeys = NULL; - } - return (PyObject *)s; -} - -static int -encoder_init(PyObject *self, PyObject *args, PyObject *kwds) -{ - /* initialize Encoder object */ static char *kwlist[] = {"markers", "default", "encoder", "indent", "key_separator", "item_separator", "sort_keys", "skipkeys", "allow_nan", NULL}; PyEncoderObject *s; @@ -1341,22 +1296,23 @@ encoder_init(PyObject *self, PyObject *args, PyObject *kwds) PyObject *item_separator, *sort_keys, *skipkeys; int allow_nan; - assert(PyEncoder_Check(self)); - s = (PyEncoderObject *)self; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOOOUUOOp:make_encoder", kwlist, &markers, &defaultfn, &encoder, &indent, &key_separator, &item_separator, &sort_keys, &skipkeys, &allow_nan)) - return -1; + return NULL; if (markers != Py_None && !PyDict_Check(markers)) { PyErr_Format(PyExc_TypeError, "make_encoder() argument 1 must be dict or None, " "not %.200s", Py_TYPE(markers)->tp_name); - return -1; + return NULL; } + s = (PyEncoderObject *)type->tp_alloc(type, 0); + if (s == NULL) + return NULL; + s->markers = markers; s->defaultfn = defaultfn; s->encoder = encoder; @@ -1383,7 +1339,7 @@ encoder_init(PyObject *self, PyObject *args, PyObject *kwds) Py_INCREF(s->item_separator); Py_INCREF(s->sort_keys); Py_INCREF(s->skipkeys); - return 0; + return (PyObject *)s; } static PyObject * @@ -1914,7 +1870,7 @@ PyTypeObject PyEncoderType = { 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ - encoder_init, /* tp_init */ + 0, /* tp_init */ 0, /* tp_alloc */ encoder_new, /* tp_new */ 0, /* tp_free */ @@ -1957,10 +1913,8 @@ PyInit__json(void) PyObject *m = PyModule_Create(&jsonmodule); if (!m) return NULL; - PyScannerType.tp_new = PyType_GenericNew; if (PyType_Ready(&PyScannerType) < 0) goto fail; - PyEncoderType.tp_new = PyType_GenericNew; if (PyType_Ready(&PyEncoderType) < 0) goto fail; Py_INCREF((PyObject*)&PyScannerType); From 0fe870f3f95ba883b2b06bc0d814bdab8d53df98 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 5 May 2017 10:04:57 +0200 Subject: [PATCH 0286/2287] bpo-30264: ExpatParser closes the source on error (#1451) (#1474) ExpatParser.parse() of xml.sax.xmlreader now always closes the source: close the file object or the urllib object if source is a string (not an open file-like object). The change fixes a ResourceWarning on parsing error. Add test_parse_close_source() unit test. (cherry picked from commit ef9c0e732fc50aefbdd7c5a80e04e14b31684e66) --- Lib/test/test_sax.py | 24 ++++++++++++++++++------ Lib/xml/sax/expatreader.py | 33 ++++++++++++++++++++++----------- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/Lib/test/test_sax.py b/Lib/test/test_sax.py index 2411895d9d12b1..2eb62905ffa882 100644 --- a/Lib/test/test_sax.py +++ b/Lib/test/test_sax.py @@ -4,6 +4,7 @@ from xml.sax import make_parser, ContentHandler, \ SAXException, SAXReaderNotAvailable, SAXParseException import unittest +from unittest import mock try: make_parser() except SAXReaderNotAvailable: @@ -175,12 +176,8 @@ def test_parse_bytes(self): with self.assertRaises(SAXException): self.check_parse(BytesIO(xml_bytes(self.data, 'iso-8859-1', None))) make_xml_file(self.data, 'iso-8859-1', None) - with support.check_warnings(('unclosed file', ResourceWarning)): - # XXX Failed parser leaks an opened file. - with self.assertRaises(SAXException): - self.check_parse(TESTFN) - # Collect leaked file. - gc.collect() + with self.assertRaises(SAXException): + self.check_parse(TESTFN) with open(TESTFN, 'rb') as f: with self.assertRaises(SAXException): self.check_parse(f) @@ -194,6 +191,21 @@ def test_parse_InputSource(self): input.setEncoding('iso-8859-1') self.check_parse(input) + def test_parse_close_source(self): + builtin_open = open + fileobj = None + + def mock_open(*args): + nonlocal fileobj + fileobj = builtin_open(*args) + return fileobj + + with mock.patch('xml.sax.saxutils.open', side_effect=mock_open): + make_xml_file(self.data, 'iso-8859-1', None) + with self.assertRaises(SAXException): + self.check_parse(TESTFN) + self.assertTrue(fileobj.closed) + def check_parseString(self, s): from xml.sax import parseString result = StringIO() diff --git a/Lib/xml/sax/expatreader.py b/Lib/xml/sax/expatreader.py index 98b5ca953983c7..421358fa5bc7f0 100644 --- a/Lib/xml/sax/expatreader.py +++ b/Lib/xml/sax/expatreader.py @@ -105,9 +105,16 @@ def parse(self, source): source = saxutils.prepare_input_source(source) self._source = source - self.reset() - self._cont_handler.setDocumentLocator(ExpatLocator(self)) - xmlreader.IncrementalParser.parse(self, source) + try: + self.reset() + self._cont_handler.setDocumentLocator(ExpatLocator(self)) + xmlreader.IncrementalParser.parse(self, source) + except: + # bpo-30264: Close the source on error to not leak resources: + # xml.sax.parse() doesn't give access to the underlying parser + # to the caller + self._close_source() + raise def prepareParser(self, source): if source.getSystemId() is not None: @@ -213,6 +220,17 @@ def feed(self, data, isFinal = 0): # FIXME: when to invoke error()? self._err_handler.fatalError(exc) + def _close_source(self): + source = self._source + try: + file = source.getCharacterStream() + if file is not None: + file.close() + finally: + file = source.getByteStream() + if file is not None: + file.close() + def close(self): if (self._entity_stack or self._parser is None or isinstance(self._parser, _ClosedParser)): @@ -232,14 +250,7 @@ def close(self): parser.ErrorColumnNumber = self._parser.ErrorColumnNumber parser.ErrorLineNumber = self._parser.ErrorLineNumber self._parser = parser - try: - file = self._source.getCharacterStream() - if file is not None: - file.close() - finally: - file = self._source.getByteStream() - if file is not None: - file.close() + self._close_source() def _reset_cont_handler(self): self._parser.ProcessingInstructionHandler = \ From 70dc6a7a0b7f104d87512556fca242c2ca96a010 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 6 May 2017 15:10:50 +0300 Subject: [PATCH 0287/2287] [3.6] Revert bpo-26293 for zipfile breakage. See also bpo-29094. (GH-1484). (#1485) (cherry picked from commit 3763ea865cee5bbabcce11cd577811135e0fc747) --- Lib/zipfile.py | 27 +++++++++++++-------------- Misc/NEWS | 2 ++ 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 06eedec340bc17..9164f8ab086a16 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -1110,7 +1110,6 @@ def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=True): # set the modified flag so central directory gets written # even if no files are added to the archive self._didModify = True - self._start_disk = 0 try: self.start_dir = self.fp.tell() except (AttributeError, OSError): @@ -1136,7 +1135,7 @@ def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=True): # set the modified flag so central directory gets written # even if no files are added to the archive self._didModify = True - self.start_dir = self._start_disk = self.fp.tell() + self.start_dir = self.fp.tell() else: raise ValueError("Mode must be 'r', 'w', 'x', or 'a'") except: @@ -1180,18 +1179,17 @@ def _RealGetContents(self): offset_cd = endrec[_ECD_OFFSET] # offset of central directory self._comment = endrec[_ECD_COMMENT] # archive comment - # self._start_disk: Position of the start of ZIP archive - # It is zero, unless ZIP was concatenated to another file - self._start_disk = endrec[_ECD_LOCATION] - size_cd - offset_cd + # "concat" is zero, unless zip was concatenated to another file + concat = endrec[_ECD_LOCATION] - size_cd - offset_cd if endrec[_ECD_SIGNATURE] == stringEndArchive64: # If Zip64 extension structures are present, account for them - self._start_disk -= (sizeEndCentDir64 + sizeEndCentDir64Locator) + concat -= (sizeEndCentDir64 + sizeEndCentDir64Locator) if self.debug > 2: - inferred = self._start_disk + offset_cd - print("given, inferred, offset", offset_cd, inferred, self._start_disk) + inferred = concat + offset_cd + print("given, inferred, offset", offset_cd, inferred, concat) # self.start_dir: Position of start of central directory - self.start_dir = offset_cd + self._start_disk + self.start_dir = offset_cd + concat fp.seek(self.start_dir, 0) data = fp.read(size_cd) fp = io.BytesIO(data) @@ -1231,7 +1229,7 @@ def _RealGetContents(self): t>>11, (t>>5)&0x3F, (t&0x1F) * 2 ) x._decodeExtra() - x.header_offset = x.header_offset + self._start_disk + x.header_offset = x.header_offset + concat self.filelist.append(x) self.NameToInfo[x.filename] = x @@ -1702,10 +1700,11 @@ def _write_end_record(self): file_size = zinfo.file_size compress_size = zinfo.compress_size - header_offset = zinfo.header_offset - self._start_disk - if header_offset > ZIP64_LIMIT: - extra.append(header_offset) + if zinfo.header_offset > ZIP64_LIMIT: + extra.append(zinfo.header_offset) header_offset = 0xffffffff + else: + header_offset = zinfo.header_offset extra_data = zinfo.extra min_version = 0 @@ -1752,7 +1751,7 @@ def _write_end_record(self): # Write end-of-zip-archive record centDirCount = len(self.filelist) centDirSize = pos2 - self.start_dir - centDirOffset = self.start_dir - self._start_disk + centDirOffset = self.start_dir requires_zip64 = None if centDirCount > ZIP_FILECOUNT_LIMIT: requires_zip64 = "Files count" diff --git a/Misc/NEWS b/Misc/NEWS index 0a2e5eb3977561..6d6bdee08885c6 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,8 @@ Core and Builtins Library ------- +- Revert bpo-26293 for zipfile breakage. See also bpo-29094. + - bpo-30243: Removed the __init__ methods of _json's scanner and encoder. Misusing them could cause memory leaks or crashes. Now scanner and encoder objects are completely initialized in the __new__ methods. From 410d75ab71e2db0fdc8b2016600a3d3d4830f38e Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Tue, 9 May 2017 10:56:30 +0800 Subject: [PATCH 0288/2287] bpo-30289: remove Misc/python-config.sh when make distclean (#1498) (#1506) --- Makefile.pre.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 6e3a82f95df06d..2e4dd3b3ceb481 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1630,7 +1630,8 @@ distclean: clobber done -rm -f core Makefile Makefile.pre config.status \ Modules/Setup Modules/Setup.local Modules/Setup.config \ - Modules/ld_so_aix Modules/python.exp Misc/python.pc + Modules/ld_so_aix Modules/python.exp Misc/python.pc \ + Misc/python-config.sh -rm -f python*-gdb.py # Issue #28258: set LC_ALL to avoid issues with Estonian locale. # Expansion is performed here by shell (spawned by make) itself before From 72e1b61da0920c5607481304879e039b63e2a3d5 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Tue, 9 May 2017 12:16:50 +0800 Subject: [PATCH 0289/2287] bpo-29990: Fix range checking in GB18030 decoder (#1495) (#1507) When decoding a 4-byte GB18030 sequence, the first and third byte cannot exceed 0xFE. --- Lib/test/test_codecencodings_cn.py | 6 ++++++ Misc/NEWS | 2 ++ Modules/cjkcodecs/_codecs_cn.c | 4 +++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_codecencodings_cn.py b/Lib/test/test_codecencodings_cn.py index 3bdf7d0e14b3b7..c8a410c2e0398c 100644 --- a/Lib/test/test_codecencodings_cn.py +++ b/Lib/test/test_codecencodings_cn.py @@ -48,6 +48,12 @@ class Test_GB18030(multibytecodec_support.TestBase, unittest.TestCase): (b"abc\x84\x32\x80\x80def", "replace", 'abc\ufffd2\ufffd\ufffddef'), (b"abc\x81\x30\x81\x30def", "strict", 'abc\x80def'), (b"abc\x86\x30\x81\x30def", "replace", 'abc\ufffd0\ufffd0def'), + # issue29990 + (b"\xff\x30\x81\x30", "strict", None), + (b"\x81\x30\xff\x30", "strict", None), + (b"abc\x81\x39\xff\x39\xc1\xc4", "replace", "abc\ufffd\x39\ufffd\x39\u804a"), + (b"abc\xab\x36\xff\x30def", "replace", 'abc\ufffd\x36\ufffd\x30def'), + (b"abc\xbf\x38\xff\x32\xc1\xc4", "ignore", "abc\x38\x32\u804a"), ) has_iso10646 = True diff --git a/Misc/NEWS b/Misc/NEWS index 6d6bdee08885c6..255942d7ca47e7 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,8 @@ Core and Builtins Library ------- +- bpo-29990: Fix range checking in GB18030 decoder. Original patch by Ma Lin. + - Revert bpo-26293 for zipfile breakage. See also bpo-29094. - bpo-30243: Removed the __init__ methods of _json's scanner and encoder. diff --git a/Modules/cjkcodecs/_codecs_cn.c b/Modules/cjkcodecs/_codecs_cn.c index 1a070f2f393219..bda175c55d1323 100644 --- a/Modules/cjkcodecs/_codecs_cn.c +++ b/Modules/cjkcodecs/_codecs_cn.c @@ -279,7 +279,9 @@ DECODER(gb18030) REQUIRE_INBUF(4); c3 = INBYTE3; c4 = INBYTE4; - if (c < 0x81 || c3 < 0x81 || c4 < 0x30 || c4 > 0x39) + if (c < 0x81 || c > 0xFE || + c3 < 0x81 || c3 > 0xFE || + c4 < 0x30 || c4 > 0x39) return 1; c -= 0x81; c2 -= 0x30; c3 -= 0x81; c4 -= 0x30; From 03b8a378dfa46372b96790f82c85e9b72518f1bf Mon Sep 17 00:00:00 2001 From: torsava Date: Tue, 9 May 2017 16:05:10 +0200 Subject: [PATCH 0290/2287] [3.6] bpo-29243: Fix Makefile with respect to --enable-optimizations (GH-1478) (#1518) * bpo-29243: Fix Makefile with respect to --enable-optimizations (#1478) * bpo-29243: Fix Makefile with respect to --enable-optimizations When using the Profile Guided Optimization (./configure --enable-optimizations) Python is built not only during `make` but rebuilt again during `make test`, `make install` and others. This patch fixes the issue. Note that this fix produces no change at all in the Makefile if configure is run witout --enable-optimizations. * !squash (cherry picked from commit a1054c3b0037d4c2a5492e79fc193f36245366c7) * [3.6] bpo-29243: Fix Makefile with respect to --enable-optimizations (GH-1478) * bpo-29243: Fix Makefile with respect to --enable-optimizations When using the Profile Guided Optimization (./configure --enable-optimizations) Python is built not only during `make` but rebuilt again during `make test`, `make install` and others. This patch fixes the issue. Note that this fix produces no change at all in the Makefile if configure is run witout --enable-optimizations. * !squash. (cherry picked from commit a1054c3b0037d4c2a5492e79fc193f36245366c7) --- Makefile.pre.in | 14 +++++++------- Misc/ACKS | 1 + Misc/NEWS | 4 ++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 2e4dd3b3ceb481..076fb446310d81 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1002,7 +1002,7 @@ TESTTIMEOUT= 1200 # Run a basic set of regression tests. # This excludes some tests that are particularly resource-intensive. -test: all platform +test: @DEF_MAKE_RULE@ platform $(TESTRUNNER) $(TESTOPTS) # Run the full test suite twice - once without .pyc files, and once with. @@ -1012,7 +1012,7 @@ test: all platform # the bytecode read from a .pyc file had the bug, sometimes the directly # generated bytecode. This is sometimes a very shy bug needing a lot of # sample data. -testall: all platform +testall: @DEF_MAKE_RULE@ platform -find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f $(TESTPYTHON) -E $(srcdir)/Lib/compileall.py -find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f @@ -1021,7 +1021,7 @@ testall: all platform # Run the test suite for both architectures in a Universal build on OSX. # Must be run on an Intel box. -testuniversal: all platform +testuniversal: @DEF_MAKE_RULE@ platform if [ `arch` != 'i386' ];then \ echo "This can only be used on OSX/i386" ;\ exit 1 ;\ @@ -1044,7 +1044,7 @@ QUICKTESTOPTS= $(TESTOPTS) -x test_subprocess test_io test_lib2to3 \ test_multiprocessing_forkserver \ test_mailbox test_socket test_poll \ test_select test_zipfile test_concurrent_futures -quicktest: all platform +quicktest: @DEF_MAKE_RULE@ platform $(TESTRUNNER) $(QUICKTESTOPTS) @@ -1381,7 +1381,7 @@ LIBPL= @LIBPL@ # pkgconfig directory LIBPC= $(LIBDIR)/pkgconfig -libainstall: all python-config +libainstall: @DEF_MAKE_RULE@ python-config @for i in $(LIBDIR) $(LIBPL) $(LIBPC); \ do \ if test ! -d $(DESTDIR)$$i; then \ @@ -1644,7 +1644,7 @@ distclean: clobber -exec rm -f {} ';' # Check for smelly exported symbols (not starting with Py/_Py) -smelly: all +smelly: @DEF_MAKE_RULE@ nm -p $(LIBRARY) | \ sed -n "/ [TDB] /s/.* //p" | grep -v "^_*Py" | sort -u; \ @@ -1681,7 +1681,7 @@ funny: -o -print # Perform some verification checks on any modified files. -patchcheck: all +patchcheck: @DEF_MAKE_RULE@ $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/patchcheck.py # Dependencies diff --git a/Misc/ACKS b/Misc/ACKS index ac2c4edc733576..b38a1fe05fa76f 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1114,6 +1114,7 @@ Jason Orendorff Douglas Orr William Orr Michele Orrù +Tomáš Orsava Oleg Oshmyan Denis S. Otkidach Peter Otten diff --git a/Misc/NEWS b/Misc/NEWS index 255942d7ca47e7..64974ef2eb2260 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -124,6 +124,10 @@ Library Build ----- +- bpo-29243: Prevent unnecessary rebuilding of Python during ``make test``, + ``make install`` and some other make targets when configured with + ``--enable-optimizations``. + - bpo-23404: Don't regenerate generated files based on file modification time anymore: the action is now explicit. Replace ``make touch`` with ``make regen-all``. From 418d60a52579b6847776db3e354a8660b26dc752 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 10 May 2017 06:44:02 +0300 Subject: [PATCH 0291/2287] [3.6] bpo-30298: Weaken the condition of deprecation warnings for inline modifiers. (GH-1490) (#1525) Now allowed several subsequential inline modifiers at the start of the pattern (e.g. '(?i)(?s)...'). In verbose mode whitespaces and comments now are allowed before and between inline modifiers (e.g. '(?x) (?i) (?s)...').. (cherry picked from commit 305ccbe27ea5ba82fd2d8c32ec739f980e524330) --- Lib/sre_parse.py | 12 ++++----- Lib/test/test_re.py | 59 ++++++++++++++++++++++++++++++++++----------- Misc/NEWS | 6 +++++ 3 files changed, 56 insertions(+), 21 deletions(-) diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py index 6aa49c3bf6f8ed..e1c749634b71fe 100644 --- a/Lib/sre_parse.py +++ b/Lib/sre_parse.py @@ -412,7 +412,7 @@ def _parse_sub(source, state, verbose, nested=True): sourcematch = source.match start = source.tell() while True: - itemsappend(_parse(source, state, verbose)) + itemsappend(_parse(source, state, verbose, not nested and not items)) if not sourcematch("|"): break @@ -466,7 +466,7 @@ def _parse_sub_cond(source, state, condgroup, verbose): subpattern.append((GROUPREF_EXISTS, (condgroup, item_yes, item_no))) return subpattern -def _parse(source, state, verbose): +def _parse(source, state, verbose, first=False): # parse a simple pattern subpattern = SubPattern(state) @@ -730,10 +730,9 @@ def _parse(source, state, verbose): state.checklookbehindgroup(condgroup, source) elif char in FLAGS or char == "-": # flags - pos = source.pos flags = _parse_flags(source, state, char) if flags is None: # global flags - if pos != 3: # "(?x" + if not first or subpattern: import warnings warnings.warn( 'Flags not at the start of the expression %s%s' % ( @@ -742,6 +741,8 @@ def _parse(source, state, verbose): ), DeprecationWarning, stacklevel=7 ) + if (state.flags & SRE_FLAG_VERBOSE) and not verbose: + raise Verbose continue add_flags, del_flags = flags group = None @@ -795,9 +796,6 @@ def _parse_flags(source, state, char): msg = "unknown flag" if char.isalpha() else "missing -, : or )" raise source.error(msg, len(char)) if char == ")": - if ((add_flags & SRE_FLAG_VERBOSE) and - not (state.flags & SRE_FLAG_VERBOSE)): - raise Verbose state.flags |= add_flags return None if add_flags & GLOBAL_FLAGS: diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index b945cf094e99c1..c52417ba000ebc 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1303,32 +1303,43 @@ def test_inline_flags(self): upper_char = '\u1ea0' # Latin Capital Letter A with Dot Below lower_char = '\u1ea1' # Latin Small Letter A with Dot Below - p = re.compile(upper_char, re.I | re.U) - q = p.match(lower_char) + p = re.compile('.' + upper_char, re.I | re.S) + q = p.match('\n' + lower_char) self.assertTrue(q) - p = re.compile(lower_char, re.I | re.U) - q = p.match(upper_char) + p = re.compile('.' + lower_char, re.I | re.S) + q = p.match('\n' + upper_char) self.assertTrue(q) - p = re.compile('(?i)' + upper_char, re.U) - q = p.match(lower_char) + p = re.compile('(?i).' + upper_char, re.S) + q = p.match('\n' + lower_char) self.assertTrue(q) - p = re.compile('(?i)' + lower_char, re.U) - q = p.match(upper_char) + p = re.compile('(?i).' + lower_char, re.S) + q = p.match('\n' + upper_char) self.assertTrue(q) - p = re.compile('(?iu)' + upper_char) - q = p.match(lower_char) + p = re.compile('(?is).' + upper_char) + q = p.match('\n' + lower_char) self.assertTrue(q) - p = re.compile('(?iu)' + lower_char) - q = p.match(upper_char) + p = re.compile('(?is).' + lower_char) + q = p.match('\n' + upper_char) self.assertTrue(q) - self.assertTrue(re.match('(?ixu) ' + upper_char, lower_char)) - self.assertTrue(re.match('(?ixu) ' + lower_char, upper_char)) + p = re.compile('(?s)(?i).' + upper_char) + q = p.match('\n' + lower_char) + self.assertTrue(q) + + p = re.compile('(?s)(?i).' + lower_char) + q = p.match('\n' + upper_char) + self.assertTrue(q) + + self.assertTrue(re.match('(?ix) ' + upper_char, lower_char)) + self.assertTrue(re.match('(?ix) ' + lower_char, upper_char)) + self.assertTrue(re.match(' (?i) ' + upper_char, lower_char, re.X)) + self.assertTrue(re.match('(?x) (?i) ' + upper_char, lower_char)) + self.assertTrue(re.match(' (?x) (?i) ' + upper_char, lower_char, re.X)) p = upper_char + '(?i)' with self.assertWarns(DeprecationWarning) as warns: @@ -1346,6 +1357,26 @@ def test_inline_flags(self): 'Flags not at the start of the expression %s (truncated)' % p[:20] ) + with self.assertWarns(DeprecationWarning): + self.assertTrue(re.match('(?s).(?i)' + upper_char, '\n' + lower_char)) + with self.assertWarns(DeprecationWarning): + self.assertTrue(re.match('(?i) ' + upper_char + ' (?x)', lower_char)) + with self.assertWarns(DeprecationWarning): + self.assertTrue(re.match(' (?x) (?i) ' + upper_char, lower_char)) + with self.assertWarns(DeprecationWarning): + self.assertTrue(re.match('^(?i)' + upper_char, lower_char)) + with self.assertWarns(DeprecationWarning): + self.assertTrue(re.match('$|(?i)' + upper_char, lower_char)) + with self.assertWarns(DeprecationWarning): + self.assertTrue(re.match('(?:(?i)' + upper_char + ')', lower_char)) + with self.assertWarns(DeprecationWarning): + self.assertTrue(re.fullmatch('(^)?(?(1)(?i)' + upper_char + ')', + lower_char)) + with self.assertWarns(DeprecationWarning): + self.assertTrue(re.fullmatch('($)?(?(1)|(?i)' + upper_char + ')', + lower_char)) + + def test_dollar_matches_twice(self): "$ matches the end of string, and just before the terminating \n" pattern = re.compile('$') diff --git a/Misc/NEWS b/Misc/NEWS index 64974ef2eb2260..e7090fc17840ab 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,12 @@ Core and Builtins Library ------- +- bpo-30298: Weaken the condition of deprecation warnings for inline modifiers. + Now allowed several subsequential inline modifiers at the start of the + pattern (e.g. ``'(?i)(?s)...'``). In verbose mode whitespaces and comments + now are allowed before and between inline modifiers (e.g. + ``'(?x) (?i) (?s)...'``). + - bpo-29990: Fix range checking in GB18030 decoder. Original patch by Ma Lin. - Revert bpo-26293 for zipfile breakage. See also bpo-29094. From 81ed53784608d44a8d196ad52288b55c7bf665db Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 10 May 2017 08:47:22 +0200 Subject: [PATCH 0292/2287] bpo-30320: test_eintr now uses pthread_sigmask() (#1523) (#1524) Rewrite sigwaitinfo() and sigtimedwait() unit tests for EINTR using pthread_sigmask() to fix a race condition between the child and the parent process. Remove the pipe which was used as a weak workaround against the race condition. sigtimedwait() is now tested with a child process sending a signal instead of testing the timeout feature which is more unstable (especially regarding to clock resolution depending on the platform). (cherry picked from commit 211a392cc15f9a7b1b8ce65d8f6c9f8237d1b77f) --- Lib/test/eintrdata/eintr_tester.py | 56 ++++++++++++++---------------- 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/Lib/test/eintrdata/eintr_tester.py b/Lib/test/eintrdata/eintr_tester.py index c619b3d6c38a59..1dbe88efe70ffd 100644 --- a/Lib/test/eintrdata/eintr_tester.py +++ b/Lib/test/eintrdata/eintr_tester.py @@ -371,59 +371,55 @@ def test_sleep(self): @unittest.skipUnless(hasattr(signal, "setitimer"), "requires setitimer()") +# bpo-30320: Need pthread_sigmask() to block the signal, otherwise the test +# is vulnerable to a race condition between the child and the parent processes. +@unittest.skipUnless(hasattr(signal, 'pthread_sigmask'), + 'need signal.pthread_sigmask()') class SignalEINTRTest(EINTRBaseTest): """ EINTR tests for the signal module. """ - @unittest.skipUnless(hasattr(signal, 'sigtimedwait'), - 'need signal.sigtimedwait()') - def test_sigtimedwait(self): - t0 = time.monotonic() - signal.sigtimedwait([signal.SIGUSR1], self.sleep_time) - dt = time.monotonic() - t0 - self.assertGreaterEqual(dt, self.sleep_time) - - @unittest.skipUnless(hasattr(signal, 'sigwaitinfo'), - 'need signal.sigwaitinfo()') - def test_sigwaitinfo(self): - # Issue #25277, #25868: give a few milliseconds to the parent process - # between os.write() and signal.sigwaitinfo() to works around a race - # condition - self.sleep_time = 0.100 - + def check_sigwait(self, wait_func): signum = signal.SIGUSR1 pid = os.getpid() old_handler = signal.signal(signum, lambda *args: None) self.addCleanup(signal.signal, signum, old_handler) - rpipe, wpipe = os.pipe() - code = '\n'.join(( 'import os, time', 'pid = %s' % os.getpid(), 'signum = %s' % int(signum), 'sleep_time = %r' % self.sleep_time, - 'rpipe = %r' % rpipe, - 'os.read(rpipe, 1)', - 'os.close(rpipe)', 'time.sleep(sleep_time)', 'os.kill(pid, signum)', )) + old_mask = signal.pthread_sigmask(signal.SIG_BLOCK, [signum]) + self.addCleanup(signal.pthread_sigmask, signal.SIG_UNBLOCK, [signum]) + t0 = time.monotonic() - proc = self.subprocess(code, pass_fds=(rpipe,)) - os.close(rpipe) + proc = self.subprocess(code) with kill_on_error(proc): - # sync child-parent - os.write(wpipe, b'x') - os.close(wpipe) + wait_func(signum) + dt = time.monotonic() - t0 + + self.assertEqual(proc.wait(), 0) - # parent + @unittest.skipUnless(hasattr(signal, 'sigwaitinfo'), + 'need signal.sigwaitinfo()') + def test_sigwaitinfo(self): + def wait_func(signum): signal.sigwaitinfo([signum]) - dt = time.monotonic() - t0 - self.assertEqual(proc.wait(), 0) - self.assertGreaterEqual(dt, self.sleep_time) + self.check_sigwait(wait_func) + + @unittest.skipUnless(hasattr(signal, 'sigtimedwait'), + 'need signal.sigwaitinfo()') + def test_sigtimedwait(self): + def wait_func(signum): + signal.sigtimedwait([signum], 120.0) + + self.check_sigwait(wait_func) @unittest.skipUnless(hasattr(signal, "setitimer"), "requires setitimer()") From 98b49a00d413972965044fd355be3b8482caa07c Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Wed, 10 May 2017 19:00:15 +0800 Subject: [PATCH 0293/2287] bpo-30281: Fix the default value for stop in PySlice_Unpack() (#1480) (#1529) --- Objects/sliceobject.c | 8 +++++--- Python/ceval.c | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c index 6a690213d14518..4e4b32d32441a8 100644 --- a/Objects/sliceobject.c +++ b/Objects/sliceobject.c @@ -197,6 +197,8 @@ PySlice_Unpack(PyObject *_r, PySliceObject *r = (PySliceObject*)_r; /* this is harder to get right than you might think */ + Py_BUILD_ASSERT(PY_SSIZE_T_MIN + 1 <= -PY_SSIZE_T_MAX); + if (r->step == Py_None) { *step = 1; } @@ -217,14 +219,14 @@ PySlice_Unpack(PyObject *_r, } if (r->start == Py_None) { - *start = *step < 0 ? PY_SSIZE_T_MAX-1 : 0;; + *start = *step < 0 ? PY_SSIZE_T_MAX : 0; } else { if (!_PyEval_SliceIndex(r->start, start)) return -1; } if (r->stop == Py_None) { - *stop = *step < 0 ? -PY_SSIZE_T_MAX : PY_SSIZE_T_MAX; + *stop = *step < 0 ? PY_SSIZE_T_MIN : PY_SSIZE_T_MAX; } else { if (!_PyEval_SliceIndex(r->stop, stop)) return -1; @@ -258,7 +260,7 @@ PySlice_AdjustIndices(Py_ssize_t length, *stop = (step < 0) ? -1 : 0; } } - else if (*stop >= length) { + else if (*stop >= length) { *stop = (step < 0) ? length - 1 : length; } diff --git a/Python/ceval.c b/Python/ceval.c index bce86ab12cf2fb..5dc0444a1acf5c 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5071,7 +5071,7 @@ do_call_core(PyObject *func, PyObject *callargs, PyObject *kwdict) /* Extract a slice index from a PyLong or an object with the nb_index slot defined, and store in *pi. Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX, - and silently boost values less than -PY_SSIZE_T_MAX-1 to -PY_SSIZE_T_MAX-1. + and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN. Return 0 on error, 1 on success. */ int From a4465a5bd08f232cf097893006118c82975c3402 Mon Sep 17 00:00:00 2001 From: stratakis Date: Thu, 11 May 2017 13:13:18 +0200 Subject: [PATCH 0294/2287] [3.6] bpo-28787: Fix out of tree --with-dtrace builds (GH-135) (#1543) * bpo-28787: Fix out of tree --with-dtrace builds * Unsilence directory creation * Add Misc/NEWS and Misc/ACKS entries. (cherry picked from commit f6eae5bf1c5d7b83e5d5bdbecfff928e478c1cfd) --- Makefile.pre.in | 1 + Misc/ACKS | 1 + Misc/NEWS | 3 +++ 3 files changed, 5 insertions(+) diff --git a/Makefile.pre.in b/Makefile.pre.in index 076fb446310d81..82e830727ef849 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -875,6 +875,7 @@ Python/frozen.o: $(srcdir)/Python/importlib.h $(srcdir)/Python/importlib_externa # follow our naming conventions. dtrace(1) uses the output filename to generate # an include guard, so we can't use a pipeline to transform its output. Include/pydtrace_probes.h: $(srcdir)/Include/pydtrace.d + $(MKDIR_P) Include $(DTRACE) $(DFLAGS) -o $@ -h -s $< : sed in-place edit with POSIX-only tools sed 's/PYTHON_/PyDTrace_/' $@ > $@.tmp diff --git a/Misc/ACKS b/Misc/ACKS index b38a1fe05fa76f..486b6e32850b88 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1476,6 +1476,7 @@ Daniel Stokes Michael Stone Serhiy Storchaka Ken Stox +Charalampos Stratakis Dan Stromberg Donald Stufft Daniel Stutzbach diff --git a/Misc/NEWS b/Misc/NEWS index e7090fc17840ab..58b8d262ecfee1 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -130,6 +130,9 @@ Library Build ----- +- bpo-28787: Fix out-of-tree builds of Python when configured with + ``--with--dtrace``. + - bpo-29243: Prevent unnecessary rebuilding of Python during ``make test``, ``make install`` and some other make targets when configured with ``--enable-optimizations``. From 3dc7c52a9f4fb83be3e26e31e2c7cd9dc1cb41a2 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Thu, 11 May 2017 21:56:42 +0900 Subject: [PATCH 0295/2287] bpo-30048: asyncio: fix Task.cancel() was ignored. (GH-1546) when there are no more `await` or `yield (from)` before return in coroutine, cancel was ignored. example: async def coro(): asyncio.Task.current_task().cancel() return 42 ... res = await coro() # should raise CancelledError (cherry picked from commit 991adca012f5e106c2d4040ce619c696ba6f9c46) --- Lib/asyncio/tasks.py | 7 ++++++- Lib/test/test_asyncio/test_tasks.py | 18 ++++++++++++++++++ Misc/NEWS | 3 +++ Modules/_asynciomodule.c | 12 ++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index f91e70aecbad94..d7867d128a8afe 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -180,7 +180,12 @@ def _step(self, exc=None): else: result = coro.throw(exc) except StopIteration as exc: - self.set_result(exc.value) + if self._must_cancel: + # Task is cancelled right before coro stops. + self._must_cancel = False + self.set_exception(futures.CancelledError()) + else: + self.set_result(exc.value) except futures.CancelledError: super().cancel() # I.e., Future.cancel(self). except Exception as exc: diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 4f05319457985a..5462c80ad3013a 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -588,6 +588,24 @@ def task(): self.assertFalse(t._must_cancel) # White-box test. self.assertFalse(t.cancel()) + def test_cancel_at_end(self): + """coroutine end right after task is cancelled""" + loop = asyncio.new_event_loop() + self.set_event_loop(loop) + + @asyncio.coroutine + def task(): + t.cancel() + self.assertTrue(t._must_cancel) # White-box test. + return 12 + + t = self.new_task(loop, task()) + self.assertRaises( + asyncio.CancelledError, loop.run_until_complete, t) + self.assertTrue(t.done()) + self.assertFalse(t._must_cancel) # White-box test. + self.assertFalse(t.cancel()) + def test_stop_while_run_in_complete(self): def gen(): diff --git a/Misc/NEWS b/Misc/NEWS index 58b8d262ecfee1..b6b405446f6c7e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,9 @@ Core and Builtins Library ------- +- bpo-30048: Fixed ``Task.cancel()`` can be ignored when the task is + running coroutine and the coroutine returned without any more ``await``. + - bpo-30298: Weaken the condition of deprecation warnings for inline modifiers. Now allowed several subsequential inline modifiers at the start of the pattern (e.g. ``'(?i)(?s)...'``). In verbose mode whitespaces and comments diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index a77ff9689e4705..75327fa3014be9 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -1984,6 +1984,16 @@ task_step_impl(TaskObj *task, PyObject *exc) if (_PyGen_FetchStopIterationValue(&o) == 0) { /* The error is StopIteration and that means that the underlying coroutine has resolved */ + if (task->task_must_cancel) { + // Task is cancelled right before coro stops. + Py_DECREF(o); + task->task_must_cancel = 0; + et = asyncio_CancelledError; + Py_INCREF(et); + ev = NULL; + tb = NULL; + goto set_exception; + } PyObject *res = future_set_result((FutureObj*)task, o); Py_DECREF(o); if (res == NULL) { @@ -2001,6 +2011,8 @@ task_step_impl(TaskObj *task, PyObject *exc) /* Some other exception; pop it and call Task.set_exception() */ PyErr_Fetch(&et, &ev, &tb); + +set_exception: assert(et); if (!ev || !PyObject_TypeCheck(ev, (PyTypeObject *) et)) { PyErr_NormalizeException(&et, &ev, &tb); From d05f7fdf6cf77724bd3064fb5a0846ef5cfe0c88 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 13 May 2017 00:21:50 +0200 Subject: [PATCH 0296/2287] [3.6] bpo-30345: Update test_gdb.py and python-gdb.py from master (#1549) * python-gdb.py supports method-wrapper bpo-29367: python-gdb.py now supports also method-wrapper (wrapperobject) objects. (cherry picked from commit 611083331d534481ca7956a376e38fb0e9ef3854) * Update and enhance python-gdb.py bpo-29259: Detect PyCFunction is the current frame, not only in the older frame. --- Lib/test/test_gdb.py | 22 +++++++++++++-- Misc/NEWS | 6 ++++ Tools/gdb/libpython.py | 64 ++++++++++++++++++++++++++++++++++-------- 3 files changed, 78 insertions(+), 14 deletions(-) diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py index 60f1d92846744d..b7554d698c9d6c 100644 --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -3,13 +3,14 @@ # The code for testing gdb was adapted from similar work in Unladen Swallow's # Lib/test/test_jit_gdb.py +import locale import os import re import subprocess import sys import sysconfig +import textwrap import unittest -import locale # Is this Python configured to support threads? try: @@ -845,7 +846,24 @@ def test_pycfunction(self): breakpoint='time_gmtime', cmds_after_breakpoint=['py-bt-full'], ) - self.assertIn('#0 ' + + def safe_tp_name(self): + try: + return self.field('self')['ob_type']['tp_name'].string() + except (NullPyObjectPtr, RuntimeError): + return '' + + def safe_self_addresss(self): + try: + address = long(self.field('self')) + return '%#x' % address + except (NullPyObjectPtr, RuntimeError): + return '' + + def proxyval(self, visited): + name = self.safe_name() + tp_name = self.safe_tp_name() + self_address = self.safe_self_addresss() + return ("" + % (name, tp_name, self_address)) + + def write_repr(self, out, visited): + proxy = self.proxyval(visited) + out.write(proxy) def int_from_int(gdbval): @@ -1364,11 +1398,13 @@ def to_string (self): def pretty_printer_lookup(gdbval): type = gdbval.type.unqualified() - if type.code == gdb.TYPE_CODE_PTR: - type = type.target().unqualified() - t = str(type) - if t in ("PyObject", "PyFrameObject", "PyUnicodeObject"): - return PyObjectPtrPrinter(gdbval) + if type.code != gdb.TYPE_CODE_PTR: + return None + + type = type.target().unqualified() + t = str(type) + if t in ("PyObject", "PyFrameObject", "PyUnicodeObject", "wrapperobject"): + return PyObjectPtrPrinter(gdbval) """ During development, I've been manually invoking the code in this way: @@ -1497,11 +1533,8 @@ def is_other_python_frame(self): return 'Garbage-collecting' # Detect invocations of PyCFunction instances: - older = self.older() - if not older: - return False - - caller = older._gdbframe.name() + frame = self._gdbframe + caller = frame.name() if not caller: return False @@ -1513,18 +1546,25 @@ def is_other_python_frame(self): # "self" is the (PyObject*) of the 'self' try: # Use the prettyprinter for the func: - func = older._gdbframe.read_var('func') + func = frame.read_var('func') return str(func) except RuntimeError: return 'PyCFunction invocation (unable to read "func")' elif caller == '_PyCFunction_FastCallDict': try: - func = older._gdbframe.read_var('func_obj') + func = frame.read_var('func_obj') return str(func) except RuntimeError: return 'PyCFunction invocation (unable to read "func_obj")' + if caller == 'wrapper_call': + try: + func = frame.read_var('wp') + return str(func) + except RuntimeError: + return '' + # This frame isn't worth reporting: return False From 3a66ab8695e9ba969ff6bdd8c91f88138c8b5187 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 13 May 2017 09:42:39 -0700 Subject: [PATCH 0297/2287] [3.6] bpo-30178: Indent methods and attributes of MimeType class (GH-1306) (#1570) (cherry picked from commit c71168090df435c1eb8c03005b11df764cd7ebd6) --- Doc/library/mimetypes.rst | 86 +++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/Doc/library/mimetypes.rst b/Doc/library/mimetypes.rst index 464248c3ea7990..67b7a7178534d3 100644 --- a/Doc/library/mimetypes.rst +++ b/Doc/library/mimetypes.rst @@ -186,78 +186,78 @@ than one MIME-type database; it provides an interface similar to the one of the loaded "on top" of the default database. -.. attribute:: MimeTypes.suffix_map + .. attribute:: MimeTypes.suffix_map - Dictionary mapping suffixes to suffixes. This is used to allow recognition of - encoded files for which the encoding and the type are indicated by the same - extension. For example, the :file:`.tgz` extension is mapped to :file:`.tar.gz` - to allow the encoding and type to be recognized separately. This is initially a - copy of the global :data:`suffix_map` defined in the module. + Dictionary mapping suffixes to suffixes. This is used to allow recognition of + encoded files for which the encoding and the type are indicated by the same + extension. For example, the :file:`.tgz` extension is mapped to :file:`.tar.gz` + to allow the encoding and type to be recognized separately. This is initially a + copy of the global :data:`suffix_map` defined in the module. -.. attribute:: MimeTypes.encodings_map + .. attribute:: MimeTypes.encodings_map - Dictionary mapping filename extensions to encoding types. This is initially a - copy of the global :data:`encodings_map` defined in the module. + Dictionary mapping filename extensions to encoding types. This is initially a + copy of the global :data:`encodings_map` defined in the module. -.. attribute:: MimeTypes.types_map + .. attribute:: MimeTypes.types_map - Tuple containing two dictionaries, mapping filename extensions to MIME types: - the first dictionary is for the non-standards types and the second one is for - the standard types. They are initialized by :data:`common_types` and - :data:`types_map`. + Tuple containing two dictionaries, mapping filename extensions to MIME types: + the first dictionary is for the non-standards types and the second one is for + the standard types. They are initialized by :data:`common_types` and + :data:`types_map`. -.. attribute:: MimeTypes.types_map_inv + .. attribute:: MimeTypes.types_map_inv - Tuple containing two dictionaries, mapping MIME types to a list of filename - extensions: the first dictionary is for the non-standards types and the - second one is for the standard types. They are initialized by - :data:`common_types` and :data:`types_map`. + Tuple containing two dictionaries, mapping MIME types to a list of filename + extensions: the first dictionary is for the non-standards types and the + second one is for the standard types. They are initialized by + :data:`common_types` and :data:`types_map`. -.. method:: MimeTypes.guess_extension(type, strict=True) + .. method:: MimeTypes.guess_extension(type, strict=True) - Similar to the :func:`guess_extension` function, using the tables stored as part - of the object. + Similar to the :func:`guess_extension` function, using the tables stored as part + of the object. -.. method:: MimeTypes.guess_type(url, strict=True) + .. method:: MimeTypes.guess_type(url, strict=True) - Similar to the :func:`guess_type` function, using the tables stored as part of - the object. + Similar to the :func:`guess_type` function, using the tables stored as part of + the object. -.. method:: MimeTypes.guess_all_extensions(type, strict=True) + .. method:: MimeTypes.guess_all_extensions(type, strict=True) - Similar to the :func:`guess_all_extensions` function, using the tables stored - as part of the object. + Similar to the :func:`guess_all_extensions` function, using the tables stored + as part of the object. -.. method:: MimeTypes.read(filename, strict=True) + .. method:: MimeTypes.read(filename, strict=True) - Load MIME information from a file named *filename*. This uses :meth:`readfp` to - parse the file. + Load MIME information from a file named *filename*. This uses :meth:`readfp` to + parse the file. - If *strict* is ``True``, information will be added to list of standard types, - else to the list of non-standard types. + If *strict* is ``True``, information will be added to list of standard types, + else to the list of non-standard types. -.. method:: MimeTypes.readfp(fp, strict=True) + .. method:: MimeTypes.readfp(fp, strict=True) - Load MIME type information from an open file *fp*. The file must have the format of - the standard :file:`mime.types` files. + Load MIME type information from an open file *fp*. The file must have the format of + the standard :file:`mime.types` files. - If *strict* is ``True``, information will be added to the list of standard - types, else to the list of non-standard types. + If *strict* is ``True``, information will be added to the list of standard + types, else to the list of non-standard types. -.. method:: MimeTypes.read_windows_registry(strict=True) + .. method:: MimeTypes.read_windows_registry(strict=True) - Load MIME type information from the Windows registry. Availability: Windows. + Load MIME type information from the Windows registry. Availability: Windows. - If *strict* is ``True``, information will be added to the list of standard - types, else to the list of non-standard types. + If *strict* is ``True``, information will be added to the list of standard + types, else to the list of non-standard types. - .. versionadded:: 3.2 + .. versionadded:: 3.2 From 178756c15da0652b30b55b41f0bb939b61c66513 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Sat, 13 May 2017 13:51:24 -0700 Subject: [PATCH 0298/2287] [3.6] Move Codecov's configuration file under .github (GH-1494) (GH-1574) (cherry picked from commit cbddf58c797f850a5b06f317a4bb7ab69c6e9715) --- .codecov.yml => .github/codecov.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .codecov.yml => .github/codecov.yml (100%) diff --git a/.codecov.yml b/.github/codecov.yml similarity index 100% rename from .codecov.yml rename to .github/codecov.yml From 61b6e5cf929a80bb44500fb1a212facf66d7f45c Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Sun, 14 May 2017 18:30:48 +0300 Subject: [PATCH 0299/2287] bpo-30358: Document sort argument of profile.runctx() (GH-1566) (cherry picked from commit 99776296230ddd8429ebad2d07854b8c27ea10ab) --- Doc/library/profile.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst index b4b1479e2ceba4..5796e3acb6a797 100644 --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -215,11 +215,11 @@ functions: and gathers profiling statistics from the execution. If no file name is present, then this function automatically creates a :class:`~pstats.Stats` - instance and prints a simple profiling report. If the sort value is specified + instance and prints a simple profiling report. If the sort value is specified, it is passed to this :class:`~pstats.Stats` instance to control how the results are sorted. -.. function:: runctx(command, globals, locals, filename=None) +.. function:: runctx(command, globals, locals, filename=None, sort=-1) This function is similar to :func:`run`, with added arguments to supply the globals and locals dictionaries for the *command* string. This routine From 0ce1f7e02d4102e8a459d1855d689c8e4613a327 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Mon, 15 May 2017 13:17:01 +0800 Subject: [PATCH 0300/2287] bpo-30110: fix resource leak in test_asyncio.test_events (#1413) (#1584) --- Lib/test/test_asyncio/test_events.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index 802763bd11ff61..492a84a2313baf 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -2194,8 +2194,10 @@ def tearDown(self): def test_get_event_loop_new_process(self): async def main(): pool = concurrent.futures.ProcessPoolExecutor() - return await self.loop.run_in_executor( + result = await self.loop.run_in_executor( pool, _test_get_event_loop_new_process__sub_proc) + pool.shutdown() + return result self.unpatch_get_running_loop() From aad1caf55f7fadb00ee097a1465bece4e128d8ef Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Mon, 15 May 2017 13:17:28 +0800 Subject: [PATCH 0301/2287] bpo-30242: resolve some undefined behaviours in struct (#1418) (#1586) --- Modules/_struct.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Modules/_struct.c b/Modules/_struct.c index 796d1682f094f1..2635af9db69597 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -539,7 +539,7 @@ np_ubyte(char *p, PyObject *v, const formatdef *f) "ubyte format requires 0 <= number <= 255"); return -1; } - *p = (char)x; + *(unsigned char *)p = (unsigned char)x; return 0; } @@ -868,6 +868,7 @@ bp_int(char *p, PyObject *v, const formatdef *f) { long x; Py_ssize_t i; + unsigned char *q = (unsigned char *)p; if (get_long(v, &x) < 0) return -1; i = f->size; @@ -880,7 +881,7 @@ bp_int(char *p, PyObject *v, const formatdef *f) #endif } do { - p[--i] = (char)x; + q[--i] = (unsigned char)(x & 0xffL); x >>= 8; } while (i > 0); return 0; @@ -891,6 +892,7 @@ bp_uint(char *p, PyObject *v, const formatdef *f) { unsigned long x; Py_ssize_t i; + unsigned char *q = (unsigned char *)p; if (get_ulong(v, &x) < 0) return -1; i = f->size; @@ -901,7 +903,7 @@ bp_uint(char *p, PyObject *v, const formatdef *f) RANGE_ERROR(x, f, 1, maxint - 1); } do { - p[--i] = (char)x; + q[--i] = (unsigned char)(x & 0xffUL); x >>= 8; } while (i > 0); return 0; @@ -1087,6 +1089,7 @@ lp_int(char *p, PyObject *v, const formatdef *f) { long x; Py_ssize_t i; + unsigned char *q = (unsigned char *)p; if (get_long(v, &x) < 0) return -1; i = f->size; @@ -1099,7 +1102,7 @@ lp_int(char *p, PyObject *v, const formatdef *f) #endif } do { - *p++ = (char)x; + *q++ = (unsigned char)(x & 0xffL); x >>= 8; } while (--i > 0); return 0; @@ -1110,6 +1113,7 @@ lp_uint(char *p, PyObject *v, const formatdef *f) { unsigned long x; Py_ssize_t i; + unsigned char *q = (unsigned char *)p; if (get_ulong(v, &x) < 0) return -1; i = f->size; @@ -1120,7 +1124,7 @@ lp_uint(char *p, PyObject *v, const formatdef *f) RANGE_ERROR(x, f, 1, maxint - 1); } do { - *p++ = (char)x; + *q++ = (unsigned char)(x & 0xffUL); x >>= 8; } while (--i > 0); return 0; From 75b8a54bcad70806d9dcbbe20786f4d9092ab39c Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Mon, 15 May 2017 22:41:07 -0700 Subject: [PATCH 0302/2287] bpo-29651 - Cover edge case of square brackets in urllib docs (#1128) (#1596) (cherry picked from commit f6e863d868a621594df2a8abe072b5d4766e7137) --- Doc/library/urllib.parse.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index 676321b46a2232..1cc69e62e63318 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -118,6 +118,9 @@ or on combining URL components into a URL string. an invalid port is specified in the URL. See section :ref:`urlparse-result-object` for more information on the result object. + Unmatched square brackets in the :attr:`netloc` attribute will raise a + :exc:`ValueError`. + .. versionchanged:: 3.2 Added IPv6 URL parsing capabilities. @@ -236,6 +239,9 @@ or on combining URL components into a URL string. an invalid port is specified in the URL. See section :ref:`urlparse-result-object` for more information on the result object. + Unmatched square brackets in the :attr:`netloc` attribute will raise a + :exc:`ValueError`. + .. versionchanged:: 3.6 Out-of-range port numbers now raise :exc:`ValueError`, instead of returning :const:`None`. From 73fb45df0487144765808c5d25914c67232d83fe Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 16 May 2017 18:16:15 +0300 Subject: [PATCH 0303/2287] [3.6] bpo-30375: Correct the stacklevel of regex compiling warnings. (GH-1595) (#1604) Warnings emitted when compile a regular expression now always point to the line in the user code. Previously they could point into inners of the re module if emitted from inside of groups or conditionals.. (cherry picked from commit c7ac7280c321b3c1679fe5f657a6be0f86adf173) --- Lib/sre_parse.py | 25 +++++++++++++------------ Lib/test/test_re.py | 17 ++++++++++++++--- Misc/NEWS | 4 ++++ 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py index e1c749634b71fe..608f9a26642f05 100644 --- a/Lib/sre_parse.py +++ b/Lib/sre_parse.py @@ -404,7 +404,7 @@ def _escape(source, escape, state): pass raise source.error("bad escape %s" % escape, len(escape)) -def _parse_sub(source, state, verbose, nested=True): +def _parse_sub(source, state, verbose, nested): # parse an alternation: a|b|c items = [] @@ -412,7 +412,8 @@ def _parse_sub(source, state, verbose, nested=True): sourcematch = source.match start = source.tell() while True: - itemsappend(_parse(source, state, verbose, not nested and not items)) + itemsappend(_parse(source, state, verbose, nested + 1, + not nested and not items)) if not sourcematch("|"): break @@ -454,10 +455,10 @@ def _parse_sub(source, state, verbose, nested=True): subpattern.append((BRANCH, (None, items))) return subpattern -def _parse_sub_cond(source, state, condgroup, verbose): - item_yes = _parse(source, state, verbose) +def _parse_sub_cond(source, state, condgroup, verbose, nested): + item_yes = _parse(source, state, verbose, nested + 1) if source.match("|"): - item_no = _parse(source, state, verbose) + item_no = _parse(source, state, verbose, nested + 1) if source.next == "|": raise source.error("conditional backref with more than two branches") else: @@ -466,7 +467,7 @@ def _parse_sub_cond(source, state, condgroup, verbose): subpattern.append((GROUPREF_EXISTS, (condgroup, item_yes, item_no))) return subpattern -def _parse(source, state, verbose, first=False): +def _parse(source, state, verbose, nested, first=False): # parse a simple pattern subpattern = SubPattern(state) @@ -692,7 +693,7 @@ def _parse(source, state, verbose, first=False): lookbehindgroups = state.lookbehindgroups if lookbehindgroups is None: state.lookbehindgroups = state.groups - p = _parse_sub(source, state, verbose) + p = _parse_sub(source, state, verbose, nested + 1) if dir < 0: if lookbehindgroups is None: state.lookbehindgroups = None @@ -739,7 +740,7 @@ def _parse(source, state, verbose, first=False): source.string[:20], # truncate long regexes ' (truncated)' if len(source.string) > 20 else '', ), - DeprecationWarning, stacklevel=7 + DeprecationWarning, stacklevel=nested + 6 ) if (state.flags & SRE_FLAG_VERBOSE) and not verbose: raise Verbose @@ -757,11 +758,11 @@ def _parse(source, state, verbose, first=False): except error as err: raise source.error(err.msg, len(name) + 1) from None if condgroup: - p = _parse_sub_cond(source, state, condgroup, verbose) + p = _parse_sub_cond(source, state, condgroup, verbose, nested + 1) else: sub_verbose = ((verbose or (add_flags & SRE_FLAG_VERBOSE)) and not (del_flags & SRE_FLAG_VERBOSE)) - p = _parse_sub(source, state, sub_verbose) + p = _parse_sub(source, state, sub_verbose, nested + 1) if not source.match(")"): raise source.error("missing ), unterminated subpattern", source.tell() - start) @@ -851,7 +852,7 @@ def parse(str, flags=0, pattern=None): pattern.str = str try: - p = _parse_sub(source, pattern, flags & SRE_FLAG_VERBOSE, False) + p = _parse_sub(source, pattern, flags & SRE_FLAG_VERBOSE, 0) except Verbose: # the VERBOSE flag was switched on inside the pattern. to be # on the safe side, we'll parse the whole thing again... @@ -859,7 +860,7 @@ def parse(str, flags=0, pattern=None): pattern.flags = flags | SRE_FLAG_VERBOSE pattern.str = str source.seek(0) - p = _parse_sub(source, pattern, True, False) + p = _parse_sub(source, pattern, True, 0) p.pattern.flags = fix_flags(str, p.pattern.flags) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index c52417ba000ebc..e88d0b3dcf2a78 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1348,6 +1348,7 @@ def test_inline_flags(self): str(warns.warnings[0].message), 'Flags not at the start of the expression %s' % p ) + self.assertEqual(warns.warnings[0].filename, __file__) p = upper_char + '(?i)%s' % ('.?' * 100) with self.assertWarns(DeprecationWarning) as warns: @@ -1356,6 +1357,7 @@ def test_inline_flags(self): str(warns.warnings[0].message), 'Flags not at the start of the expression %s (truncated)' % p[:20] ) + self.assertEqual(warns.warnings[0].filename, __file__) with self.assertWarns(DeprecationWarning): self.assertTrue(re.match('(?s).(?i)' + upper_char, '\n' + lower_char)) @@ -1367,14 +1369,23 @@ def test_inline_flags(self): self.assertTrue(re.match('^(?i)' + upper_char, lower_char)) with self.assertWarns(DeprecationWarning): self.assertTrue(re.match('$|(?i)' + upper_char, lower_char)) - with self.assertWarns(DeprecationWarning): + with self.assertWarns(DeprecationWarning) as warns: self.assertTrue(re.match('(?:(?i)' + upper_char + ')', lower_char)) - with self.assertWarns(DeprecationWarning): + self.assertRegex(str(warns.warnings[0].message), + 'Flags not at the start') + self.assertEqual(warns.warnings[0].filename, __file__) + with self.assertWarns(DeprecationWarning) as warns: self.assertTrue(re.fullmatch('(^)?(?(1)(?i)' + upper_char + ')', lower_char)) - with self.assertWarns(DeprecationWarning): + self.assertRegex(str(warns.warnings[0].message), + 'Flags not at the start') + self.assertEqual(warns.warnings[0].filename, __file__) + with self.assertWarns(DeprecationWarning) as warns: self.assertTrue(re.fullmatch('($)?(?(1)|(?i)' + upper_char + ')', lower_char)) + self.assertRegex(str(warns.warnings[0].message), + 'Flags not at the start') + self.assertEqual(warns.warnings[0].filename, __file__) def test_dollar_matches_twice(self): diff --git a/Misc/NEWS b/Misc/NEWS index bfb14c13653111..567f40976e2cde 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,10 @@ Core and Builtins Library ------- +- bpo-30375: Warnings emitted when compile a regular expression now always + point to the line in the user code. Previously they could point into inners + of the re module if emitted from inside of groups or conditionals. + - bpo-30048: Fixed ``Task.cancel()`` can be ignored when the task is running coroutine and the coroutine returned without any more ``await``. From 8fc1ff51adb52c80f6bf78393413c72543bae3e1 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 17 May 2017 00:09:23 +0300 Subject: [PATCH 0304/2287] [3.6] bpo-30380: Fix Sphinx 1.6.1 warnings. (GH-1613) (#1614) * Use explicit numbering for footnotes referred by explicit number. * Restore missed footnote reference in stdtypes.rst. * Fix literal strings formatting in howto/urllib2.rst. * Update susp-ignored.csv for zipapp.rst. * Fix suspicious mark up in Misc/NEWS.. (cherry picked from commit d97b7dc94b19063f0589d401bdc4aaadc7030762) --- Doc/howto/urllib2.rst | 10 +++++----- Doc/library/pyexpat.rst | 2 +- Doc/library/stdtypes.rst | 2 +- Doc/library/xml.dom.minidom.rst | 2 +- Doc/library/xml.etree.elementtree.rst | 2 +- Doc/tools/susp-ignored.csv | 7 +++---- Misc/NEWS | 2 +- 7 files changed, 13 insertions(+), 14 deletions(-) diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst index 18b5c6556be1c9..8d383e03ee8a28 100644 --- a/Doc/howto/urllib2.rst +++ b/Doc/howto/urllib2.rst @@ -34,8 +34,8 @@ handling common situations - like basic authentication, cookies, proxies and so on. These are provided by objects called handlers and openers. urllib.request supports fetching URLs for many "URL schemes" (identified by the string -before the ":" in URL - for example "ftp" is the URL scheme of -"ftp://python.org/") using their associated network protocols (e.g. FTP, HTTP). +before the ``":"`` in URL - for example ``"ftp"`` is the URL scheme of +``"ftp://python.org/"``) using their associated network protocols (e.g. FTP, HTTP). This tutorial focuses on the most common case, HTTP. For straightforward situations *urlopen* is very easy to use. But as soon as you @@ -511,10 +511,10 @@ than the URL you pass to .add_password() will also match. :: ``top_level_url`` is in fact *either* a full URL (including the 'http:' scheme component and the hostname and optionally the port number) -e.g. "http://example.com/" *or* an "authority" (i.e. the hostname, -optionally including the port number) e.g. "example.com" or "example.com:8080" +e.g. ``"http://example.com/"`` *or* an "authority" (i.e. the hostname, +optionally including the port number) e.g. ``"example.com"`` or ``"example.com:8080"`` (the latter example includes a port number). The authority, if present, must -NOT contain the "userinfo" component - for example "joe:password@example.com" is +NOT contain the "userinfo" component - for example ``"joe:password@example.com"`` is not correct. diff --git a/Doc/library/pyexpat.rst b/Doc/library/pyexpat.rst index 075a8b5139b196..e43b9aecd86835 100644 --- a/Doc/library/pyexpat.rst +++ b/Doc/library/pyexpat.rst @@ -869,7 +869,7 @@ The ``errors`` module has the following attributes: .. rubric:: Footnotes -.. [#] The encoding string included in XML output should conform to the +.. [1] The encoding string included in XML output should conform to the appropriate standards. For example, "UTF-8" is valid, but "UTF8" is not. See https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl and https://www.iana.org/assignments/character-sets/character-sets.xhtml. diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 6729a20a9c2ecc..af0a7b7fe939b2 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -829,7 +829,7 @@ restrictions imposed by *s*. The ``in`` and ``not in`` operations have the same priorities as the comparison operations. The ``+`` (concatenation) and ``*`` (repetition) -operations have the same priority as the corresponding numeric operations. +operations have the same priority as the corresponding numeric operations. [3]_ .. index:: triple: operations on; sequence; types diff --git a/Doc/library/xml.dom.minidom.rst b/Doc/library/xml.dom.minidom.rst index 2e9e814693df57..40470e8736e7e4 100644 --- a/Doc/library/xml.dom.minidom.rst +++ b/Doc/library/xml.dom.minidom.rst @@ -248,7 +248,7 @@ utility to most DOM users. .. rubric:: Footnotes -.. [#] The encoding name included in the XML output should conform to +.. [1] The encoding name included in the XML output should conform to the appropriate standards. For example, "UTF-8" is valid, but "UTF8" is not valid in an XML document's declaration, even though Python accepts it as an encoding name. diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index b54eace41188b0..7d814ad406eb1b 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -1192,7 +1192,7 @@ Exceptions .. rubric:: Footnotes -.. [#] The encoding string included in XML output should conform to the +.. [1] The encoding string included in XML output should conform to the appropriate standards. For example, "UTF-8" is valid, but "UTF8" is not. See https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl and https://www.iana.org/assignments/character-sets/character-sets.xhtml. diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index 57b0cf12f53712..2dc540459020a6 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -106,7 +106,7 @@ howto/pyporting,,::,Programming Language :: Python :: 2 howto/pyporting,,::,Programming Language :: Python :: 3 howto/regex,,::, howto/regex,,:foo,(?:foo) -howto/urllib2,,:password,"for example ""joe:password@example.com""" +howto/urllib2,,:password,"""joe:password@example.com""" library/audioop,,:ipos,"# factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)]," library/bisect,32,:hi,all(val >= x for val in a[i:hi]) library/bisect,42,:hi,all(val > x for val in a[i:hi]) @@ -316,8 +316,8 @@ library/xml.etree.elementtree,,:actor,"for actor in root.findall('real_person:ac library/xml.etree.elementtree,,:name,"name = actor.find('real_person:name', ns)" library/xml.etree.elementtree,,:character,"for char in actor.findall('role:character', ns):" library/zipapp,,:main,"$ python -m zipapp myapp -m ""myapp:main""" -library/zipapp,,:fn,"argument should have the form ""pkg.mod:fn"", where ""pkg.mod"" is a" -library/zipapp,,:callable,"""pkg.module:callable"" and the archive will be run by importing" +library/zipapp,,:fn,"pkg.mod:fn" +library/zipapp,,:callable,"pkg.module:callable" library/stdtypes,,::,>>> m[::2].tolist() library/sys,,`,# ``wrapper`` creates a ``wrap(coro)`` coroutine: whatsnew/3.5,,:root,'WARNING:root:warning\n' @@ -326,4 +326,3 @@ whatsnew/3.5,,::,>>> addr6 = ipaddress.IPv6Address('::1') whatsnew/3.5,,:root,ERROR:root:exception whatsnew/3.5,,:exception,ERROR:root:exception whatsnew/changelog,,:version,import sys; I = version[:version.index(' ')] -whatsnew/changelog,,`,"for readability (was ""`"")." diff --git a/Misc/NEWS b/Misc/NEWS index 567f40976e2cde..ca38fe0e5cdf36 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -783,7 +783,7 @@ Library non-None value is passed to it.send(val). - Issue #27025: Generated names for Tkinter widgets now start by the "!" prefix - for readability (was "`"). + for readability. - Issue #25464: Fixed HList.header_exists() in tkinter.tix module by addin a workaround to Tix library bug. From 5e2016dce92d66e6e1fb25e6ce39031d8c7d5412 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Tue, 16 May 2017 14:28:21 -0700 Subject: [PATCH 0305/2287] bpo-30380: Pin the version of Sphinx used to build the docs (GH-1612) (GH-1617) --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5fee6cd7673324..fe90bad626ce83 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,9 +37,11 @@ matrix: - TESTING=docs before_script: - cd Doc - - make venv + # Sphinx is pinned so that new versions that introduce new warnings won't suddenly cause build failures. + # (Updating the version is fine as long as no warnings are raised by doing so.) + - python -m pip install sphinx~=1.6.1 script: - - make check suspicious html PYTHON="./venv/bin/python" SPHINXBUILD="./venv/bin/python -m sphinx" SPHINXOPTS="-q -W" + - make check suspicious html SPHINXOPTS="-q -W" - os: linux language: c compiler: gcc From 0d267041c40a3ab655676b885c0ba35ed9685848 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Wed, 17 May 2017 00:31:39 +0300 Subject: [PATCH 0306/2287] bpo-29898: Fix incorrect env variable name (GH-1576) It should read PYTHONLEGACYWINDOWSSTDIO as stated in section "Add legacy mode" in PEP 528. (cherry picked from commit 87fa8a780e9045a26c735f085c07bba4b2d0be60) --- Doc/using/cmdline.rst | 4 ++-- Doc/whatsnew/3.6.rst | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index 08dc311d837be9..40a06b9adc06ef 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -571,7 +571,7 @@ conflict. .. versionchanged:: 3.6 On Windows, the encoding specified by this variable is ignored for interactive - console buffers unless :envvar:`PYTHONLEGACYWINDOWSIOENCODING` is also specified. + console buffers unless :envvar:`PYTHONLEGACYWINDOWSSTDIO` is also specified. Files and pipes redirected through the standard streams are not affected. .. envvar:: PYTHONNOUSERSITE @@ -700,7 +700,7 @@ conflict. .. versionadded:: 3.6 See :pep:`529` for more details. -.. envvar:: PYTHONLEGACYWINDOWSIOENCODING +.. envvar:: PYTHONLEGACYWINDOWSSTDIO If set to a non-empty string, does not use the new console reader and writer. This means that Unicode characters will be encoded according to diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index a696af4a999c84..a701cafa610788 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -534,7 +534,7 @@ provide correctly read str objects to Python code. ``sys.stdin``, This change only applies when using an interactive console, and not when redirecting files or pipes. To revert to the previous behaviour for interactive -console use, set :envvar:`PYTHONLEGACYWINDOWSIOENCODING`. +console use, set :envvar:`PYTHONLEGACYWINDOWSSTDIO`. .. seealso:: From aaa053652556aa4e59cb68f3983a09ced1d1fe2a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 16 May 2017 15:29:41 -0700 Subject: [PATCH 0307/2287] bpo-30329: Catch Windows error 10022 on shutdown() (#1538) (#1620) Catch the Windows socket WSAEINVAL error (code 10022) in imaplib and poplib on shutdown(SHUT_RDWR): An invalid operation was attempted This error occurs sometimes on SSL connections. (cherry picked from commit 83a2c2879839da2e10037f5e4af1bd1dafbf1a52) --- Lib/imaplib.py | 9 ++++++--- Lib/poplib.py | 9 ++++++--- Misc/NEWS | 4 ++++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Lib/imaplib.py b/Lib/imaplib.py index 2fa90120e7decc..1c0b03bff8a379 100644 --- a/Lib/imaplib.py +++ b/Lib/imaplib.py @@ -318,9 +318,12 @@ def shutdown(self): self.file.close() try: self.sock.shutdown(socket.SHUT_RDWR) - except OSError as e: - # The server might already have closed the connection - if e.errno != errno.ENOTCONN: + except OSError as exc: + # The server might already have closed the connection. + # On Windows, this may result in WSAEINVAL (error 10022): + # An invalid operation was attempted. + if (exc.errno != errno.ENOTCONN + and getattr(exc, 'winerror', 0) != 10022): raise finally: self.sock.close() diff --git a/Lib/poplib.py b/Lib/poplib.py index cae6950eb6d2d6..6bcfa5cfeba37b 100644 --- a/Lib/poplib.py +++ b/Lib/poplib.py @@ -288,9 +288,12 @@ def close(self): if sock is not None: try: sock.shutdown(socket.SHUT_RDWR) - except OSError as e: - # The server might already have closed the connection - if e.errno != errno.ENOTCONN: + except OSError as exc: + # The server might already have closed the connection. + # On Windows, this may result in WSAEINVAL (error 10022): + # An invalid operation was attempted. + if (exc.errno != errno.ENOTCONN + and getattr(exc, 'winerror', 0) != 10022): raise finally: sock.close() diff --git a/Misc/NEWS b/Misc/NEWS index ca38fe0e5cdf36..6a50c6265c5cf1 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,10 @@ Core and Builtins Library ------- +- bpo-30329: imaplib and poplib now catch the Windows socket WSAEINVAL error + (code 10022) on shutdown(SHUT_RDWR): An invalid operation was attempted. + This error occurs sometimes on SSL connections. + - bpo-30375: Warnings emitted when compile a regular expression now always point to the line in the user code. Previously they could point into inners of the re module if emitted from inside of groups or conditionals. From 6b5b85aecf4db796a05582202a6c875b36eae516 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 16 May 2017 17:06:14 -0700 Subject: [PATCH 0308/2287] bpo-30357: test_thread now uses threading_cleanup() (#1592) (#1622) test_thread: setUp() now uses support.threading_setup() and support.threading_cleanup() to wait until threads complete to avoid random side effects on following tests. Co-Authored-By: Grzegorz Grzywacz (cherry picked from commit 79ef7f8e88a4972c4aecf95cfc5cd934f1861e08) --- Lib/test/test_thread.py | 4 ++++ Misc/ACKS | 1 + Misc/NEWS | 5 +++++ 3 files changed, 10 insertions(+) diff --git a/Lib/test/test_thread.py b/Lib/test/test_thread.py index ef3059b68674b4..3909b75ccd4647 100644 --- a/Lib/test/test_thread.py +++ b/Lib/test/test_thread.py @@ -20,6 +20,7 @@ def verbose_print(arg): with _print_mutex: print(arg) + class BasicThreadTest(unittest.TestCase): def setUp(self): @@ -31,6 +32,9 @@ def setUp(self): self.running = 0 self.next_ident = 0 + key = support.threading_setup() + self.addCleanup(support.threading_cleanup, *key) + class ThreadRunningTests(BasicThreadTest): diff --git a/Misc/ACKS b/Misc/ACKS index 486b6e32850b88..ccc9d2af3149c0 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -551,6 +551,7 @@ Eric Groo Daniel Andrade Groppe Dag Gruneau Filip Gruszczyński +Grzegorz Grzywacz Thomas Guettler Yuyang Guo Anuj Gupta diff --git a/Misc/NEWS b/Misc/NEWS index 6a50c6265c5cf1..0459e8490048c9 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -168,6 +168,11 @@ Tools/Demos Tests ----- +* bpo-30357: test_thread: setUp() now uses support.threading_setup() and + support.threading_cleanup() to wait until threads complete to avoid + random side effects on following tests. Initial patch written by Grzegorz + Grzywacz. + - bpo-30197: Enhanced functions swap_attr() and swap_item() in the test.support module. They now work when delete replaced attribute or item inside the with statement. The old value of the attribute or item (or None From 460945f22acd288e660b432b288d9d81655572bf Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 16 May 2017 17:58:02 -0700 Subject: [PATCH 0309/2287] bpo-30273: update distutils.sysconfig for venv's created from Python (#1515) (#1625) compiled out-of-tree (builddir != srcdir). (see also bpo-15366) (cherry picked from commit dbdea629e2e0e4bd8845aa55041e0a0ca4172cf3) --- Lib/distutils/sysconfig.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py index 90004acea88761..2bcd1dd2885991 100644 --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -93,14 +93,11 @@ def get_python_inc(plat_specific=0, prefix=None): # the build directory may not be the source directory, we # must use "srcdir" from the makefile to find the "Include" # directory. - base = _sys_home or project_base if plat_specific: - return base - if _sys_home: - incdir = os.path.join(_sys_home, 'Include') + return _sys_home or project_base else: incdir = os.path.join(get_config_var('srcdir'), 'Include') - return os.path.normpath(incdir) + return os.path.normpath(incdir) python_dir = 'python' + get_python_version() + build_flags return os.path.join(prefix, "include", python_dir) elif os.name == "nt": From b769c91c2db304db44cd514344369cde1f8d9dc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Miedzi=C5=84ski?= Date: Wed, 17 May 2017 08:17:55 +0200 Subject: [PATCH 0310/2287] Fix ModuleNotFoundError typo in import reference (#1610) (cherry picked from commit c138d84b8d27d338872587aae69a73d8f9d16641) --- Doc/reference/import.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst index 4dbd9d88c301a0..9475b8d55c2dc3 100644 --- a/Doc/reference/import.rst +++ b/Doc/reference/import.rst @@ -890,7 +890,7 @@ import statements within that module. To selectively prevent import of some modules from a hook early on the meta path (rather than disabling the standard import system entirely), -it is sufficient to raise :exc:`ModuleNoFoundError` directly from +it is sufficient to raise :exc:`ModuleNotFoundError` directly from :meth:`~importlib.abc.MetaPathFinder.find_spec` instead of returning ``None``. The latter indicates that the meta path search should continue, while raising an exception terminates it immediately. From 43d4c0329e2348540a3a16ac61b3032f04eefd34 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Wed, 17 May 2017 22:03:35 +0800 Subject: [PATCH 0311/2287] bpo-30301: Fix AttributeError when using SimpleQueue.empty() (#1601) (#1628) Under *spawn* and *forkserver* start methods, SimpleQueue.empty() could raise AttributeError due to not setting _poll in __setstate__. --- Lib/multiprocessing/queues.py | 1 + Lib/test/_test_multiprocessing.py | 36 +++++++++++++++++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 40 insertions(+) diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py index dda03ddf5425ce..a4f4ef8b7b5334 100644 --- a/Lib/multiprocessing/queues.py +++ b/Lib/multiprocessing/queues.py @@ -337,6 +337,7 @@ def __getstate__(self): def __setstate__(self, state): (self._reader, self._writer, self._rlock, self._wlock) = state + self._poll = self._reader.poll def get(self): with self._rlock: diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 57ada127465d75..3eb83c59ab17d7 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -3958,6 +3958,42 @@ def test_semaphore_tracker(self): self.assertRegex(err, expected) self.assertRegex(err, r'semaphore_tracker: %r: \[Errno' % name1) +class TestSimpleQueue(unittest.TestCase): + + @classmethod + def _test_empty(cls, queue, child_can_start, parent_can_continue): + child_can_start.wait() + # issue 30301, could fail under spawn and forkserver + try: + queue.put(queue.empty()) + queue.put(queue.empty()) + finally: + parent_can_continue.set() + + def test_empty(self): + queue = multiprocessing.SimpleQueue() + child_can_start = multiprocessing.Event() + parent_can_continue = multiprocessing.Event() + + proc = multiprocessing.Process( + target=self._test_empty, + args=(queue, child_can_start, parent_can_continue) + ) + proc.daemon = True + proc.start() + + self.assertTrue(queue.empty()) + + child_can_start.set() + parent_can_continue.wait() + + self.assertFalse(queue.empty()) + self.assertEqual(queue.get(), True) + self.assertEqual(queue.get(), False) + self.assertTrue(queue.empty()) + + proc.join() + # # Mixins # diff --git a/Misc/NEWS b/Misc/NEWS index 0459e8490048c9..6336e67ee48edb 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,9 @@ Core and Builtins Library ------- +- bpo-30301: Fix AttributeError when using SimpleQueue.empty() under + *spawn* and *forkserver* start methods. + - bpo-30329: imaplib and poplib now catch the Windows socket WSAEINVAL error (code 10022) on shutdown(SHUT_RDWR): An invalid operation was attempted. This error occurs sometimes on SSL connections. From 0d1727835f44492c7357b013d94539e3891adf77 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Wed, 17 May 2017 10:51:01 -0700 Subject: [PATCH 0312/2287] Remove unused variable in test_urllibnet. (#1598) (#1600) (cherry picked from commit 1bd7d299bd2a91f8267f97a413568ab8fe7fdfbb) --- Lib/test/test_urllibnet.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_urllibnet.py b/Lib/test/test_urllibnet.py index 865a7f4f5fb172..4103b6c07505d5 100644 --- a/Lib/test/test_urllibnet.py +++ b/Lib/test/test_urllibnet.py @@ -11,6 +11,7 @@ support.requires('network') + class URLTimeoutTest(unittest.TestCase): # XXX this test doesn't seem to test anything useful. @@ -25,7 +26,7 @@ def tearDown(self): def testURLread(self): with support.transient_internet("www.example.com"): f = urllib.request.urlopen("http://www.example.com/") - x = f.read() + f.read() class urlopenNetworkTests(unittest.TestCase): @@ -188,6 +189,7 @@ def test_data_header(self): def test_reporthook(self): records = [] + def recording_reporthook(blocks, block_size, total_size): records.append((blocks, block_size, total_size)) From 69f3a5ac28041fac86897e0c90d98ad9fd6fa3f7 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 17 May 2017 14:45:45 -0700 Subject: [PATCH 0313/2287] tmtotuple(): use time_t for gmtoff (#1276) (#1635) timegm() return type is time_t, not int. Use time_t to prevent the following compiler warning on Windows: timemodule.c: warning C4244: '=': conversion from 'time_t' to 'int', possible loss of data (cherry picked from commit 0d659e5614cad512a1940125135b443b3eecb5d7) --- Modules/timemodule.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/timemodule.c b/Modules/timemodule.c index ebd44ad525bd81..328b84f3338ea3 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -279,7 +279,7 @@ static PyTypeObject StructTimeType; static PyObject * tmtotuple(struct tm *p #ifndef HAVE_STRUCT_TM_TM_ZONE - , const char *zone, int gmtoff + , const char *zone, time_t gmtoff #endif ) { @@ -305,7 +305,7 @@ tmtotuple(struct tm *p #else PyStructSequence_SET_ITEM(v, 9, PyUnicode_DecodeLocale(zone, "surrogateescape")); - SET(10, gmtoff); + PyStructSequence_SET_ITEM(v, 10, _PyLong_FromTime_t(gmtoff)); #endif /* HAVE_STRUCT_TM_TM_ZONE */ #undef SET if (PyErr_Occurred()) { @@ -397,7 +397,7 @@ time_localtime(PyObject *self, PyObject *args) { struct tm local = buf; char zone[100]; - int gmtoff; + time_t gmtoff; strftime(zone, sizeof(zone), "%Z", &buf); gmtoff = timegm(&buf) - when; return tmtotuple(&local, zone, gmtoff); From 44944b602af23712d7119801183cdc6e202e4f76 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 17 May 2017 14:49:38 -0700 Subject: [PATCH 0314/2287] bpo-30387: Fix warning in test_threading (#1634) (#1636) test_is_alive_after_fork() now joins directly the thread to avoid the following warning added by bpo-30357: Warning -- threading_cleanup() failed to cleanup 0 threads after 2 sec (count: 0, dangling: 21) Use also a different exit code to catch generic exit code 1. (cherry picked from commit f8d05b3a24e745ab4a974b891ac1389e2f11ce4d) --- Lib/test/test_threading.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 6b6c4d220a3bd0..0db028864d203a 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -470,13 +470,15 @@ def test_is_alive_after_fork(self): for i in range(20): t = threading.Thread(target=lambda: None) t.start() - self.addCleanup(t.join) pid = os.fork() if pid == 0: - os._exit(1 if t.is_alive() else 0) + os._exit(11 if t.is_alive() else 10) else: + t.join() + pid, status = os.waitpid(pid, 0) - self.assertEqual(0, status) + self.assertTrue(os.WIFEXITED(status)) + self.assertEqual(10, os.WEXITSTATUS(status)) def test_main_thread(self): main = threading.main_thread() From 2773add19aff873377d81e3bb6ab8aa942756f5a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 18 May 2017 13:36:51 -0700 Subject: [PATCH 0315/2287] bpo-27103: regrtest disables -W if -R is used (#1651) (#1656) Workaround for a regrtest bug. (cherry picked from commit fcdd9b6b7e73427ce5aa63cf095312f603c4edce) --- Lib/test/libregrtest/cmdline.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index d621f5f9f3ee1f..cdbd1b8b92553c 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -343,5 +343,10 @@ def _parse_args(args, **kwargs): ns.use_resources.append(r) if ns.random_seed is not None: ns.randomize = True + if ns.huntrleaks and ns.verbose3: + ns.verbose3 = False + print("WARNING: Disable --verbose3 because it's incompatible with " + "--huntrleaks: see http://bugs.python.org/issue27103", + file=sys.stderr) return ns From 193f7e094f070cecbc6faea6dffafb80ea9e7536 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 20 May 2017 10:23:31 +0300 Subject: [PATCH 0316/2287] [3.6] bpo-25794: Fix `type.__setattr__()` for non-interned attribute names. (GH-1652) (#1673) Based on patch by Eryk Sun. (cherry picked from commit d896985bb2de49046f9b6879e906d1e4db255e23) --- Lib/test/test_class.py | 27 +++++++++++++++++++++++++++ Misc/NEWS | 3 +++ Objects/typeobject.c | 39 ++++++++++++++++++++++++++++++++++----- 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py index 4d554a397b4a51..ecc01f277954d5 100644 --- a/Lib/test/test_class.py +++ b/Lib/test/test_class.py @@ -568,5 +568,32 @@ class B(A): a = A(hash(A.f)^(-1)) hash(a.f) + def testSetattrWrapperNameIntern(self): + # Issue #25794: __setattr__ should intern the attribute name + class A: + pass + + def add(self, other): + return 'summa' + + name = str(b'__add__', 'ascii') # shouldn't be optimized + self.assertIsNot(name, '__add__') # not interned + type.__setattr__(A, name, add) + self.assertEqual(A() + 1, 'summa') + + name2 = str(b'__add__', 'ascii') + self.assertIsNot(name2, '__add__') + self.assertIsNot(name2, name) + type.__delattr__(A, name2) + with self.assertRaises(TypeError): + A() + 1 + + def testSetattrNonStringName(self): + class A: + pass + + with self.assertRaises(TypeError): + type.__setattr__(A, b'x', None) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS index 6336e67ee48edb..e1ea9df116b8e6 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.6.2 release candidate 1? Core and Builtins ----------------- +- bpo-25794: Fixed type.__setattr__() and type.__delattr__() for + non-interned attribute names. Based on patch by Eryk Sun. + - bpo-12414: sys.getsizeof() on a code object now returns the sizes which includes the code struct and sizes of objects which it references. Patch by Dong-hee Na. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 329261b037320a..271b93575c6dcf 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -3075,6 +3075,7 @@ type_getattro(PyTypeObject *type, PyObject *name) static int type_setattro(PyTypeObject *type, PyObject *name, PyObject *value) { + int res; if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { PyErr_Format( PyExc_TypeError, @@ -3082,9 +3083,35 @@ type_setattro(PyTypeObject *type, PyObject *name, PyObject *value) type->tp_name); return -1; } - if (PyObject_GenericSetAttr((PyObject *)type, name, value) < 0) - return -1; - return update_slot(type, name); + if (PyUnicode_Check(name)) { + if (PyUnicode_CheckExact(name)) { + if (PyUnicode_READY(name) == -1) + return -1; + Py_INCREF(name); + } + else { + name = _PyUnicode_Copy(name); + if (name == NULL) + return -1; + } + PyUnicode_InternInPlace(&name); + if (!PyUnicode_CHECK_INTERNED(name)) { + PyErr_SetString(PyExc_MemoryError, + "Out of memory interning an attribute name"); + Py_DECREF(name); + return -1; + } + } + else { + /* Will fail in _PyObject_GenericSetAttrWithDict. */ + Py_INCREF(name); + } + res = PyObject_GenericSetAttr((PyObject *)type, name, value); + if (res == 0) { + res = update_slot(type, name); + } + Py_DECREF(name); + return res; } extern void @@ -6929,7 +6956,7 @@ init_slotdefs(void) /* Slots must be ordered by their offset in the PyHeapTypeObject. */ assert(!p[1].name || p->offset <= p[1].offset); p->name_strobj = PyUnicode_InternFromString(p->name); - if (!p->name_strobj) + if (!p->name_strobj || !PyUnicode_CHECK_INTERNED(p->name_strobj)) Py_FatalError("Out of memory interning slotdef names"); } slotdefs_initialized = 1; @@ -6954,6 +6981,9 @@ update_slot(PyTypeObject *type, PyObject *name) slotdef **pp; int offset; + assert(PyUnicode_CheckExact(name)); + assert(PyUnicode_CHECK_INTERNED(name)); + /* Clear the VALID_VERSION flag of 'type' and all its subclasses. This could possibly be unified with the update_subclasses() recursion below, but carefully: @@ -6964,7 +6994,6 @@ update_slot(PyTypeObject *type, PyObject *name) init_slotdefs(); pp = ptrs; for (p = slotdefs; p->name; p++) { - /* XXX assume name is interned! */ if (p->name_strobj == name) *pp++ = p; } From 564398af6ccb34d0db8b6e2537830eca285689e5 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 20 May 2017 13:06:26 +0300 Subject: [PATCH 0317/2287] [3.6] bpo-27945: Fixed various segfaults with dict. (GH-1657) (#1677) Based on patches by Duane Griffin and Tim Mitchell. (cherry picked from commit 753bca3934a7618a4fa96e107ad1c5c18633a683) --- Lib/test/test_dict.py | 85 +++++++++++++++++++++++++++++++++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 4 ++ Objects/dictobject.c | 69 ++++++++++++++++++++++------------- 4 files changed, 134 insertions(+), 25 deletions(-) diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index 832bb9c8e2dbcc..8013f37c88da0a 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -1085,6 +1085,91 @@ def test_free_after_iterating(self): support.check_free_after_iterating(self, lambda d: iter(d.values()), dict) support.check_free_after_iterating(self, lambda d: iter(d.items()), dict) + def test_equal_operator_modifying_operand(self): + # test fix for seg fault reported in issue 27945 part 3. + class X(): + def __del__(self): + dict_b.clear() + + def __eq__(self, other): + dict_a.clear() + return True + + def __hash__(self): + return 13 + + dict_a = {X(): 0} + dict_b = {X(): X()} + self.assertTrue(dict_a == dict_b) + + def test_fromkeys_operator_modifying_dict_operand(self): + # test fix for seg fault reported in issue 27945 part 4a. + class X(int): + def __hash__(self): + return 13 + + def __eq__(self, other): + if len(d) > 1: + d.clear() + return False + + d = {} # this is required to exist so that d can be constructed! + d = {X(1): 1, X(2): 2} + try: + dict.fromkeys(d) # shouldn't crash + except RuntimeError: # implementation defined + pass + + def test_fromkeys_operator_modifying_set_operand(self): + # test fix for seg fault reported in issue 27945 part 4b. + class X(int): + def __hash__(self): + return 13 + + def __eq__(self, other): + if len(d) > 1: + d.clear() + return False + + d = {} # this is required to exist so that d can be constructed! + d = {X(1), X(2)} + try: + dict.fromkeys(d) # shouldn't crash + except RuntimeError: # implementation defined + pass + + def test_dictitems_contains_use_after_free(self): + class X: + def __eq__(self, other): + d.clear() + return NotImplemented + + d = {0: set()} + (0, X()) in d.items() + + def test_init_use_after_free(self): + class X: + def __hash__(self): + pair[:] = [] + return 13 + + pair = [X(), 123] + dict([pair]) + + def test_oob_indexing_dictiter_iternextitem(self): + class X(int): + def __del__(self): + d.clear() + + d = {i: X(i) for i in range(8)} + + def iter_and_mutate(): + for result in d.items(): + if result[0] == 2: + d[2] = None # free d[2] --> X(2).__del__ was called + + self.assertRaises(RuntimeError, iter_and_mutate) + class CAPITest(unittest.TestCase): diff --git a/Misc/ACKS b/Misc/ACKS index ccc9d2af3149c0..7109ccbe851384 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -542,6 +542,7 @@ Tim Graham Kim Gräsman Nathaniel Gray Eddy De Greef +Duane Griffin Grant Griffin Andrea Griffini Duncan Grisby diff --git a/Misc/NEWS b/Misc/NEWS index e1ea9df116b8e6..d3c6868c4e5103 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ What's New in Python 3.6.2 release candidate 1? Core and Builtins ----------------- +- bpo-27945: Fixed various segfaults with dict when input collections are + mutated during searching, inserting or comparing. Based on patches by + Duane Griffin and Tim Mitchell. + - bpo-25794: Fixed type.__setattr__() and type.__delattr__() for non-interned attribute names. Based on patch by Eryk Sun. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 566d1a5ac8d893..b0f583a067b4e1 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1115,18 +1115,18 @@ insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value) PyDictKeyEntry *ep, *ep0; Py_ssize_t hashpos, ix; + Py_INCREF(key); + Py_INCREF(value); if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) { if (insertion_resize(mp) < 0) - return -1; + goto Fail; } ix = mp->ma_keys->dk_lookup(mp, key, hash, &value_addr, &hashpos); - if (ix == DKIX_ERROR) { - return -1; - } + if (ix == DKIX_ERROR) + goto Fail; assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict); - Py_INCREF(value); MAINTAIN_TRACKING(mp, key, value); /* When insertion order is different from shared key, we can't share @@ -1135,10 +1135,8 @@ insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value) if (_PyDict_HasSplitTable(mp) && ((ix >= 0 && *value_addr == NULL && mp->ma_used != ix) || (ix == DKIX_EMPTY && mp->ma_used != mp->ma_keys->dk_nentries))) { - if (insertion_resize(mp) < 0) { - Py_DECREF(value); - return -1; - } + if (insertion_resize(mp) < 0) + goto Fail; find_empty_slot(mp, key, hash, &value_addr, &hashpos); ix = DKIX_EMPTY; } @@ -1147,16 +1145,13 @@ insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value) /* Insert into new slot. */ if (mp->ma_keys->dk_usable <= 0) { /* Need to resize. */ - if (insertion_resize(mp) < 0) { - Py_DECREF(value); - return -1; - } + if (insertion_resize(mp) < 0) + goto Fail; find_empty_slot(mp, key, hash, &value_addr, &hashpos); } ep0 = DK_ENTRIES(mp->ma_keys); ep = &ep0[mp->ma_keys->dk_nentries]; dk_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries); - Py_INCREF(key); ep->me_key = key; ep->me_hash = hash; if (mp->ma_values) { @@ -1184,6 +1179,7 @@ insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value) assert(_PyDict_CheckConsistency(mp)); Py_DECREF(old_value); /* which **CAN** re-enter (see issue #22653) */ + Py_DECREF(key); return 0; } @@ -1194,7 +1190,13 @@ insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value) mp->ma_used++; mp->ma_version_tag = DICT_NEXT_VERSION(); assert(_PyDict_CheckConsistency(mp)); + Py_DECREF(key); return 0; + +Fail: + Py_DECREF(value); + Py_DECREF(key); + return -1; } /* @@ -2432,11 +2434,18 @@ PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override) /* Update/merge with this (key, value) pair. */ key = PySequence_Fast_GET_ITEM(fast, 0); value = PySequence_Fast_GET_ITEM(fast, 1); + Py_INCREF(key); + Py_INCREF(value); if (override || PyDict_GetItem(d, key) == NULL) { int status = PyDict_SetItem(d, key, value); - if (status < 0) + if (status < 0) { + Py_DECREF(key); + Py_DECREF(value); goto Fail; + } } + Py_DECREF(key); + Py_DECREF(value); Py_DECREF(fast); Py_DECREF(item); } @@ -2737,14 +2746,15 @@ dict_equal(PyDictObject *a, PyDictObject *b) bval = NULL; else bval = *vaddr; - Py_DECREF(key); if (bval == NULL) { + Py_DECREF(key); Py_DECREF(aval); if (PyErr_Occurred()) return -1; return 0; } cmp = PyObject_RichCompareBool(aval, bval, Py_EQ); + Py_DECREF(key); Py_DECREF(aval); if (cmp <= 0) /* error or not equal */ return cmp; @@ -3633,7 +3643,7 @@ PyTypeObject PyDictIterValue_Type = { static PyObject * dictiter_iternextitem(dictiterobject *di) { - PyObject *key, *value, *result = di->di_result; + PyObject *key, *value, *result; Py_ssize_t i, n; PyDictObject *d = di->di_dict; @@ -3674,20 +3684,25 @@ dictiter_iternextitem(dictiterobject *di) } di->di_pos = i+1; di->len--; - if (result->ob_refcnt == 1) { + Py_INCREF(key); + Py_INCREF(value); + result = di->di_result; + if (Py_REFCNT(result) == 1) { + PyObject *oldkey = PyTuple_GET_ITEM(result, 0); + PyObject *oldvalue = PyTuple_GET_ITEM(result, 1); + PyTuple_SET_ITEM(result, 0, key); /* steals reference */ + PyTuple_SET_ITEM(result, 1, value); /* steals reference */ Py_INCREF(result); - Py_DECREF(PyTuple_GET_ITEM(result, 0)); - Py_DECREF(PyTuple_GET_ITEM(result, 1)); + Py_DECREF(oldkey); + Py_DECREF(oldvalue); } else { result = PyTuple_New(2); if (result == NULL) return NULL; + PyTuple_SET_ITEM(result, 0, key); /* steals reference */ + PyTuple_SET_ITEM(result, 1, value); /* steals reference */ } - Py_INCREF(key); - Py_INCREF(value); - PyTuple_SET_ITEM(result, 0, key); /* steals reference */ - PyTuple_SET_ITEM(result, 1, value); /* steals reference */ return result; fail: @@ -4180,6 +4195,7 @@ dictitems_iter(_PyDictViewObject *dv) static int dictitems_contains(_PyDictViewObject *dv, PyObject *obj) { + int result; PyObject *key, *value, *found; if (dv->dv_dict == NULL) return 0; @@ -4193,7 +4209,10 @@ dictitems_contains(_PyDictViewObject *dv, PyObject *obj) return -1; return 0; } - return PyObject_RichCompareBool(value, found, Py_EQ); + Py_INCREF(found); + result = PyObject_RichCompareBool(value, found, Py_EQ); + Py_DECREF(found); + return result; } static PySequenceMethods dictitems_as_sequence = { From b5bf7e85b74070973bff3e69990f948a0ed5efdb Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Sat, 20 May 2017 23:23:03 -0700 Subject: [PATCH 0318/2287] bpo-29976: urllib.parse clarify '' in scheme values. (GH-984) (GH-1692) (cherry picked from commit 906f5330b9c9a74cad1cf27fddaf77e99dff9edd) --- Lib/urllib/parse.py | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 32de25b374da93..888247b8e90f56 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -38,29 +38,37 @@ "DefragResult", "ParseResult", "SplitResult", "DefragResultBytes", "ParseResultBytes", "SplitResultBytes"] -# A classification of schemes ('' means apply by default) -uses_relative = ['ftp', 'http', 'gopher', 'nntp', 'imap', +# A classification of schemes. +# The empty string classifies URLs with no scheme specified, +# being the default value returned by “urlsplit” and “urlparse”. + +uses_relative = ['', 'ftp', 'http', 'gopher', 'nntp', 'imap', 'wais', 'file', 'https', 'shttp', 'mms', - 'prospero', 'rtsp', 'rtspu', '', 'sftp', + 'prospero', 'rtsp', 'rtspu', 'sftp', 'svn', 'svn+ssh', 'ws', 'wss'] -uses_netloc = ['ftp', 'http', 'gopher', 'nntp', 'telnet', + +uses_netloc = ['', 'ftp', 'http', 'gopher', 'nntp', 'telnet', 'imap', 'wais', 'file', 'mms', 'https', 'shttp', - 'snews', 'prospero', 'rtsp', 'rtspu', 'rsync', '', + 'snews', 'prospero', 'rtsp', 'rtspu', 'rsync', 'svn', 'svn+ssh', 'sftp', 'nfs', 'git', 'git+ssh', 'ws', 'wss'] -uses_params = ['ftp', 'hdl', 'prospero', 'http', 'imap', + +uses_params = ['', 'ftp', 'hdl', 'prospero', 'http', 'imap', 'https', 'shttp', 'rtsp', 'rtspu', 'sip', 'sips', - 'mms', '', 'sftp', 'tel'] + 'mms', 'sftp', 'tel'] # These are not actually used anymore, but should stay for backwards # compatibility. (They are undocumented, but have a public-looking name.) + non_hierarchical = ['gopher', 'hdl', 'mailto', 'news', 'telnet', 'wais', 'imap', 'snews', 'sip', 'sips'] -uses_query = ['http', 'wais', 'imap', 'https', 'shttp', 'mms', - 'gopher', 'rtsp', 'rtspu', 'sip', 'sips', ''] -uses_fragment = ['ftp', 'hdl', 'http', 'gopher', 'news', + +uses_query = ['', 'http', 'wais', 'imap', 'https', 'shttp', 'mms', + 'gopher', 'rtsp', 'rtspu', 'sip', 'sips'] + +uses_fragment = ['', 'ftp', 'hdl', 'http', 'gopher', 'news', 'nntp', 'wais', 'https', 'shttp', 'snews', - 'file', 'prospero', ''] + 'file', 'prospero'] # Characters valid in scheme names scheme_chars = ('abcdefghijklmnopqrstuvwxyz' From cf5c1be8f6e0bc90280f66c65bb49808f01bfb3a Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 21 May 2017 10:35:39 +0300 Subject: [PATCH 0319/2287] [3.6] bpo-30415: Add new tests for the fnmatch module. (GH-1684) (#1694) (cherry picked from commit 8175547) --- Lib/test/test_fnmatch.py | 64 ++++++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_fnmatch.py b/Lib/test/test_fnmatch.py index fb7424624bb041..78245c3ab1a176 100644 --- a/Lib/test/test_fnmatch.py +++ b/Lib/test/test_fnmatch.py @@ -1,18 +1,19 @@ """Test cases for the fnmatch module.""" import unittest +import os from fnmatch import fnmatch, fnmatchcase, translate, filter class FnmatchTestCase(unittest.TestCase): - def check_match(self, filename, pattern, should_match=1, fn=fnmatch): + def check_match(self, filename, pattern, should_match=True, fn=fnmatch): if should_match: self.assertTrue(fn(filename, pattern), "expected %r to match pattern %r" % (filename, pattern)) else: - self.assertTrue(not fn(filename, pattern), + self.assertFalse(fn(filename, pattern), "expected %r not to match pattern %r" % (filename, pattern)) @@ -26,15 +27,15 @@ def test_fnmatch(self): check('abc', '*') check('abc', 'ab[cd]') check('abc', 'ab[!de]') - check('abc', 'ab[de]', 0) - check('a', '??', 0) - check('a', 'b', 0) + check('abc', 'ab[de]', False) + check('a', '??', False) + check('a', 'b', False) # these test that '\' is handled correctly in character sets; # see SF bug #409651 check('\\', r'[\]') check('a', r'[!\]') - check('\\', r'[!\]', 0) + check('\\', r'[!\]', False) # test that filenames with newlines in them are handled correctly. # http://bugs.python.org/issue6665 @@ -51,14 +52,38 @@ def test_mix_bytes_str(self): def test_fnmatchcase(self): check = self.check_match - check('AbC', 'abc', 0, fnmatchcase) - check('abc', 'AbC', 0, fnmatchcase) + check('abc', 'abc', True, fnmatchcase) + check('AbC', 'abc', False, fnmatchcase) + check('abc', 'AbC', False, fnmatchcase) + check('AbC', 'AbC', True, fnmatchcase) + + check('usr/bin', 'usr/bin', True, fnmatchcase) + check('usr\\bin', 'usr/bin', False, fnmatchcase) + check('usr/bin', 'usr\\bin', False, fnmatchcase) + check('usr\\bin', 'usr\\bin', True, fnmatchcase) def test_bytes(self): self.check_match(b'test', b'te*') self.check_match(b'test\xff', b'te*\xff') self.check_match(b'foo\nbar', b'foo*') + def test_case(self): + ignorecase = os.path.normcase('ABC') == os.path.normcase('abc') + check = self.check_match + check('abc', 'abc') + check('AbC', 'abc', ignorecase) + check('abc', 'AbC', ignorecase) + check('AbC', 'AbC') + + def test_sep(self): + normsep = os.path.normcase('\\') == os.path.normcase('/') + check = self.check_match + check('usr/bin', 'usr/bin') + check('usr\\bin', 'usr/bin', normsep) + check('usr/bin', 'usr\\bin', normsep) + check('usr\\bin', 'usr\\bin') + + class TranslateTestCase(unittest.TestCase): def test_translate(self): @@ -75,7 +100,28 @@ def test_translate(self): class FilterTestCase(unittest.TestCase): def test_filter(self): - self.assertEqual(filter(['a', 'b'], 'a'), ['a']) + self.assertEqual(filter(['Python', 'Ruby', 'Perl', 'Tcl'], 'P*'), + ['Python', 'Perl']) + self.assertEqual(filter([b'Python', b'Ruby', b'Perl', b'Tcl'], b'P*'), + [b'Python', b'Perl']) + + def test_mix_bytes_str(self): + self.assertRaises(TypeError, filter, ['test'], b'*') + self.assertRaises(TypeError, filter, [b'test'], '*') + + def test_case(self): + ignorecase = os.path.normcase('P') == os.path.normcase('p') + self.assertEqual(filter(['Test.py', 'Test.rb', 'Test.PL'], '*.p*'), + ['Test.py', 'Test.PL'] if ignorecase else ['Test.py']) + self.assertEqual(filter(['Test.py', 'Test.rb', 'Test.PL'], '*.P*'), + ['Test.py', 'Test.PL'] if ignorecase else ['Test.PL']) + + def test_sep(self): + normsep = os.path.normcase('\\') == os.path.normcase('/') + self.assertEqual(filter(['usr/bin', 'usr', 'usr\\lib'], 'usr/*'), + ['usr/bin', 'usr\\lib'] if normsep else ['usr/bin']) + self.assertEqual(filter(['usr/bin', 'usr', 'usr\\lib'], 'usr\\*'), + ['usr/bin', 'usr\\lib'] if normsep else ['usr\\lib']) if __name__ == "__main__": From 0702cc01fa3dc52087a5d468fc5a4984f3697446 Mon Sep 17 00:00:00 2001 From: delirious-lettuce Date: Sun, 21 May 2017 15:26:01 -0600 Subject: [PATCH 0320/2287] [3.6] Fix typos in multiple `.rst` files (GH-1668) (#1702) (cherry picked from commit 3378b2062c7fbb77a9b5e6d315d6b94160fac69a) --- Doc/c-api/exceptions.rst | 8 ++++---- Doc/howto/logging-cookbook.rst | 2 +- Doc/library/cmd.rst | 4 ++-- Doc/library/email.compat32-message.rst | 2 +- Doc/library/email.contentmanager.rst | 4 ++-- Doc/library/email.errors.rst | 4 ++-- Doc/library/email.generator.rst | 4 ++-- Doc/library/email.headerregistry.rst | 2 +- Doc/library/email.message.rst | 10 +++++----- Doc/library/email.mime.rst | 2 +- Doc/library/email.parser.rst | 2 +- Doc/library/email.policy.rst | 6 +++--- Doc/library/exceptions.rst | 2 +- Doc/library/sunau.rst | 2 +- Doc/library/turtle.rst | 2 +- Doc/library/xml.dom.pulldom.rst | 2 +- Doc/reference/expressions.rst | 2 +- Lib/email/architecture.rst | 2 +- 18 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index c75408db770a22..2bc1bd876a2fe2 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -295,7 +295,7 @@ an error value). :c:data:`PyExc_Warning` is a subclass of :c:data:`PyExc_Exception`; the default warning category is :c:data:`PyExc_RuntimeWarning`. The standard Python warning categories are available as global variables whose names are - enumerated at :ref:`standarwarningcategories`. + enumerated at :ref:`standardwarningcategories`. For information about warning control, see the documentation for the :mod:`warnings` module and the :option:`-W` option in the command line @@ -958,7 +958,7 @@ Notes: Only defined on Windows; protect code that uses this by testing that the preprocessor macro ``MS_WINDOWS`` is defined. -.. _standarwarningcategories: +.. _standardwarningcategories: Standard Warning Categories =========================== @@ -971,7 +971,7 @@ the variables: .. index:: single: PyExc_Warning single: PyExc_BytesWarning - single: PyExc_DepricationWarning + single: PyExc_DeprecationWarning single: PyExc_FutureWarning single: PyExc_ImportWarning single: PyExc_PendingDeprecationWarning @@ -994,7 +994,7 @@ the variables: +------------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_ImportWarning` | :exc:`ImportWarning` | | +------------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_PendingDepricationWarning`| :exc:`PendingDeprecationWarning`| | +| :c:data:`PyExc_PendingDeprecationWarning`| :exc:`PendingDeprecationWarning`| | +------------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_ResourceWarning` | :exc:`ResourceWarning` | | +------------------------------------------+---------------------------------+----------+ diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst index bb79bb1748fb9c..6498ea56957719 100644 --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -1683,7 +1683,7 @@ Implementing structured logging ------------------------------- Although most logging messages are intended for reading by humans, and thus not -readily machine-parseable, there might be cirumstances where you want to output +readily machine-parseable, there might be circumstances where you want to output messages in a structured format which *is* capable of being parsed by a program (without needing complex regular expressions to parse the log message). This is straightforward to achieve using the logging package. There are a number of diff --git a/Doc/library/cmd.rst b/Doc/library/cmd.rst index f40cfdfd592163..3b4a8ff440e7ae 100644 --- a/Doc/library/cmd.rst +++ b/Doc/library/cmd.rst @@ -266,10 +266,10 @@ immediate playback:: 'Draw circle with given radius an options extent and steps: CIRCLE 50' circle(*parse(arg)) def do_position(self, arg): - 'Print the current turle position: POSITION' + 'Print the current turtle position: POSITION' print('Current position is %d %d\n' % position()) def do_heading(self, arg): - 'Print the current turle heading in degrees: HEADING' + 'Print the current turtle heading in degrees: HEADING' print('Current heading is %d\n' % (heading(),)) def do_color(self, arg): 'Set the color: COLOR BLUE' diff --git a/Doc/library/email.compat32-message.rst b/Doc/library/email.compat32-message.rst index b0707646e64ac6..7e11782face074 100644 --- a/Doc/library/email.compat32-message.rst +++ b/Doc/library/email.compat32-message.rst @@ -67,7 +67,7 @@ Here are the methods of the :class:`Message` class: Return the entire message flattened as a string. When optional *unixfrom* is true, the envelope header is included in the returned string. - *unixfrom* defaults to ``False``. For backward compabitility reasons, + *unixfrom* defaults to ``False``. For backward compatibility reasons, *maxheaderlen* defaults to ``0``, so if you want a different value you must override it explicitly (the value specified for *max_line_length* in the policy will be ignored by this method). The *policy* argument may be diff --git a/Doc/library/email.contentmanager.rst b/Doc/library/email.contentmanager.rst index 57743d5a29f1dd..f56836ae2d2781 100644 --- a/Doc/library/email.contentmanager.rst +++ b/Doc/library/email.contentmanager.rst @@ -157,7 +157,7 @@ Currently the email package provides only one concrete content manager, MIME charset name, use the standard charset instead. If *cte* is set, encode the payload using the specified content transfer - encoding, and set the :mailheader:`Content-Transfer-Endcoding` header to + encoding, and set the :mailheader:`Content-Transfer-Encoding` header to that value. Possible values for *cte* are ``quoted-printable``, ``base64``, ``7bit``, ``8bit``, and ``binary``. If the input cannot be encoded in the specified encoding (for example, specifying a *cte* of @@ -203,5 +203,5 @@ Currently the email package provides only one concrete content manager, .. rubric:: Footnotes -.. [1] Oringally added in 3.4 as a :term:`provisional module ` diff --git a/Doc/library/email.errors.rst b/Doc/library/email.errors.rst index 2d0d1923cd25c4..5838767b18f742 100644 --- a/Doc/library/email.errors.rst +++ b/Doc/library/email.errors.rst @@ -102,9 +102,9 @@ All defect classes are subclassed from :class:`email.errors.MessageDefect`. return false even though its content type claims to be :mimetype:`multipart`. * :class:`InvalidBase64PaddingDefect` -- When decoding a block of base64 - enocded bytes, the padding was not correct. Enough padding is added to + encoded bytes, the padding was not correct. Enough padding is added to perform the decode, but the resulting decoded bytes may be invalid. * :class:`InvalidBase64CharactersDefect` -- When decoding a block of base64 - enocded bytes, characters outside the base64 alphebet were encountered. + encoded bytes, characters outside the base64 alphabet were encountered. The characters are ignored, but the resulting decoded bytes may be invalid. diff --git a/Doc/library/email.generator.rst b/Doc/library/email.generator.rst index ab0fbc29d1ec85..1e64e1066c7da5 100644 --- a/Doc/library/email.generator.rst +++ b/Doc/library/email.generator.rst @@ -88,8 +88,8 @@ over channels that are not "8 bit clean". If ``cte_type`` is ``7bit``, convert the bytes with the high bit set as needed using an ASCII-compatible :mailheader:`Content-Transfer-Encoding`. That is, transform parts with non-ASCII - :mailheader:`Cotnent-Transfer-Encoding` - (:mailheader:`Content-Transfer-Encoding: 8bit`) to an ASCII compatibile + :mailheader:`Content-Transfer-Encoding` + (:mailheader:`Content-Transfer-Encoding: 8bit`) to an ASCII compatible :mailheader:`Content-Transfer-Encoding`, and encode RFC-invalid non-ASCII bytes in headers using the MIME ``unknown-8bit`` character set, thus rendering them RFC-compliant. diff --git a/Doc/library/email.headerregistry.rst b/Doc/library/email.headerregistry.rst index 2c830cfd81fb47..ce283c6b596cf2 100644 --- a/Doc/library/email.headerregistry.rst +++ b/Doc/library/email.headerregistry.rst @@ -451,5 +451,5 @@ construct structured values to assign to specific headers. .. rubric:: Footnotes -.. [1] Oringally added in 3.3 as a :term:`provisional module ` diff --git a/Doc/library/email.message.rst b/Doc/library/email.message.rst index d36e769f763cd8..261d0d62cfe618 100644 --- a/Doc/library/email.message.rst +++ b/Doc/library/email.message.rst @@ -52,7 +52,7 @@ message objects. .. class:: EmailMessage(policy=default) - If *policy* is specified use the rules it specifies to udpate and serialize + If *policy* is specified use the rules it specifies to update and serialize the representation of the message. If *policy* is not set, use the :class:`~email.policy.default` policy, which follows the rules of the email RFCs except for line endings (instead of the RFC mandated ``\r\n``, it uses @@ -63,7 +63,7 @@ message objects. Return the entire message flattened as a string. When optional *unixfrom* is true, the envelope header is included in the returned - string. *unixfrom* defaults to ``False``. For backward compabitility + string. *unixfrom* defaults to ``False``. For backward compatibility with the base :class:`~email.message.Message` class *maxheaderlen* is accepted, but defaults to ``None``, which means that by default the line length is controlled by the @@ -213,7 +213,7 @@ message objects. del msg['subject'] msg['subject'] = 'Python roolz!' - If the :mod:`policy` defines certain haders to be unique (as the standard + If the :mod:`policy` defines certain headers to be unique (as the standard policies do), this method may raise a :exc:`ValueError` when an attempt is made to assign a value to such a header when one already exists. This behavior is intentional for consistency's sake, but do not depend on it @@ -558,7 +558,7 @@ message objects. the part a candidate match if the value of the header is ``inline``. If none of the candidates matches any of the preferences in - *preferneclist*, return ``None``. + *preferencelist*, return ``None``. Notes: (1) For most applications the only *preferencelist* combinations that really make sense are ``('plain',)``, ``('html', 'plain')``, and the @@ -746,6 +746,6 @@ message objects. .. rubric:: Footnotes -.. [1] Oringally added in 3.4 as a :term:`provisional module `. Docs for legacy message class moved to :ref:`compat32_message`. diff --git a/Doc/library/email.mime.rst b/Doc/library/email.mime.rst index d9dae9f0b993c4..f37f6aa28dec7d 100644 --- a/Doc/library/email.mime.rst +++ b/Doc/library/email.mime.rst @@ -242,7 +242,7 @@ Here are the classes: Unless the *_charset* argument is explicitly set to ``None``, the MIMEText object created will have both a :mailheader:`Content-Type` header - with a ``charset`` parameter, and a :mailheader:`Content-Transfer-Endcoding` + with a ``charset`` parameter, and a :mailheader:`Content-Transfer-Encoding` header. This means that a subsequent ``set_payload`` call will not result in an encoded payload, even if a charset is passed in the ``set_payload`` command. You can "reset" this behavior by deleting the diff --git a/Doc/library/email.parser.rst b/Doc/library/email.parser.rst index c323ebc6401b99..dea409d223da4c 100644 --- a/Doc/library/email.parser.rst +++ b/Doc/library/email.parser.rst @@ -139,7 +139,7 @@ message body, instead setting the payload to the raw body. .. class:: BytesParser(_class=None, *, policy=policy.compat32) Create a :class:`BytesParser` instance. The *_class* and *policy* - arguments have the same meaning and sematnics as the *_factory* + arguments have the same meaning and semantics as the *_factory* and *policy* arguments of :class:`BytesFeedParser`. Note: **The policy keyword should always be specified**; The default will diff --git a/Doc/library/email.policy.rst b/Doc/library/email.policy.rst index 8a418778b8e0fc..8e7076259810f5 100644 --- a/Doc/library/email.policy.rst +++ b/Doc/library/email.policy.rst @@ -276,7 +276,7 @@ added matters. To illustrate:: Called when a header is added to an :class:`~email.message.EmailMessage` or :class:`~email.message.Message` object. If the returned value is not ``0`` or ``None``, and there are already a number of headers with the - name *name* greather than or equal to the value returned, a + name *name* greater than or equal to the value returned, a :exc:`ValueError` is raised. Because the default behavior of ``Message.__setitem__`` is to append the @@ -533,7 +533,7 @@ more closely to the RFCs relevant to their domains. The same as ``SMTP`` except that :attr:`~EmailPolicy.utf8` is ``True``. Useful for serializing messages to a message store without using encoded - words in the headers. Should only be used for SMTP trasmission if the + words in the headers. Should only be used for SMTP transmission if the sender or recipient addresses have non-ASCII characters (the :meth:`smtplib.SMTP.send_message` method handles this automatically). @@ -647,5 +647,5 @@ The header objects and their attributes are described in .. rubric:: Footnotes -.. [1] Oringally added in 3.3 as a :term:`provisional feature `. diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst index a428f5165fc8d2..a6b20a5ac95b1b 100644 --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -243,7 +243,7 @@ The following exceptions are the exceptions that are usually raised. .. note:: - It should not be used to indicate that an operater or method is not + It should not be used to indicate that an operator or method is not meant to be supported at all -- in that case either leave the operator / method undefined or, if a subclass, set it to :data:`None`. diff --git a/Doc/library/sunau.rst b/Doc/library/sunau.rst index 1ecc7a7cf92bd0..c8357e4fcc85e2 100644 --- a/Doc/library/sunau.rst +++ b/Doc/library/sunau.rst @@ -118,7 +118,7 @@ AU_read objects, as returned by :func:`.open` above, have the following methods: .. method:: AU_read.getnchannels() - Returns number of audio channels (1 for mone, 2 for stereo). + Returns number of audio channels (1 for mono, 2 for stereo). .. method:: AU_read.getsampwidth() diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst index 1986972549c503..31761be02b78ee 100644 --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -1797,7 +1797,7 @@ Input methods :param prompt: string Pop up a dialog window for input of a string. Parameter title is - the title of the dialog window, propmt is a text mostly describing + the title of the dialog window, prompt is a text mostly describing what information to input. Return the string input. If the dialog is canceled, return ``None``. :: diff --git a/Doc/library/xml.dom.pulldom.rst b/Doc/library/xml.dom.pulldom.rst index b50255434de945..5c0f469ad7a5cf 100644 --- a/Doc/library/xml.dom.pulldom.rst +++ b/Doc/library/xml.dom.pulldom.rst @@ -108,7 +108,7 @@ DOMEventStream Objects :class:`xml.dom.minidom.Element` if event equals :data:`START_ELEMENT` or :data:`END_ELEMENT` or :class:`xml.dom.minidom.Text` if event equals :data:`CHARACTERS`. - The current node does not contain informations about its children, unless + The current node does not contain information about its children, unless :func:`expandNode` is called. .. method:: expandNode(node) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 43d2690cbba91b..d92be975aacef3 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -636,7 +636,7 @@ which are used to control the execution of a generator function. without yielding another value, an :exc:`StopAsyncIteration` exception is raised by the awaitable. If the generator function does not catch the passed-in exception, or - raises a different exception, then when the awaitalbe is run that exception + raises a different exception, then when the awaitable is run that exception propagates to the caller of the awaitable. .. index:: exception: GeneratorExit diff --git a/Lib/email/architecture.rst b/Lib/email/architecture.rst index 78572ae63b4d2b..fcd10bde1325bb 100644 --- a/Lib/email/architecture.rst +++ b/Lib/email/architecture.rst @@ -66,7 +66,7 @@ data payloads. Message Lifecycle ----------------- -The general lifecyle of a message is: +The general lifecycle of a message is: Creation A `Message` object can be created by a Parser, or it can be From 54af41d42eebbe4c6afe6b34ebb0fb550de1e7ba Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Tue, 23 May 2017 01:03:00 +0800 Subject: [PATCH 0321/2287] bpo-30003: Fix handling escape characters in HZ codec (#1556) (#1719) --- Lib/test/test_codecencodings_cn.py | 4 ++++ Misc/NEWS | 3 +++ Modules/cjkcodecs/_codecs_cn.c | 25 ++++++++++++------------- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/Lib/test/test_codecencodings_cn.py b/Lib/test/test_codecencodings_cn.py index c8a410c2e0398c..2a450718d5aae5 100644 --- a/Lib/test/test_codecencodings_cn.py +++ b/Lib/test/test_codecencodings_cn.py @@ -86,6 +86,10 @@ class Test_HZ(multibytecodec_support.TestBase, unittest.TestCase): (b'ab~{\x81\x81\x41\x44~}cd', 'replace', 'ab\uFFFD\uFFFD\u804Acd'), (b'ab~{\x41\x44~}cd', 'replace', 'ab\u804Acd'), (b"ab~{\x79\x79\x41\x44~}cd", "replace", "ab\ufffd\ufffd\u804acd"), + # issue 30003 + ('ab~cd', 'strict', b'ab~~cd'), # escape ~ + (b'~{Dc~~:C~}', 'strict', None), # ~~ only in ASCII mode + (b'~{Dc~\n:C~}', 'strict', None), # ~\n only in ASCII mode ) if __name__ == "__main__": diff --git a/Misc/NEWS b/Misc/NEWS index d3c6868c4e5103..ae15eefcd46ad4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -43,6 +43,9 @@ Core and Builtins Library ------- +- bpo-30003: Fix handling escape characters in HZ codec. Based on patch + by Ma Lin. + - bpo-30301: Fix AttributeError when using SimpleQueue.empty() under *spawn* and *forkserver* start methods. diff --git a/Modules/cjkcodecs/_codecs_cn.c b/Modules/cjkcodecs/_codecs_cn.c index bda175c55d1323..1fcc220b8db0f4 100644 --- a/Modules/cjkcodecs/_codecs_cn.c +++ b/Modules/cjkcodecs/_codecs_cn.c @@ -350,15 +350,17 @@ ENCODER(hz) DBCHAR code; if (c < 0x80) { - if (state->i == 0) { - WRITEBYTE1((unsigned char)c); - NEXT(1, 1); - } - else { - WRITEBYTE3('~', '}', (unsigned char)c); - NEXT(1, 3); + if (state->i) { + WRITEBYTE2('~', '}'); + NEXT_OUT(2); state->i = 0; } + WRITEBYTE1((unsigned char)c); + NEXT(1, 1); + if (c == '~') { + WRITEBYTE1('~'); + NEXT_OUT(1); + } continue; } @@ -409,17 +411,14 @@ DECODER(hz) unsigned char c2 = INBYTE2; REQUIRE_INBUF(2); - if (c2 == '~') { + if (c2 == '~' && state->i == 0) OUTCHAR('~'); - NEXT_IN(2); - continue; - } else if (c2 == '{' && state->i == 0) state->i = 1; /* set GB */ + else if (c2 == '\n' && state->i == 0) + ; /* line-continuation */ else if (c2 == '}' && state->i == 1) state->i = 0; /* set ASCII */ - else if (c2 == '\n') - ; /* line-continuation */ else return 1; NEXT_IN(2); From 3d3b189f8ef321ccfb144a46d50892939d6004aa Mon Sep 17 00:00:00 2001 From: Mariatta Date: Mon, 22 May 2017 14:36:19 -0700 Subject: [PATCH 0322/2287] [3.6] bpo-30372: Clarify that '__builtins__' is a CPython Implementation detail (GH-1725) (GH-1727) (cherry picked from commit 43c8a9e39bb2d4f25ed7ae17a55f34e375d1868b) --- Doc/reference/executionmodel.rst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Doc/reference/executionmodel.rst b/Doc/reference/executionmodel.rst index f0dbbd1edf6321..d08abdf3343fe4 100644 --- a/Doc/reference/executionmodel.rst +++ b/Doc/reference/executionmodel.rst @@ -164,15 +164,6 @@ Builtins and restricted execution .. index:: pair: restricted; execution -The builtins namespace associated with the execution of a code block is actually -found by looking up the name ``__builtins__`` in its global namespace; this -should be a dictionary or a module (in the latter case the module's dictionary -is used). By default, when in the :mod:`__main__` module, ``__builtins__`` is -the built-in module :mod:`builtins`; when in any other module, -``__builtins__`` is an alias for the dictionary of the :mod:`builtins` module -itself. ``__builtins__`` can be set to a user-created dictionary to create a -weak form of restricted execution. - .. impl-detail:: Users should not touch ``__builtins__``; it is strictly an implementation @@ -180,6 +171,15 @@ weak form of restricted execution. :keyword:`import` the :mod:`builtins` module and modify its attributes appropriately. +The builtins namespace associated with the execution of a code block +is actually found by looking up the name ``__builtins__`` in its +global namespace; this should be a dictionary or a module (in the +latter case the module's dictionary is used). By default, when in the +:mod:`__main__` module, ``__builtins__`` is the built-in module +:mod:`builtins`; when in any other module, ``__builtins__`` is an +alias for the dictionary of the :mod:`builtins` module itself. + + .. _dynamic-features: Interaction with dynamic features From 1398b1bc7d80df5bde17041e7ec0a3bdbf54b19e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= Date: Mon, 22 May 2017 16:35:15 -0700 Subject: [PATCH 0323/2287] [3.6] Make rb'' strings work in lib2to3 (GH-1724) (#1730) This partially solves bpo-23894. (cherry picked from commit 0c4aca54dcf0c54f299c78aa71fe8f48ff04f9d9) --- Lib/lib2to3/pgen2/tokenize.py | 23 ++++++++++++++++------- Lib/lib2to3/tests/test_parser.py | 21 +++++++++++++++++++++ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/Lib/lib2to3/pgen2/tokenize.py b/Lib/lib2to3/pgen2/tokenize.py index fba0fa2c00dccd..9a0cc1ea4086c7 100644 --- a/Lib/lib2to3/pgen2/tokenize.py +++ b/Lib/lib2to3/pgen2/tokenize.py @@ -74,10 +74,11 @@ def maybe(*choices): return group(*choices) + '?' Single3 = r"[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*'''" # Tail end of """ string. Double3 = r'[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""' -Triple = group("[ubUB]?[rR]?'''", '[ubUB]?[rR]?"""') +_litprefix = r"(?:[uUrRbB]|[rR][bB]|[bBuU][rR])?" +Triple = group(_litprefix + "'''", _litprefix + '"""') # Single-line ' or " string. -String = group(r"[uU]?[rR]?'[^\n'\\]*(?:\\.[^\n'\\]*)*'", - r'[uU]?[rR]?"[^\n"\\]*(?:\\.[^\n"\\]*)*"') +String = group(_litprefix + r"'[^\n'\\]*(?:\\.[^\n'\\]*)*'", + _litprefix + r'"[^\n"\\]*(?:\\.[^\n"\\]*)*"') # Because of leftmost-then-longest match semantics, be sure to put the # longest operators first (e.g., if = came before ==, == would get @@ -95,9 +96,9 @@ def maybe(*choices): return group(*choices) + '?' Token = Ignore + PlainToken # First (or only) line of ' or " string. -ContStr = group(r"[uUbB]?[rR]?'[^\n'\\]*(?:\\.[^\n'\\]*)*" + +ContStr = group(_litprefix + r"'[^\n'\\]*(?:\\.[^\n'\\]*)*" + group("'", r'\\\r?\n'), - r'[uUbB]?[rR]?"[^\n"\\]*(?:\\.[^\n"\\]*)*' + + _litprefix + r'"[^\n"\\]*(?:\\.[^\n"\\]*)*' + group('"', r'\\\r?\n')) PseudoExtras = group(r'\\\r?\n', Comment, Triple) PseudoToken = Whitespace + group(PseudoExtras, Number, Funny, ContStr, Name) @@ -111,6 +112,7 @@ def maybe(*choices): return group(*choices) + '?' "b'''": single3prog, 'b"""': double3prog, "ur'''": single3prog, 'ur"""': double3prog, "br'''": single3prog, 'br"""': double3prog, + "rb'''": single3prog, 'rb"""': double3prog, "R'''": single3prog, 'R"""': double3prog, "U'''": single3prog, 'U"""': double3prog, "B'''": single3prog, 'B"""': double3prog, @@ -120,6 +122,9 @@ def maybe(*choices): return group(*choices) + '?' "bR'''": single3prog, 'bR"""': double3prog, "Br'''": single3prog, 'Br"""': double3prog, "BR'''": single3prog, 'BR"""': double3prog, + "rB'''": single3prog, 'rB"""': double3prog, + "Rb'''": single3prog, 'Rb"""': double3prog, + "RB'''": single3prog, 'RB"""': double3prog, 'r': None, 'R': None, 'u': None, 'U': None, 'b': None, 'B': None} @@ -132,7 +137,9 @@ def maybe(*choices): return group(*choices) + '?' "ur'''", 'ur"""', "Ur'''", 'Ur"""', "uR'''", 'uR"""', "UR'''", 'UR"""', "br'''", 'br"""', "Br'''", 'Br"""', - "bR'''", 'bR"""', "BR'''", 'BR"""',): + "bR'''", 'bR"""', "BR'''", 'BR"""', + "rb'''", 'rb"""', "Rb'''", 'Rb"""', + "rB'''", 'rB"""', "RB'''", 'RB"""',): triple_quoted[t] = t single_quoted = {} for t in ("'", '"', @@ -142,7 +149,9 @@ def maybe(*choices): return group(*choices) + '?' "ur'", 'ur"', "Ur'", 'Ur"', "uR'", 'uR"', "UR'", 'UR"', "br'", 'br"', "Br'", 'Br"', - "bR'", 'bR"', "BR'", 'BR"', ): + "bR'", 'bR"', "BR'", 'BR"', + "rb'", 'rb"', "Rb'", 'Rb"', + "rB'", 'rB"', "RB'", 'RB"',): single_quoted[t] = t tabsize = 8 diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py index 9a969e8ec04741..c79611db56522a 100644 --- a/Lib/lib2to3/tests/test_parser.py +++ b/Lib/lib2to3/tests/test_parser.py @@ -320,6 +320,7 @@ def test_5(self): def test_6(self): self.validate("lst: List[int] = []") + class TestExcept(GrammarTest): def test_new(self): s = """ @@ -338,6 +339,26 @@ def test_old(self): self.validate(s) +class TestStringLiterals(GrammarTest): + prefixes = ("'", '"', + "r'", 'r"', "R'", 'R"', + "u'", 'u"', "U'", 'U"', + "b'", 'b"', "B'", 'B"', + "ur'", 'ur"', "Ur'", 'Ur"', + "uR'", 'uR"', "UR'", 'UR"', + "br'", 'br"', "Br'", 'Br"', + "bR'", 'bR"', "BR'", 'BR"', + "rb'", 'rb"', "Rb'", 'Rb"', + "rB'", 'rB"', "RB'", 'RB"',) + + def test_lit(self): + for pre in self.prefixes: + single = "{p}spamspamspam{s}".format(p=pre, s=pre[-1]) + self.validate(single) + triple = "{p}{s}{s}eggs{s}{s}{s}".format(p=pre, s=pre[-1]) + self.validate(triple) + + # Adapted from Python 3's Lib/test/test_grammar.py:GrammarTests.testAtoms class TestSetLiteral(GrammarTest): def test_1(self): From d29feccec3ce3dcd9ab3100f8956171c70ec3027 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= Date: Mon, 22 May 2017 22:23:05 -0700 Subject: [PATCH 0324/2287] [3.6] bpo-30395 _PyGILState_Reinit deadlock fix (GH-1734) (#1740) head_lock could be held by another thread when fork happened. We should reset it to avoid deadlock. (cherry picked from commit f82c951d1c5416f3550d544e50ff5662d3836e73) --- Misc/ACKS | 1 + Python/pystate.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/Misc/ACKS b/Misc/ACKS index 7109ccbe851384..b8bac248d98867 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -552,6 +552,7 @@ Eric Groo Daniel Andrade Groppe Dag Gruneau Filip Gruszczyński +Andrii Grynenko Grzegorz Grzywacz Thomas Guettler Yuyang Guo diff --git a/Python/pystate.c b/Python/pystate.c index 65c244e6f73617..ccb0092c42b3a4 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -743,6 +743,10 @@ _PyGILState_Fini(void) void _PyGILState_Reinit(void) { +#ifdef WITH_THREAD + head_mutex = NULL; + HEAD_INIT(); +#endif PyThreadState *tstate = PyGILState_GetThisThreadState(); PyThread_delete_key(autoTLSkey); if ((autoTLSkey = PyThread_create_key()) == -1) From e8412e684ed741df246e8430f4911b31b0d8be1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= Date: Mon, 22 May 2017 22:23:29 -0700 Subject: [PATCH 0325/2287] [3.6] bpo-23894: make lib2to3 recognize f-strings (GH-1733) (#1737) Note: this doesn't unpack f-strings into the underlying JoinedStr AST. Ideally we'd fully implement JoinedStr here but given its additional complexity, I think this is worth bandaiding as is. This unblocks tools like https://github.com/google/yapf to format 3.6 syntax using f-strings. (cherry picked from commit 1b9530c536664276ce866ae602ce04adce0810e1) --- Lib/lib2to3/pgen2/tokenize.py | 7 ++++++- Lib/lib2to3/tests/test_parser.py | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Lib/lib2to3/pgen2/tokenize.py b/Lib/lib2to3/pgen2/tokenize.py index 9a0cc1ea4086c7..45afc5f4e53fcf 100644 --- a/Lib/lib2to3/pgen2/tokenize.py +++ b/Lib/lib2to3/pgen2/tokenize.py @@ -74,7 +74,7 @@ def maybe(*choices): return group(*choices) + '?' Single3 = r"[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*'''" # Tail end of """ string. Double3 = r'[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""' -_litprefix = r"(?:[uUrRbB]|[rR][bB]|[bBuU][rR])?" +_litprefix = r"(?:[uUrRbBfF]|[rR][bB]|[bBuU][rR])?" Triple = group(_litprefix + "'''", _litprefix + '"""') # Single-line ' or " string. String = group(_litprefix + r"'[^\n'\\]*(?:\\.[^\n'\\]*)*'", @@ -110,12 +110,14 @@ def maybe(*choices): return group(*choices) + '?' "r'''": single3prog, 'r"""': double3prog, "u'''": single3prog, 'u"""': double3prog, "b'''": single3prog, 'b"""': double3prog, + "f'''": single3prog, 'f"""': double3prog, "ur'''": single3prog, 'ur"""': double3prog, "br'''": single3prog, 'br"""': double3prog, "rb'''": single3prog, 'rb"""': double3prog, "R'''": single3prog, 'R"""': double3prog, "U'''": single3prog, 'U"""': double3prog, "B'''": single3prog, 'B"""': double3prog, + "F'''": single3prog, 'F"""': double3prog, "uR'''": single3prog, 'uR"""': double3prog, "Ur'''": single3prog, 'Ur"""': double3prog, "UR'''": single3prog, 'UR"""': double3prog, @@ -127,6 +129,7 @@ def maybe(*choices): return group(*choices) + '?' "RB'''": single3prog, 'RB"""': double3prog, 'r': None, 'R': None, 'u': None, 'U': None, + 'f': None, 'F': None, 'b': None, 'B': None} triple_quoted = {} @@ -134,6 +137,7 @@ def maybe(*choices): return group(*choices) + '?' "r'''", 'r"""', "R'''", 'R"""', "u'''", 'u"""', "U'''", 'U"""', "b'''", 'b"""', "B'''", 'B"""', + "f'''", 'f"""', "F'''", 'F"""', "ur'''", 'ur"""', "Ur'''", 'Ur"""', "uR'''", 'uR"""', "UR'''", 'UR"""', "br'''", 'br"""', "Br'''", 'Br"""', @@ -146,6 +150,7 @@ def maybe(*choices): return group(*choices) + '?' "r'", 'r"', "R'", 'R"', "u'", 'u"', "U'", 'U"', "b'", 'b"', "B'", 'B"', + "f'", 'f"', "F'", 'F"', "ur'", 'ur"', "Ur'", 'Ur"', "uR'", 'uR"', "UR'", 'UR"', "br'", 'br"', "Br'", 'Br"', diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py index c79611db56522a..3f7ab9714e38f9 100644 --- a/Lib/lib2to3/tests/test_parser.py +++ b/Lib/lib2to3/tests/test_parser.py @@ -344,6 +344,7 @@ class TestStringLiterals(GrammarTest): "r'", 'r"', "R'", 'R"', "u'", 'u"', "U'", 'U"', "b'", 'b"', "B'", 'B"', + "f'", 'f"', "F'", 'F"', "ur'", 'ur"', "Ur'", 'Ur"', "uR'", 'uR"', "UR'", 'UR"', "br'", 'br"', "Br'", 'Br"', From 07a40a16238995e2b6b9ab1d5fc3a30bcd63d955 Mon Sep 17 00:00:00 2001 From: "T. Wouters" Date: Tue, 23 May 2017 07:25:17 +0200 Subject: [PATCH 0326/2287] [3.6] Add --with-assertions configure flag to enable C assertions(GH-1731) (#1739) Defaults to 'no', but as before assertions are implied by --with-pydebug.. (cherry picked from commit ddbfa2c35b298a56f0b813656745bca9cb7334f1) --- Misc/NEWS | 4 ++++ configure | 31 ++++++++++++++++++++++++++++++- configure.ac | 23 ++++++++++++++++++++++- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index ae15eefcd46ad4..0dda4fa5122948 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -154,6 +154,10 @@ Library Build ----- +- bpo-29941: Add ``--with-assertions`` configure flag to explicitly enable + C ``assert()`` checks. Defaults to off. ``--with-pydebug`` implies + ``--with-assertions``. + - bpo-28787: Fix out-of-tree builds of Python when configured with ``--with--dtrace``. diff --git a/configure b/configure index 97d3301f8e1891..09a94624c1b2b4 100755 --- a/configure +++ b/configure @@ -818,6 +818,7 @@ with_suffix enable_shared enable_profiling with_pydebug +with_assertions enable_optimizations with_lto with_hash_algorithm @@ -1513,6 +1514,7 @@ Optional Packages: compiler --with-suffix=.exe set executable suffix --with-pydebug build with Py_DEBUG defined + --with-assertions build with C assertions enabled --with-lto Enable Link Time Optimization in PGO builds. Disabled by default. --with-hash-algorithm=[fnv|siphash24] @@ -6515,6 +6517,33 @@ $as_echo "no" >&6; } fi +# Check for --with-assertions. Py_DEBUG implies assertions, but also changes +# the ABI. This allows enabling assertions without changing the ABI. +assertions='false' +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-assertions" >&5 +$as_echo_n "checking for --with-assertions... " >&6; } + +# Check whether --with-assertions was given. +if test "${with_assertions+set}" = set; then : + withval=$with_assertions; +if test "$withval" != no +then + assertions='true' +fi +fi + +if test "$assertions" = 'true'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +elif test "$Py_DEBUG" = 'true'; then + assertions='true' + { $as_echo "$as_me:${as_lineno-$LINENO}: result: implied by --with-pydebug" >&5 +$as_echo "implied by --with-pydebug" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + # Enable optimization flags @@ -7424,7 +7453,7 @@ case "$CC" in ;; esac -if test "$Py_DEBUG" = 'true'; then +if test "$assertions" = 'true'; then : else OPT="-DNDEBUG $OPT" diff --git a/configure.ac b/configure.ac index 8abf2f96cc45ff..146ae22a632a59 100644 --- a/configure.ac +++ b/configure.ac @@ -1258,6 +1258,27 @@ else AC_MSG_RESULT(no); Py_DEBUG='false' fi], [AC_MSG_RESULT(no)]) +# Check for --with-assertions. Py_DEBUG implies assertions, but also changes +# the ABI. This allows enabling assertions without changing the ABI. +assertions='false' +AC_MSG_CHECKING(for --with-assertions) +AC_ARG_WITH(assertions, + AC_HELP_STRING([--with-assertions], [build with C assertions enabled]), +[ +if test "$withval" != no +then + assertions='true' +fi], +[]) +if test "$assertions" = 'true'; then + AC_MSG_RESULT(yes) +elif test "$Py_DEBUG" = 'true'; then + assertions='true' + AC_MSG_RESULT(implied by --with-pydebug) +else + AC_MSG_RESULT(no) +fi + # Enable optimization flags AC_SUBST(DEF_MAKE_ALL_RULE) AC_SUBST(DEF_MAKE_RULE) @@ -1855,7 +1876,7 @@ case "$CC" in ;; esac -if test "$Py_DEBUG" = 'true'; then +if test "$assertions" = 'true'; then : else OPT="-DNDEBUG $OPT" From 6ef0882303cff24c58785bb1082250088266886d Mon Sep 17 00:00:00 2001 From: Mariatta Date: Mon, 22 May 2017 22:27:02 -0700 Subject: [PATCH 0327/2287] [3.6] bpo-21056: Document return type of next method of csv reader (GH-146) (#1749) (cherry picked from commit d618c8c6d31b9b288f8a070417683974eb98e3ba) --- Doc/library/csv.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Doc/library/csv.rst b/Doc/library/csv.rst index 52a8a310ec9d62..43714f7479283d 100644 --- a/Doc/library/csv.rst +++ b/Doc/library/csv.rst @@ -401,8 +401,10 @@ Reader objects (:class:`DictReader` instances and objects returned by the .. method:: csvreader.__next__() - Return the next row of the reader's iterable object as a list, parsed according - to the current dialect. Usually you should call this as ``next(reader)``. + Return the next row of the reader's iterable object as a list (if the object + was returned from :func:`reader`) or a dict (if it is a :class:`DictReader` + instance), parsed according to the current dialect. Usually you should call + this as ``next(reader)``. Reader objects have the following public attributes: From 762add7877258b62b38f0cff87159179faa471dc Mon Sep 17 00:00:00 2001 From: Vijay Kumar Date: Tue, 23 May 2017 11:44:02 +0530 Subject: [PATCH 0328/2287] Fix spelling mistakes in tkinter.py (#1751) Ran the docstrings through spell checker, and fixed spelling issues. --- Lib/tkinter/__init__.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py index ee2415da72a01e..deea791831ed66 100644 --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -1004,7 +1004,7 @@ def winfo_ismapped(self): return self.tk.getint( self.tk.call('winfo', 'ismapped', self._w)) def winfo_manager(self): - """Return the window mananger name for this widget.""" + """Return the window manager name for this widget.""" return self.tk.call('winfo', 'manager', self._w) def winfo_name(self): """Return the name of this widget.""" @@ -1679,7 +1679,7 @@ def image_names(self): return self.tk.splitlist(self.tk.call('image', 'names')) def image_types(self): - """Return a list of all available image types (e.g. phote bitmap).""" + """Return a list of all available image types (e.g. photo bitmap).""" return self.tk.splitlist(self.tk.call('image', 'types')) @@ -1818,7 +1818,7 @@ def wm_focusmodel(self, model=None): return self.tk.call('wm', 'focusmodel', self._w, model) focusmodel = wm_focusmodel def wm_forget(self, window): # new in Tk 8.5 - """The window will be unmappend from the screen and will no longer + """The window will be unmapped from the screen and will no longer be managed by wm. toplevel windows will be treated like frame windows once they are no longer managed by wm, however, the menu option configuration will be remembered and the menus will return @@ -2527,7 +2527,7 @@ def find_closest(self, x, y, halo=None, start=None): """Return item which is closest to pixel at X, Y. If several match take the top-most. All items closer than HALO are considered overlapping (all are - closests). If START is specified the next below this tag is taken.""" + closest). If START is specified the next below this tag is taken.""" return self.find('closest', x, y, halo, start) def find_enclosed(self, x1, y1, x2, y2): """Return all items in rectangle defined @@ -2587,7 +2587,7 @@ def postscript(self, cnf={}, **kw): """Print the contents of the canvas to a postscript file. Valid options: colormap, colormode, file, fontmap, height, pageanchor, pageheight, pagewidth, pagex, pagey, - rotate, witdh, x, y.""" + rotate, width, x, y.""" return self.tk.call((self._w, 'postscript') + self._options(cnf, kw)) def tag_raise(self, *args): @@ -3522,7 +3522,7 @@ def height(self): return self.tk.getint( self.tk.call('image', 'height', self.name)) def type(self): - """Return the type of the imgage, e.g. "photo" or "bitmap".""" + """Return the type of the image, e.g. "photo" or "bitmap".""" return self.tk.call('image', 'type', self.name) def width(self): """Return the width of the image.""" From 70705e3cdfff6a2c1211456afce99afc3d9ca59b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= Date: Tue, 23 May 2017 00:36:23 -0700 Subject: [PATCH 0329/2287] [3.6] call remove_done_callback in finally section (GH-1688) (#1755) (cherry picked from commit 21b3e04c13212b29e8c35ffc36eed8603fde08f4) --- Lib/asyncio/base_events.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index 0df58c5f873d88..a4967b854c5e68 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -459,7 +459,8 @@ def run_until_complete(self, future): # local task. future.exception() raise - future.remove_done_callback(_run_until_complete_cb) + finally: + future.remove_done_callback(_run_until_complete_cb) if not future.done(): raise RuntimeError('Event loop stopped before Future completed.') From 9bcf81da1436468c3c5e500ae36678a2ad675e32 Mon Sep 17 00:00:00 2001 From: Kushal Das Date: Tue, 23 May 2017 09:57:04 -0700 Subject: [PATCH 0330/2287] [3.6] bpo-30376: Update outdated WindowObject references (GH-1630) (#1746) (cherry picked from commit 93fc20b73eea3da0b6305aaee951e5dd22d5c408) --- Doc/library/curses.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst index d51085506c2a96..3442e4e75a3e45 100644 --- a/Doc/library/curses.rst +++ b/Doc/library/curses.rst @@ -290,8 +290,8 @@ The module :mod:`curses` defines the following functions: .. function:: initscr() - Initialize the library. Return a :class:`WindowObject` which represents the - whole screen. + Initialize the library. Return a :ref:`window ` object + which represents the whole screen. .. note:: @@ -383,8 +383,8 @@ The module :mod:`curses` defines the following functions: .. function:: newwin(nlines, ncols) newwin(nlines, ncols, begin_y, begin_x) - Return a new window, whose left-upper corner is at ``(begin_y, begin_x)``, and - whose height/width is *nlines*/*ncols*. + Return a new :ref:`window `, whose left-upper corner + is at ``(begin_y, begin_x)``, and whose height/width is *nlines*/*ncols*. By default, the window will extend from the specified position to the lower right corner of the screen. @@ -1679,10 +1679,10 @@ You can instantiate a :class:`Textbox` object as follows: .. class:: Textbox(win) Return a textbox widget object. The *win* argument should be a curses - :class:`WindowObject` in which the textbox is to be contained. The edit cursor - of the textbox is initially located at the upper left hand corner of the - containing window, with coordinates ``(0, 0)``. The instance's - :attr:`stripspaces` flag is initially on. + :ref:`window ` object in which the textbox is to + be contained. The edit cursor of the textbox is initially located at the + upper left hand corner of the containing window, with coordinates ``(0, 0)``. + The instance's :attr:`stripspaces` flag is initially on. :class:`Textbox` objects have the following methods: From c3454f0e79b35fb81b0426cfac4b801d4495b8ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Wirtel?= Date: Wed, 24 May 2017 20:59:06 +0200 Subject: [PATCH 0331/2287] bpo-30394: Fix a socket leak in smtplib.SMTP.__init__() (#1700) (#1790) --- Lib/smtplib.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/smtplib.py b/Lib/smtplib.py index f7c2c77ab42075..5e422b704ad4dc 100755 --- a/Lib/smtplib.py +++ b/Lib/smtplib.py @@ -250,6 +250,7 @@ def __init__(self, host='', port=0, local_hostname=None, if host: (code, msg) = self.connect(host, port) if code != 220: + self.close() raise SMTPConnectError(code, msg) if local_hostname is not None: self.local_hostname = local_hostname From a2a9984a278d2ee945e91ce13e000e571794fc24 Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Wed, 24 May 2017 16:11:01 -0500 Subject: [PATCH 0332/2287] [3.6] bpo-30160: Clarify intended usage of wfile (gh-1300) (GH-1793) The library does not enforce compliance with the HTTP protocol, so violations are not technically disallowed. Extend the stream's description to avoid suggesting that intentional protocol violations are not supported. (cherry picked from commit a083c8e) --- Doc/library/http.server.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst index fb5c1df611d8f2..b29020bc7ca5ca 100644 --- a/Doc/library/http.server.rst +++ b/Doc/library/http.server.rst @@ -105,7 +105,8 @@ of which this module provides three different variants: Contains the output stream for writing a response back to the client. Proper adherence to the HTTP protocol must be used when writing to - this stream. + this stream in order to achieve successful interoperation with HTTP + clients. .. versionchanged:: 3.6 This is an :class:`io.BufferedIOBase` stream. From 89a310264000a613b7f6abd5916946aef09ae7d2 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 25 May 2017 14:18:55 +0300 Subject: [PATCH 0333/2287] [3.6] bpo-29104: Fixed parsing backslashes in f-strings. (GH-490) (#1812) (cherry picked from commit 0cd7a3f) --- Lib/test/test_fstring.py | 14 +++++++++++ Misc/NEWS | 2 ++ Python/ast.c | 53 ++++++++++++++++++++++++---------------- 3 files changed, 48 insertions(+), 21 deletions(-) diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index 708ed25b526b74..25730029ae76f1 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -361,6 +361,20 @@ def test_backslashes_in_string_part(self): self.assertEqual(f'2\x203', '2 3') self.assertEqual(f'\x203', ' 3') + with self.assertWarns(DeprecationWarning): # invalid escape sequence + value = eval(r"f'\{6*7}'") + self.assertEqual(value, '\\42') + self.assertEqual(f'\\{6*7}', '\\42') + self.assertEqual(fr'\{6*7}', '\\42') + + AMPERSAND = 'spam' + # Get the right unicode character (&), or pick up local variable + # depending on the number of backslashes. + self.assertEqual(f'\N{AMPERSAND}', '&') + self.assertEqual(f'\\N{AMPERSAND}', '\\Nspam') + self.assertEqual(fr'\N{AMPERSAND}', '\\Nspam') + self.assertEqual(f'\\\N{AMPERSAND}', '\\&') + def test_misformed_unicode_character_name(self): # These test are needed because unicode names are parsed # differently inside f-strings. diff --git a/Misc/NEWS b/Misc/NEWS index 0dda4fa5122948..09eb4a76df032f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ What's New in Python 3.6.2 release candidate 1? Core and Builtins ----------------- +- bpo-29104: Fixed parsing backslashes in f-strings. + - bpo-27945: Fixed various segfaults with dict when input collections are mutated during searching, inserting or comparing. Based on patches by Duane Griffin and Tim Mitchell. diff --git a/Python/ast.c b/Python/ast.c index 217ea14bf310be..ed05a1e53bdb5e 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -4170,9 +4170,11 @@ decode_unicode_with_escapes(struct compiling *c, const node *n, const char *s, while (s < end) { if (*s == '\\') { *p++ = *s++; - if (*s & 0x80) { + if (s >= end || *s & 0x80) { strcpy(p, "u005c"); p += 5; + if (s >= end) + break; } } if (*s & 0x80) { /* XXX inefficient */ @@ -4325,30 +4327,37 @@ fstring_find_literal(const char **str, const char *end, int raw, brace (which isn't part of a unicode name escape such as "\N{EULER CONSTANT}"), or the end of the string. */ - const char *literal_start = *str; - const char *literal_end; - int in_named_escape = 0; + const char *s = *str; + const char *literal_start = s; int result = 0; assert(*literal == NULL); - for (; *str < end; (*str)++) { - char ch = **str; - if (!in_named_escape && ch == '{' && (*str)-literal_start >= 2 && - *(*str-2) == '\\' && *(*str-1) == 'N') { - in_named_escape = 1; - } else if (in_named_escape && ch == '}') { - in_named_escape = 0; - } else if (ch == '{' || ch == '}') { + while (s < end) { + char ch = *s++; + if (!raw && ch == '\\' && s < end) { + ch = *s++; + if (ch == 'N') { + if (s < end && *s++ == '{') { + while (s < end && *s++ != '}') { + } + continue; + } + break; + } + if (ch == '{' && warn_invalid_escape_sequence(c, n, ch) < 0) { + return -1; + } + } + if (ch == '{' || ch == '}') { /* Check for doubled braces, but only at the top level. If we checked at every level, then f'{0:{3}}' would fail with the two closing braces. */ if (recurse_lvl == 0) { - if (*str+1 < end && *(*str+1) == ch) { + if (s < end && *s == ch) { /* We're going to tell the caller that the literal ends here, but that they should continue scanning. But also skip over the second brace when we resume scanning. */ - literal_end = *str+1; - *str += 2; + *str = s + 1; result = 1; goto done; } @@ -4356,6 +4365,7 @@ fstring_find_literal(const char **str, const char *end, int raw, /* Where a single '{' is the start of a new expression, a single '}' is not allowed. */ if (ch == '}') { + *str = s - 1; ast_error(c, n, "f-string: single '}' is not allowed"); return -1; } @@ -4363,21 +4373,22 @@ fstring_find_literal(const char **str, const char *end, int raw, /* We're either at a '{', which means we're starting another expression; or a '}', which means we're at the end of this f-string (for a nested format_spec). */ + s--; break; } } - literal_end = *str; - assert(*str <= end); - assert(*str == end || **str == '{' || **str == '}'); + *str = s; + assert(s <= end); + assert(s == end || *s == '{' || *s == '}'); done: - if (literal_start != literal_end) { + if (literal_start != s) { if (raw) *literal = PyUnicode_DecodeUTF8Stateful(literal_start, - literal_end-literal_start, + s - literal_start, NULL, NULL); else *literal = decode_unicode_with_escapes(c, n, literal_start, - literal_end-literal_start); + s - literal_start); if (!*literal) return -1; } From f43b293f2fee91578e28c7aa566510a0cd6e33cb Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 25 May 2017 15:32:08 +0300 Subject: [PATCH 0334/2287] [3.6] bpo-29943: Do not replace the function PySlice_GetIndicesEx() with a macro (GH-1049) (#1813) if Py_LIMITED_API is not defined. (cherry picked from commit 49a9059) --- Include/sliceobject.h | 2 ++ Misc/NEWS | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/Include/sliceobject.h b/Include/sliceobject.h index 36263544607096..579ac073d0f241 100644 --- a/Include/sliceobject.h +++ b/Include/sliceobject.h @@ -45,11 +45,13 @@ PyAPI_FUNC(int) PySlice_GetIndicesEx(PyObject *r, Py_ssize_t length, Py_ssize_t *step, Py_ssize_t *slicelength); #if !defined(Py_LIMITED_API) || (Py_LIMITED_API+0 >= 0x03050400 && Py_LIMITED_API+0 < 0x03060000) || Py_LIMITED_API+0 >= 0x03060100 +#ifdef Py_LIMITED_API #define PySlice_GetIndicesEx(slice, length, start, stop, step, slicelen) ( \ PySlice_Unpack((slice), (start), (stop), (step)) < 0 ? \ ((*(slicelen) = 0), -1) : \ ((*(slicelen) = PySlice_AdjustIndices((length), (start), (stop), *(step))), \ 0)) +#endif PyAPI_FUNC(int) PySlice_Unpack(PyObject *slice, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step); PyAPI_FUNC(Py_ssize_t) PySlice_AdjustIndices(Py_ssize_t length, diff --git a/Misc/NEWS b/Misc/NEWS index 09eb4a76df032f..58a2ee0c3e53a7 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -153,6 +153,13 @@ Library exception) to exception(s) raised in the dispatched methods. Patch by Petr Motejlek. +C API +----- + +- Issue #27867: Function PySlice_GetIndicesEx() no longer replaced with a macro + if Py_LIMITED_API is not set. + + Build ----- From 2783cc42629b9445ea848ce36bbf213ef7789271 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Thu, 25 May 2017 16:57:46 +0200 Subject: [PATCH 0335/2287] [3.6] bpo-30414: multiprocessing.Queue._feed do not break from main loop on exc (GH-1683) (#1815) * bpo-30414: multiprocesing.Queue._feed do not break from main loop on exc Queue background running thread was not handling exceptions correctly. Any exception occurred inside thread (putting unpickable object) cause feeder to finish running. After that every message put into queue is silently ignored. * bpo-30414: multiprocesing.Queue._feed do not break from main loop on exc Queue background running thread was not handling exceptions correctly. Any exception occurred inside thread (putting unpickable object) cause feeder to finish running. After that every message put into queue is silently ignored. (cherry picked from commit bc50f03db4f58c869b78e98468e374d7e61f1227) --- Lib/multiprocessing/queues.py | 22 ++++++++++------------ Lib/test/_test_multiprocessing.py | 14 ++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py index a4f4ef8b7b5334..7f77837a74acb6 100644 --- a/Lib/multiprocessing/queues.py +++ b/Lib/multiprocessing/queues.py @@ -221,8 +221,8 @@ def _feed(buffer, notempty, send_bytes, writelock, close, ignore_epipe): else: wacquire = None - try: - while 1: + while 1: + try: nacquire() try: if not buffer: @@ -249,21 +249,19 @@ def _feed(buffer, notempty, send_bytes, writelock, close, ignore_epipe): wrelease() except IndexError: pass - except Exception as e: - if ignore_epipe and getattr(e, 'errno', 0) == errno.EPIPE: - return - # Since this runs in a daemon thread the resources it uses - # may be become unusable while the process is cleaning up. - # We ignore errors which happen after the process has - # started to cleanup. - try: + except Exception as e: + if ignore_epipe and getattr(e, 'errno', 0) == errno.EPIPE: + return + # Since this runs in a daemon thread the resources it uses + # may be become unusable while the process is cleaning up. + # We ignore errors which happen after the process has + # started to cleanup. if is_exiting(): info('error in queue thread: %s', e) + return else: import traceback traceback.print_exc() - except Exception: - pass _sentinel = object() diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 3eb83c59ab17d7..f1f93674935e7a 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -752,6 +752,20 @@ def test_timeout(self): # Windows (usually 15.6 ms) self.assertGreaterEqual(delta, 0.170) + def test_queue_feeder_donot_stop_onexc(self): + # bpo-30414: verify feeder handles exceptions correctly + if self.TYPE != 'processes': + self.skipTest('test not appropriate for {}'.format(self.TYPE)) + + class NotSerializable(object): + def __reduce__(self): + raise AttributeError + with test.support.captured_stderr(): + q = self.Queue() + q.put(NotSerializable()) + q.put(True) + self.assertTrue(q.get(timeout=0.1)) + # # # diff --git a/Misc/NEWS b/Misc/NEWS index 58a2ee0c3e53a7..bdaf7aaf70a0bf 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -45,6 +45,9 @@ Core and Builtins Library ------- +- bpo-30414: multiprocessing.Queue._feed background running + thread do not break from main loop on exception. + - bpo-30003: Fix handling escape characters in HZ codec. Based on patch by Ma Lin. From 584ef2aecfdaaf753e3959a8ceb0ea745189ddeb Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 27 May 2017 16:37:11 +0300 Subject: [PATCH 0336/2287] [3.6] Fix the signature of JSONDecodeError (no end parameter). (GH-1827) (#1828) Unlikely to the simplejson module, json.JSONDecodeError doesn't accept the end argument. (cherry picked from commit 5becf38) --- Doc/library/json.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/json.rst b/Doc/library/json.rst index 8103c614aaf450..fdbdcb169fab09 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -503,7 +503,7 @@ Encoders and Decoders Exceptions ---------- -.. exception:: JSONDecodeError(msg, doc, pos, end=None) +.. exception:: JSONDecodeError(msg, doc, pos) Subclass of :exc:`ValueError` with the following additional attributes: From b52c68a5a3f546cbbe1589f8bb3e51bfd55a6c15 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 27 May 2017 16:37:40 +0300 Subject: [PATCH 0337/2287] [3.6] bpo-30398: Add a docstring for re.error. (GH-1647) (#1830) Also document that some attributes may be None. (cherry picked from commit 12d6b5d) --- Doc/library/re.rst | 6 +++--- Lib/sre_constants.py | 11 +++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst index 944c6fb10d6c25..5ae304d25e1399 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -828,15 +828,15 @@ form. .. attribute:: pos - The index of *pattern* where compilation failed. + The index in *pattern* where compilation failed (may be ``None``). .. attribute:: lineno - The line corresponding to *pos*. + The line corresponding to *pos* (may be ``None``). .. attribute:: colno - The column corresponding to *pos*. + The column corresponding to *pos* (may be ``None``). .. versionchanged:: 3.5 Added additional attributes. diff --git a/Lib/sre_constants.py b/Lib/sre_constants.py index fc684ae96fd30a..a6e8a1f08d68a8 100644 --- a/Lib/sre_constants.py +++ b/Lib/sre_constants.py @@ -21,6 +21,17 @@ # should this really be here? class error(Exception): + """Exception raised for invalid regular expressions. + + Attributes: + + msg: The unformatted error message + pattern: The regular expression pattern + pos: The index in the pattern where compilation failed (may be None) + lineno: The line corresponding to pos (may be None) + colno: The column corresponding to pos (may be None) + """ + def __init__(self, msg, pattern=None, pos=None): self.msg = msg self.pattern = pattern From 94d8261d1ca3f0c551d9d43a4db342d806af7a6a Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 27 May 2017 07:20:24 -0700 Subject: [PATCH 0338/2287] =?UTF-8?q?[3.6]=20bpo-29960=20=5Frandom.Random?= =?UTF-8?q?=20corrupted=20on=20exception=20in=20setstate().=20=E2=80=A6=20?= =?UTF-8?q?(#1287)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 9616a82e7802241a4b74cf7ae38d43c37bf66e48) --- Lib/test/test_random.py | 5 +++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ Modules/_randommodule.c | 5 ++++- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index 5b6a4f06baaf41..03adc0a72294ab 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -427,6 +427,7 @@ def test_setstate_first_arg(self): self.assertRaises(ValueError, self.gen.setstate, (1, None, None)) def test_setstate_middle_arg(self): + start_state = self.gen.getstate() # Wrong type, s/b tuple self.assertRaises(TypeError, self.gen.setstate, (2, None, None)) # Wrong length, s/b 625 @@ -440,6 +441,10 @@ def test_setstate_middle_arg(self): self.gen.setstate((2, (1,)*624+(625,), None)) with self.assertRaises((ValueError, OverflowError)): self.gen.setstate((2, (1,)*624+(-1,), None)) + # Failed calls to setstate() should not have changed the state. + bits100 = self.gen.getrandbits(100) + self.gen.setstate(start_state) + self.assertEqual(self.gen.getrandbits(100), bits100) # Little trick to make "tuple(x % (2**32) for x in internalstate)" # raise ValueError. I cannot think of a simple way to achieve this, so diff --git a/Misc/ACKS b/Misc/ACKS index b8bac248d98867..d03fe472c0076c 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1109,6 +1109,7 @@ Milan Oberkirch Pascal Oberndoerfer Jeffrey Ollie Adam Olsen +Bryan Olson Grant Olson Koray Oner Piet van Oostrum diff --git a/Misc/NEWS b/Misc/NEWS index bdaf7aaf70a0bf..600da2d507cf63 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -45,6 +45,9 @@ Core and Builtins Library ------- +- bpo-29960: Preserve generator state when _random.Random.setstate() + raises an exception. Patch by Bryan Olson. + - bpo-30414: multiprocessing.Queue._feed background running thread do not break from main loop on exception. diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c index e5dd2c96166384..d006aebf927c38 100644 --- a/Modules/_randommodule.c +++ b/Modules/_randommodule.c @@ -348,6 +348,7 @@ random_setstate(RandomObject *self, PyObject *state) int i; unsigned long element; long index; + uint32_t new_state[N]; if (!PyTuple_Check(state)) { PyErr_SetString(PyExc_TypeError, @@ -364,7 +365,7 @@ random_setstate(RandomObject *self, PyObject *state) element = PyLong_AsUnsignedLong(PyTuple_GET_ITEM(state, i)); if (element == (unsigned long)-1 && PyErr_Occurred()) return NULL; - self->state[i] = (uint32_t)element; + new_state[i] = (uint32_t)element; } index = PyLong_AsLong(PyTuple_GET_ITEM(state, i)); @@ -375,6 +376,8 @@ random_setstate(RandomObject *self, PyObject *state) return NULL; } self->index = (int)index; + for (i = 0; i < N; i++) + self->state[i] = new_state[i]; Py_INCREF(Py_None); return Py_None; From 2ee91c8ad825079cdfc0d98f3f439f3b1c8ca471 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 27 May 2017 07:58:25 -0700 Subject: [PATCH 0339/2287] [3.6] bpo-30470: Deprecate invalid ctypes call protection on Windows. (GH-1810) (GH-1833) Calling Ctypes functions is deprecated in 3.6.2 and will be removed in 3.7. (cherry picked from commit f931fd1c2ad969db72460d3ab41e3d1a4a62c371) --- Doc/library/ctypes.rst | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 47bf89f59a5696..cdcbefa4e8084a 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -161,22 +161,14 @@ as the NULL pointer):: 0x1d000000 >>> -:mod:`ctypes` tries to protect you from calling functions with the wrong number -of arguments or the wrong calling convention. Unfortunately this only works on -Windows. It does this by examining the stack after the function returns, so -although an error is raised the function *has* been called:: +.. note:: - >>> windll.kernel32.GetModuleHandleA() # doctest: +WINDOWS - Traceback (most recent call last): - File "", line 1, in - ValueError: Procedure probably called with not enough arguments (4 bytes missing) - >>> windll.kernel32.GetModuleHandleA(0, 0) # doctest: +WINDOWS - Traceback (most recent call last): - File "", line 1, in - ValueError: Procedure probably called with too many arguments (4 bytes in excess) - >>> + :mod:`ctypes` may raise a :exc:`ValueError` after calling the function, if + it detects that an invalid number of arguments were passed. This behavior + should not be relied upon. It is deprecated in 3.6.2, and will be removed + in 3.7. -The same exception is raised when you call an ``stdcall`` function with the +:exc:`ValueError` is raised when you call an ``stdcall`` function with the ``cdecl`` calling convention, or vice versa:: >>> cdll.kernel32.GetModuleHandleA(None) # doctest: +WINDOWS From d52f47a8f7794ee09151973a00d29c8612672e7a Mon Sep 17 00:00:00 2001 From: Mariatta Date: Mon, 29 May 2017 15:19:31 -0700 Subject: [PATCH 0340/2287] [3.6] bpo-30361: Use better example for mixed-type operands (GH-1701) (#1856) (cherry picked from commit e405d4b8dfb8b497e1c3d1f0f8e28030040c165e) --- Doc/tutorial/introduction.rst | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Doc/tutorial/introduction.rst b/Doc/tutorial/introduction.rst index 52120a0b16e75f..8956aa5a261350 100644 --- a/Doc/tutorial/introduction.rst +++ b/Doc/tutorial/introduction.rst @@ -100,10 +100,8 @@ give you an error:: There is full support for floating point; operators with mixed type operands convert the integer operand to floating point:: - >>> 3 * 3.75 / 1.5 - 7.5 - >>> 7.0 / 2 - 3.5 + >>> 4 * 3.75 - 1 + 14.0 In interactive mode, the last printed expression is assigned to the variable ``_``. This means that when you are using Python as a desk calculator, it is From 03c7600982027f4fbe5770c3caea59e08716374f Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 30 May 2017 09:29:06 -0700 Subject: [PATCH 0341/2287] Improve grammar in The Import System documentation (GH-1862) (GH-1863) Replace `an ModuleNotFoundError` with `a ModuleNotFoundError`. Replace `an path` with `a path`. (cherry picked from commit 9c972b578002cc3bbbf2ebf2856c69de892bc9e2) --- Doc/reference/import.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst index 9475b8d55c2dc3..d504f37387422e 100644 --- a/Doc/reference/import.rst +++ b/Doc/reference/import.rst @@ -36,7 +36,7 @@ implement import semantics. When a module is first imported, Python searches for the module and if found, it creates a module object [#fnmo]_, initializing it. If the named module -cannot be found, an :exc:`ModuleNotFoundError` is raised. Python implements various +cannot be found, a :exc:`ModuleNotFoundError` is raised. Python implements various strategies to search for the named module when the import machinery is invoked. These strategies can be modified and extended by using various hooks described in the sections below. @@ -167,7 +167,7 @@ arguments to the :keyword:`import` statement, or from the parameters to the This name will be used in various phases of the import search, and it may be the dotted path to a submodule, e.g. ``foo.bar.baz``. In this case, Python first tries to import ``foo``, then ``foo.bar``, and finally ``foo.bar.baz``. -If any of the intermediate imports fail, an :exc:`ModuleNotFoundError` is raised. +If any of the intermediate imports fail, a :exc:`ModuleNotFoundError` is raised. The module cache @@ -185,7 +185,7 @@ object. During import, the module name is looked up in :data:`sys.modules` and if present, the associated value is the module satisfying the import, and the -process completes. However, if the value is ``None``, then an +process completes. However, if the value is ``None``, then a :exc:`ModuleNotFoundError` is raised. If the module name is missing, Python will continue searching for the module. @@ -194,7 +194,7 @@ associated module (as other modules may hold references to it), but it will invalidate the cache entry for the named module, causing Python to search anew for the named module upon its next import. The key can also be assigned to ``None``, forcing the next import -of the module to result in an :exc:`ModuleNotFoundError`. +of the module to result in a :exc:`ModuleNotFoundError`. Beware though, as if you keep a reference to the module object, invalidate its cache entry in :data:`sys.modules`, and then re-import the @@ -298,7 +298,7 @@ The second argument is the path entries to use for the module search. For top-level modules, the second argument is ``None``, but for submodules or subpackages, the second argument is the value of the parent package's ``__path__`` attribute. If the appropriate ``__path__`` attribute cannot -be accessed, an :exc:`ModuleNotFoundError` is raised. The third argument +be accessed, a :exc:`ModuleNotFoundError` is raised. The third argument is an existing module object that will be the target of loading later. The import system passes in a target module only during reload. @@ -616,7 +616,7 @@ the module. module.__path__ --------------- -By definition, if a module has an ``__path__`` attribute, it is a package, +By definition, if a module has a ``__path__`` attribute, it is a package, regardless of its value. A package's ``__path__`` attribute is used during imports of its subpackages. From 00b381b9a7b6b15350d1dcf7c688bf808cbf0ebb Mon Sep 17 00:00:00 2001 From: csabella Date: Tue, 30 May 2017 16:27:39 -0400 Subject: [PATCH 0342/2287] bpo-17188: DOC: Document 'from None' in raise statement (GH-1671) (GH-1867) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Original patch by Dennis Mårtensson. (cherry picked from commit 763557eac06ba60d7c5133e4f80df8870d8f917e) --- Doc/reference/simple_stmts.rst | 22 ++++++++++++++++++++-- Misc/ACKS | 1 + 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index e152b16ee32d4f..4355f185aae8c8 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -587,7 +587,7 @@ printed:: ... Traceback (most recent call last): File "", line 2, in - ZeroDivisionError: int division or modulo by zero + ZeroDivisionError: division by zero The above exception was the direct cause of the following exception: @@ -606,7 +606,7 @@ attached as the new exception's :attr:`__context__` attribute:: ... Traceback (most recent call last): File "", line 2, in - ZeroDivisionError: int division or modulo by zero + ZeroDivisionError: division by zero During handling of the above exception, another exception occurred: @@ -614,9 +614,27 @@ attached as the new exception's :attr:`__context__` attribute:: File "", line 4, in RuntimeError: Something bad happened +Exception chaining can be explicitly suppressed by specifying :const:`None` in +the ``from`` clause:: + + >>> try: + ... print(1 / 0) + ... except: + ... raise RuntimeError("Something bad happened") from None + ... + Traceback (most recent call last): + File "", line 4, in + RuntimeError: Something bad happened + Additional information on exceptions can be found in section :ref:`exceptions`, and information about handling exceptions is in section :ref:`try`. +.. versionchanged:: 3.3 + :const:`None` is now permitted as ``Y`` in ``raise X from Y`` + +.. versionadded:: 3.3 + The ``__suppress_context__`` attribute to suppress automatic display of the + exception context .. _break: diff --git a/Misc/ACKS b/Misc/ACKS index d03fe472c0076c..7fc5fecc8a4605 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -963,6 +963,7 @@ David Marek Doug Marien Sven Marnach Alex Martelli +Dennis Mårtensson Anthony Martin Owen Martin Sidney San Martín From ad13d54646d189cea8e6f7a9bc4a87e20df33ac4 Mon Sep 17 00:00:00 2001 From: csabella Date: Tue, 30 May 2017 16:48:22 -0400 Subject: [PATCH 0343/2287] bpo-30354: Update data model documentation for super() (GH-1561) (GH-1868) The data model section of the language reference was written well before the zero-argument form of super() was added. To avoid giving the impression that they're doing something unusual, this updates the description of `__new__` and `__init__` to use the zero-argument form. Patch by Cheryl Sabella. (cherry picked from commit 12b1c180986fc744331b8f30d3d2f49a0fdb43dd) --- Doc/reference/datamodel.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 35925a065fd495..0e0a9e24f0d18d 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1119,9 +1119,9 @@ Basic customization (usually an instance of *cls*). Typical implementations create a new instance of the class by invoking the - superclass's :meth:`__new__` method using ``super(currentclass, - cls).__new__(cls[, ...])`` with appropriate arguments and then modifying the - newly-created instance as necessary before returning it. + superclass's :meth:`__new__` method using ``super().__new__(cls[, ...])`` + with appropriate arguments and then modifying the newly-created instance + as necessary before returning it. If :meth:`__new__` returns an instance of *cls*, then the new instance's :meth:`__init__` method will be invoked like ``__init__(self[, ...])``, where @@ -1145,7 +1145,7 @@ Basic customization class constructor expression. If a base class has an :meth:`__init__` method, the derived class's :meth:`__init__` method, if any, must explicitly call it to ensure proper initialization of the base class part of the - instance; for example: ``BaseClass.__init__(self, [args...])``. + instance; for example: ``super().__init__([args...])``. Because :meth:`__new__` and :meth:`__init__` work together in constructing objects (:meth:`__new__` to create it, and :meth:`__init__` to customize it), @@ -1578,8 +1578,8 @@ Class Binding ``A.__dict__['x'].__get__(None, A)``. Super Binding - If ``a`` is an instance of :class:`super`, then the binding ``super(B, - obj).m()`` searches ``obj.__class__.__mro__`` for the base class ``A`` + If ``a`` is an instance of :class:`super`, then the binding ``super(B, obj).m()`` + searches ``obj.__class__.__mro__`` for the base class ``A`` immediately preceding ``B`` and then invokes the descriptor with the call: ``A.__dict__['m'].__get__(obj, obj.__class__)``. From 89e0a189f8d6054e3e2a7345ac779c1052dc2a49 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 30 May 2017 15:29:24 -0700 Subject: [PATCH 0344/2287] [3.6] Build docs in parallel (GH-1842) (GH-1872) (cherry picked from commit eba68e2c42e149acecb15bbeb692786e2540157d) --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fe90bad626ce83..cf524e5549289b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -41,7 +41,7 @@ matrix: # (Updating the version is fine as long as no warnings are raised by doing so.) - python -m pip install sphinx~=1.6.1 script: - - make check suspicious html SPHINXOPTS="-q -W" + - make check suspicious html SPHINXOPTS="-q -W -j4" - os: linux language: c compiler: gcc From 60b257b01ca497d7a556e3f526704aa1b923d1ac Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 30 May 2017 15:37:43 -0700 Subject: [PATCH 0345/2287] bpo-17188: add missing periods at the end of sentences (GH-1875) (GH-1876) (cherry picked from commit 9efad1e5aef32a6d8ca288793e8ee6df8782f615) --- Doc/reference/simple_stmts.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index 4355f185aae8c8..e1cec8794cc0e8 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -630,11 +630,11 @@ Additional information on exceptions can be found in section :ref:`exceptions`, and information about handling exceptions is in section :ref:`try`. .. versionchanged:: 3.3 - :const:`None` is now permitted as ``Y`` in ``raise X from Y`` + :const:`None` is now permitted as ``Y`` in ``raise X from Y``. .. versionadded:: 3.3 The ``__suppress_context__`` attribute to suppress automatic display of the - exception context + exception context. .. _break: From e49c5e92778cbd8f5b72da185eacd50b3a9896f7 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 30 May 2017 22:08:04 -0700 Subject: [PATCH 0346/2287] [3.6] Fix a trivial typo in global section (GH-1497) (GH-1880) (cherry picked from commit f34c6850203a2406c4950af7a9c8a134145df4ea) --- Doc/reference/simple_stmts.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index e1cec8794cc0e8..8786d73f68a369 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -940,7 +940,7 @@ annotation. builtin: eval builtin: compile -**Programmer's note:** the :keyword:`global` is a directive to the parser. It +**Programmer's note:** :keyword:`global` is a directive to the parser. It applies only to code parsed at the same time as the :keyword:`global` statement. In particular, a :keyword:`global` statement contained in a string or code object supplied to the built-in :func:`exec` function does not affect the code From 767b6d7d2da6823f71d10e6eeae24451db115c61 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Wed, 31 May 2017 15:52:39 -0700 Subject: [PATCH 0347/2287] [3.6] Fix Travis config to reinstate test build (GH-1879) (GH-1889) (cherry picked from commit a5aa72ac789052411797c6f079ffff0a9fdbf82c) --- .travis.yml | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index cf524e5549289b..e4e7b3d9b0246a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,25 +11,19 @@ branches: - master - /^\d\.\d$/ -os: - - linux - # macOS builds are disabled as the machines are under-provisioned on Travis, - # adding up to an extra hour completing a full CI run. - -compiler: - - clang - # gcc also works, but to keep the # of concurrent builds down, we use one C - # compiler here and the other to run the coverage build. - -env: - - TESTING=cpython - matrix: fast_finish: true allow_failures: - env: - TESTING=coverage include: + - os: linux + language: c + compiler: clang + # gcc also works, but to keep the # of concurrent builds down, we use one C + # compiler here and the other to run the coverage build. + env: + - TESTING=cpython - os: linux language: python python: 3.6 From 9abd0bf68f73b3beb56954e22740f0efcf04bc79 Mon Sep 17 00:00:00 2001 From: csabella Date: Wed, 31 May 2017 21:53:24 -0400 Subject: [PATCH 0348/2287] bpo-27618: Clarify that threading.Lock is a factory function (GH-1307) (GH-1894) (cherry picked from commit 56ddfd2eea4d98456a9a99bf2a718f21ee6b2be2) --- Doc/library/threading.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 2792dfdce04c6c..cda859fe4cbd3a 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -371,8 +371,9 @@ All methods are executed atomically. lock, subsequent attempts to acquire it block, until it is released; any thread may release it. - .. versionchanged:: 3.3 - Changed from a factory function to a class. + Note that ``Lock`` is actually a factory function which returns an instance + of the most efficient version of the concrete Lock class that is supported + by the platform. .. method:: acquire(blocking=True, timeout=-1) From 9522159bc41f2be0f4aafd0fa182669876aca47f Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 31 May 2017 19:49:01 -0700 Subject: [PATCH 0349/2287] bpo-22702: Clarify documentation of str.join & bytes.join (GH-156) (GH-1897) The "iterable iterable" phrasing created confusion between the term reference and the parameter name. This simplifies the phrasing to just use the parameter name without linking directly to the term definition. (cherry picked from commit 08e2f355d04d3cbea5751ce1275306ee3f569b32) --- Doc/library/stdtypes.rst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index af0a7b7fe939b2..4272b96fecfa21 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1719,10 +1719,10 @@ expression support in the :mod:`re` module). .. method:: str.join(iterable) - Return a string which is the concatenation of the strings in the - :term:`iterable` *iterable*. A :exc:`TypeError` will be raised if there are - any non-string values in *iterable*, including :class:`bytes` objects. The - separator between elements is the string providing this method. + Return a string which is the concatenation of the strings in *iterable*. + A :exc:`TypeError` will be raised if there are any non-string values in + *iterable*, including :class:`bytes` objects. The separator between + elements is the string providing this method. .. method:: str.ljust(width[, fillchar]) @@ -2539,11 +2539,11 @@ arbitrary binary data. bytearray.join(iterable) Return a bytes or bytearray object which is the concatenation of the - binary data sequences in the :term:`iterable` *iterable*. A - :exc:`TypeError` will be raised if there are any values in *iterable* - that are not :term:`bytes-like objects `, including - :class:`str` objects. The separator between elements is the contents - of the bytes or bytearray object providing this method. + binary data sequences in *iterable*. A :exc:`TypeError` will be raised + if there are any values in *iterable* that are not :term:`bytes-like + objects `, including :class:`str` objects. The + separator between elements is the contents of the bytes or + bytearray object providing this method. .. staticmethod:: bytes.maketrans(from, to) From 9d752aa5e695d682f3cfc40655580900b132e52a Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 1 Jun 2017 07:12:01 -0700 Subject: [PATCH 0350/2287] bpo-30499: Remove a deprecated note about sets. (GH-1848) (GH-1905) (cherry picked from commit 0737ee20671d60802a7ef40f653fe449f1921de0) --- Doc/library/stdtypes.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 4272b96fecfa21..81146f41784976 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -3982,9 +3982,7 @@ The constructors for both classes work the same: Note, the *elem* argument to the :meth:`__contains__`, :meth:`remove`, and :meth:`discard` methods may be a set. To support searching for an equivalent - frozenset, the *elem* set is temporarily mutated during the search and then - restored. During the search, the *elem* set should not be read or mutated - since it does not have a meaningful value. + frozenset, a temporary one is created from *elem*. .. _typesmapping: From 95b4da2be4aeb74ee46ddece71f2075b32915c60 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Thu, 1 Jun 2017 22:20:27 +0800 Subject: [PATCH 0351/2287] bpo-30378: Fix the problem that SysLogHandler can't handle IPv6 addresses (#1676) (#1903) --- Lib/logging/handlers.py | 25 ++++++++++++++++++++----- Lib/test/test_logging.py | 22 ++++++++++++++++++++-- Misc/NEWS | 3 +++ 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index 2356f8d3d2d8ce..2f934b33071563 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -827,11 +827,26 @@ def __init__(self, address=('localhost', SYSLOG_UDP_PORT), self.unixsocket = False if socktype is None: socktype = socket.SOCK_DGRAM - self.socket = socket.socket(socket.AF_INET, socktype) - if socktype == socket.SOCK_STREAM: - self.socket.connect(address) + host, port = address + ress = socket.getaddrinfo(host, port, 0, socktype) + if not ress: + raise OSError("getaddrinfo returns an empty list") + for res in ress: + af, socktype, proto, _, sa = res + err = sock = None + try: + sock = socket.socket(af, socktype, proto) + if socktype == socket.SOCK_STREAM: + sock.connect(sa) + break + except OSError as exc: + err = exc + if sock is not None: + sock.close() + if err is not None: + raise err + self.socket = sock self.socktype = socktype - self.formatter = None def _connect_unixsocket(self, address): use_socktype = self.socktype @@ -870,7 +885,7 @@ def encodePriority(self, facility, priority): priority = self.priority_names[priority] return (facility << 3) | priority - def close (self): + def close(self): """ Closes the socket. """ diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 0a2584c6103c32..474affdaebcd35 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -1663,7 +1663,7 @@ def setUp(self): server.ready.wait() hcls = logging.handlers.SysLogHandler if isinstance(server.server_address, tuple): - self.sl_hdlr = hcls(('localhost', server.port)) + self.sl_hdlr = hcls((server.server_address[0], server.port)) else: self.sl_hdlr = hcls(server.server_address) self.log_output = '' @@ -1723,6 +1723,24 @@ def tearDown(self): SysLogHandlerTest.tearDown(self) support.unlink(self.address) +@unittest.skipUnless(support.IPV6_ENABLED, + 'IPv6 support required for this test.') +@unittest.skipUnless(threading, 'Threading required for this test.') +class IPv6SysLogHandlerTest(SysLogHandlerTest): + + """Test for SysLogHandler with IPv6 host.""" + + server_class = TestUDPServer + address = ('::1', 0) + + def setUp(self): + self.server_class.address_family = socket.AF_INET6 + super(IPv6SysLogHandlerTest, self).setUp() + + def tearDown(self): + self.server_class.address_family = socket.AF_INET + super(IPv6SysLogHandlerTest, self).tearDown() + @unittest.skipUnless(threading, 'Threading required for this test.') class HTTPHandlerTest(BaseTest): """Test for HTTPHandler.""" @@ -4378,7 +4396,7 @@ def test_main(): QueueHandlerTest, ShutdownTest, ModuleLevelMiscTest, BasicConfigTest, LoggerAdapterTest, LoggerTest, SMTPHandlerTest, FileHandlerTest, RotatingFileHandlerTest, LastResortTest, LogRecordTest, - ExceptionTest, SysLogHandlerTest, HTTPHandlerTest, + ExceptionTest, SysLogHandlerTest, IPv6SysLogHandlerTest, HTTPHandlerTest, NTEventLogHandlerTest, TimedRotatingFileHandlerTest, UnixSocketHandlerTest, UnixDatagramHandlerTest, UnixSysLogHandlerTest, MiscTestCase diff --git a/Misc/NEWS b/Misc/NEWS index 600da2d507cf63..86dd1b4543819c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -45,6 +45,9 @@ Core and Builtins Library ------- +- bpo-30378: Fix the problem that logging.handlers.SysLogHandler cannot + handle IPv6 addresses. + - bpo-29960: Preserve generator state when _random.Random.setstate() raises an exception. Patch by Bryan Olson. From e417d12d728103445b8516a35f643536e401f120 Mon Sep 17 00:00:00 2001 From: Matthias Bussonnier Date: Thu, 1 Jun 2017 20:26:15 -0700 Subject: [PATCH 0352/2287] bpo-29660: traceback: Document that etype is ignored in some places. (GH-344) (GH-1913) (cherry picked from commit cdb89cd) --- Doc/library/traceback.rst | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Doc/library/traceback.rst b/Doc/library/traceback.rst index 066ee96fc004ab..55d331c996a187 100644 --- a/Doc/library/traceback.rst +++ b/Doc/library/traceback.rst @@ -45,9 +45,9 @@ The module defines the following functions: * if *tb* is not ``None``, it prints a header ``Traceback (most recent call last):`` * it prints the exception *etype* and *value* after the stack trace - * if *etype* is :exc:`SyntaxError` and *value* has the appropriate format, it - prints the line where the syntax error occurred with a caret indicating the - approximate position of the error. + * if *type(value)* is :exc:`SyntaxError` and *value* has the appropriate + format, it prints the line where the syntax error occurred with a caret + indicating the approximate position of the error. The optional *limit* argument has the same meaning as for :func:`print_tb`. If *chain* is true (the default), then chained exceptions (the @@ -55,6 +55,9 @@ The module defines the following functions: printed as well, like the interpreter itself does when printing an unhandled exception. + .. versionchanged:: 3.5 + The *etype* argument is ignored and inferred from the type of *value*. + .. function:: print_exc(limit=None, file=None, chain=True) @@ -131,6 +134,9 @@ The module defines the following functions: containing internal newlines. When these lines are concatenated and printed, exactly the same text is printed as does :func:`print_exception`. + .. versionchanged:: 3.5 + The *etype* argument is ignored and inferred from the type of *value*. + .. function:: format_exc(limit=None, chain=True) @@ -372,6 +378,7 @@ exception and traceback: print("*** print_tb:") traceback.print_tb(exc_traceback, limit=1, file=sys.stdout) print("*** print_exception:") + # exc_type below is ignored on 3.5 and later traceback.print_exception(exc_type, exc_value, exc_traceback, limit=2, file=sys.stdout) print("*** print_exc:") @@ -381,6 +388,7 @@ exception and traceback: print(formatted_lines[0]) print(formatted_lines[-1]) print("*** format_exception:") + # exc_type below is ignored on 3.5 and later print(repr(traceback.format_exception(exc_type, exc_value, exc_traceback))) print("*** extract_tb:") From 1c92c0edca413c6f8ce8ec326a67451ae751ead9 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 1 Jun 2017 21:56:24 -0700 Subject: [PATCH 0353/2287] bpo-30052: Link `bytes` & `bytearray` to stdtypes not functions (GH-1271) (GH-1915) Builtin container types have two potential link targets in the docs: - their entry in the list of builtin callables - their type documentation This change brings `bytes` and `bytearray` into line with other container types by having cross-references default to linking to their type documentation, rather than their builtin callable entry.. (cherry picked from commit c6db4811f9ea3aeff0e1fafe1c60a22835ef359e) --- Doc/library/functions.rst | 9 ++- Doc/library/stdtypes.rst | 150 +++++++++++++++++++----------------- Doc/reference/datamodel.rst | 16 ++-- 3 files changed, 92 insertions(+), 83 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 138f7d027cb86f..6621f4aabf7058 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -16,8 +16,8 @@ are always available. They are listed here in alphabetical order. :func:`ascii` :func:`enumerate` :func:`input` :func:`oct` :func:`staticmethod` :func:`bin` :func:`eval` :func:`int` :func:`open` |func-str|_ :func:`bool` :func:`exec` :func:`isinstance` :func:`ord` :func:`sum` -:func:`bytearray` :func:`filter` :func:`issubclass` :func:`pow` :func:`super` -:func:`bytes` :func:`float` :func:`iter` :func:`print` |func-tuple|_ +|func-bytearray|_ :func:`filter` :func:`issubclass` :func:`pow` :func:`super` +|func-bytes|_ :func:`float` :func:`iter` :func:`print` |func-tuple|_ :func:`callable` :func:`format` :func:`len` :func:`property` :func:`type` :func:`chr` |func-frozenset|_ |func-list|_ |func-range|_ :func:`vars` :func:`classmethod` :func:`getattr` :func:`locals` :func:`repr` :func:`zip` @@ -37,7 +37,8 @@ are always available. They are listed here in alphabetical order. .. |func-str| replace:: ``str()`` .. |func-tuple| replace:: ``tuple()`` .. |func-range| replace:: ``range()`` - +.. |func-bytearray| replace:: ``bytearray()`` +.. |func-bytes| replace:: ``bytes()`` .. function:: abs(x) @@ -99,6 +100,7 @@ are always available. They are listed here in alphabetical order. .. _func-bytearray: .. class:: bytearray([source[, encoding[, errors]]]) + :noindex: Return a new array of bytes. The :class:`bytearray` class is a mutable sequence of integers in the range 0 <= x < 256. It has most of the usual @@ -128,6 +130,7 @@ are always available. They are listed here in alphabetical order. .. _func-bytes: .. class:: bytes([source[, encoding[, errors]]]) + :noindex: Return a new "bytes" object, which is an immutable sequence of integers in the range ``0 <= x < 256``. :class:`bytes` is an immutable version of diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 81146f41784976..ca3404aa21e555 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2264,8 +2264,8 @@ The :mod:`array` module supports efficient storage of basic data types like .. _typebytes: -Bytes ------ +Bytes Objects +------------- .. index:: object: bytes @@ -2274,65 +2274,67 @@ binary protocols are based on the ASCII text encoding, bytes objects offer several methods that are only valid when working with ASCII compatible data and are closely related to string objects in a variety of other ways. -Firstly, the syntax for bytes literals is largely the same as that for string -literals, except that a ``b`` prefix is added: +.. class:: bytes([source[, encoding[, errors]]]) -* Single quotes: ``b'still allows embedded "double" quotes'`` -* Double quotes: ``b"still allows embedded 'single' quotes"``. -* Triple quoted: ``b'''3 single quotes'''``, ``b"""3 double quotes"""`` + Firstly, the syntax for bytes literals is largely the same as that for string + literals, except that a ``b`` prefix is added: -Only ASCII characters are permitted in bytes literals (regardless of the -declared source code encoding). Any binary values over 127 must be entered -into bytes literals using the appropriate escape sequence. + * Single quotes: ``b'still allows embedded "double" quotes'`` + * Double quotes: ``b"still allows embedded 'single' quotes"``. + * Triple quoted: ``b'''3 single quotes'''``, ``b"""3 double quotes"""`` -As with string literals, bytes literals may also use a ``r`` prefix to disable -processing of escape sequences. See :ref:`strings` for more about the various -forms of bytes literal, including supported escape sequences. + Only ASCII characters are permitted in bytes literals (regardless of the + declared source code encoding). Any binary values over 127 must be entered + into bytes literals using the appropriate escape sequence. -While bytes literals and representations are based on ASCII text, bytes -objects actually behave like immutable sequences of integers, with each -value in the sequence restricted such that ``0 <= x < 256`` (attempts to -violate this restriction will trigger :exc:`ValueError`. This is done -deliberately to emphasise that while many binary formats include ASCII based -elements and can be usefully manipulated with some text-oriented algorithms, -this is not generally the case for arbitrary binary data (blindly applying -text processing algorithms to binary data formats that are not ASCII -compatible will usually lead to data corruption). + As with string literals, bytes literals may also use a ``r`` prefix to disable + processing of escape sequences. See :ref:`strings` for more about the various + forms of bytes literal, including supported escape sequences. -In addition to the literal forms, bytes objects can be created in a number of -other ways: + While bytes literals and representations are based on ASCII text, bytes + objects actually behave like immutable sequences of integers, with each + value in the sequence restricted such that ``0 <= x < 256`` (attempts to + violate this restriction will trigger :exc:`ValueError`. This is done + deliberately to emphasise that while many binary formats include ASCII based + elements and can be usefully manipulated with some text-oriented algorithms, + this is not generally the case for arbitrary binary data (blindly applying + text processing algorithms to binary data formats that are not ASCII + compatible will usually lead to data corruption). -* A zero-filled bytes object of a specified length: ``bytes(10)`` -* From an iterable of integers: ``bytes(range(20))`` -* Copying existing binary data via the buffer protocol: ``bytes(obj)`` + In addition to the literal forms, bytes objects can be created in a number of + other ways: -Also see the :ref:`bytes ` built-in. + * A zero-filled bytes object of a specified length: ``bytes(10)`` + * From an iterable of integers: ``bytes(range(20))`` + * Copying existing binary data via the buffer protocol: ``bytes(obj)`` -Since 2 hexadecimal digits correspond precisely to a single byte, hexadecimal -numbers are a commonly used format for describing binary data. Accordingly, -the bytes type has an additional class method to read data in that format: + Also see the :ref:`bytes ` built-in. -.. classmethod:: bytes.fromhex(string) + Since 2 hexadecimal digits correspond precisely to a single byte, hexadecimal + numbers are a commonly used format for describing binary data. Accordingly, + the bytes type has an additional class method to read data in that format: - This :class:`bytes` class method returns a bytes object, decoding the - given string object. The string must contain two hexadecimal digits per - byte, with ASCII spaces being ignored. + .. classmethod:: fromhex(string) - >>> bytes.fromhex('2Ef0 F1f2 ') - b'.\xf0\xf1\xf2' + This :class:`bytes` class method returns a bytes object, decoding the + given string object. The string must contain two hexadecimal digits per + byte, with ASCII whitespace being ignored. -A reverse conversion function exists to transform a bytes object into its -hexadecimal representation. + >>> bytes.fromhex('2Ef0 F1f2 ') + b'.\xf0\xf1\xf2' -.. method:: bytes.hex() + A reverse conversion function exists to transform a bytes object into its + hexadecimal representation. - Return a string object containing two hexadecimal digits for each - byte in the instance. + .. method:: hex() - >>> b'\xf0\xf1\xf2'.hex() - 'f0f1f2' + Return a string object containing two hexadecimal digits for each + byte in the instance. - .. versionadded:: 3.5 + >>> b'\xf0\xf1\xf2'.hex() + 'f0f1f2' + + .. versionadded:: 3.5 Since bytes objects are sequences of integers (akin to a tuple), for a bytes object *b*, ``b[0]`` will be an integer, while ``b[0:1]`` will be a bytes @@ -2362,45 +2364,49 @@ Bytearray Objects .. index:: object: bytearray :class:`bytearray` objects are a mutable counterpart to :class:`bytes` -objects. There is no dedicated literal syntax for bytearray objects, instead -they are always created by calling the constructor: +objects. -* Creating an empty instance: ``bytearray()`` -* Creating a zero-filled instance with a given length: ``bytearray(10)`` -* From an iterable of integers: ``bytearray(range(20))`` -* Copying existing binary data via the buffer protocol: ``bytearray(b'Hi!')`` +.. class:: bytearray([source[, encoding[, errors]]]) -As bytearray objects are mutable, they support the -:ref:`mutable ` sequence operations in addition to the -common bytes and bytearray operations described in :ref:`bytes-methods`. + There is no dedicated literal syntax for bytearray objects, instead + they are always created by calling the constructor: -Also see the :ref:`bytearray ` built-in. + * Creating an empty instance: ``bytearray()`` + * Creating a zero-filled instance with a given length: ``bytearray(10)`` + * From an iterable of integers: ``bytearray(range(20))`` + * Copying existing binary data via the buffer protocol: ``bytearray(b'Hi!')`` -Since 2 hexadecimal digits correspond precisely to a single byte, hexadecimal -numbers are a commonly used format for describing binary data. Accordingly, -the bytearray type has an additional class method to read data in that format: + As bytearray objects are mutable, they support the + :ref:`mutable ` sequence operations in addition to the + common bytes and bytearray operations described in :ref:`bytes-methods`. -.. classmethod:: bytearray.fromhex(string) + Also see the :ref:`bytearray ` built-in. - This :class:`bytearray` class method returns bytearray object, decoding - the given string object. The string must contain two hexadecimal digits - per byte, with ASCII spaces being ignored. + Since 2 hexadecimal digits correspond precisely to a single byte, hexadecimal + numbers are a commonly used format for describing binary data. Accordingly, + the bytearray type has an additional class method to read data in that format: - >>> bytearray.fromhex('2Ef0 F1f2 ') - bytearray(b'.\xf0\xf1\xf2') + .. classmethod:: fromhex(string) -A reverse conversion function exists to transform a bytearray object into its -hexadecimal representation. + This :class:`bytearray` class method returns bytearray object, decoding + the given string object. The string must contain two hexadecimal digits + per byte, with ASCII whitespace being ignored. -.. method:: bytearray.hex() + >>> bytearray.fromhex('2Ef0 F1f2 ') + bytearray(b'.\xf0\xf1\xf2') - Return a string object containing two hexadecimal digits for each - byte in the instance. + A reverse conversion function exists to transform a bytearray object into its + hexadecimal representation. - >>> bytearray(b'\xf0\xf1\xf2').hex() - 'f0f1f2' + .. method:: hex() + + Return a string object containing two hexadecimal digits for each + byte in the instance. - .. versionadded:: 3.5 + >>> bytearray(b'\xf0\xf1\xf2').hex() + 'f0f1f2' + + .. versionadded:: 3.5 Since bytearray objects are sequences of integers (akin to a list), for a bytearray object *b*, ``b[0]`` will be an integer, while ``b[0:1]`` will be diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 0e0a9e24f0d18d..7c140a3bc86cb8 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -320,9 +320,9 @@ Sequences A bytes object is an immutable array. The items are 8-bit bytes, represented by integers in the range 0 <= x < 256. Bytes literals - (like ``b'abc'``) and the built-in function :func:`bytes` can be used to - construct bytes objects. Also, bytes objects can be decoded to strings - via the :meth:`~bytes.decode` method. + (like ``b'abc'``) and the built-in :func:`bytes()` constructor + can be used to create bytes objects. Also, bytes objects can be + decoded to strings via the :meth:`~bytes.decode` method. Mutable sequences .. index:: @@ -349,9 +349,9 @@ Sequences .. index:: bytearray A bytearray object is a mutable array. They are created by the built-in - :func:`bytearray` constructor. Aside from being mutable (and hence - unhashable), byte arrays otherwise provide the same interface and - functionality as immutable bytes objects. + :func:`bytearray` constructor. Aside from being mutable + (and hence unhashable), byte arrays otherwise provide the same interface + and functionality as immutable :class:`bytes` objects. .. index:: module: array @@ -1253,8 +1253,8 @@ Basic customization .. index:: builtin: bytes - Called by :func:`bytes` to compute a byte-string representation of an - object. This should return a ``bytes`` object. + Called by :ref:`bytes ` to compute a byte-string representation + of an object. This should return a :class:`bytes` object. .. index:: single: string; __format__() (object method) From c63ae1122f84d4188ffadfd1454902093eb10be1 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Fri, 2 Jun 2017 14:39:05 -0700 Subject: [PATCH 0354/2287] bpo-30544: _io._WindowsConsoleIO.write raises the wrong error when WriteConsoleW fails (#1912) (#1925) * bpo-30544: _io._WindowsConsoleIO.write raises the wrong error when WriteConsoleW fails * bpo-30544: _io._WindowsConsoleIO.write raises the wrong error when WriteConsoleW fails --- Modules/_io/winconsoleio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_io/winconsoleio.c b/Modules/_io/winconsoleio.c index 1d169e2764ed27..cbe21422bb4653 100644 --- a/Modules/_io/winconsoleio.c +++ b/Modules/_io/winconsoleio.c @@ -1017,7 +1017,7 @@ _io__WindowsConsoleIO_write_impl(winconsoleio *self, Py_buffer *b) wlen = MultiByteToWideChar(CP_UTF8, 0, b->buf, len, wbuf, wlen); if (wlen) { res = WriteConsoleW(self->handle, wbuf, wlen, &n, NULL); - if (n < wlen) { + if (res && n < wlen) { /* Wrote fewer characters than expected, which means our * len value may be wrong. So recalculate it from the * characters that were written. As this could potentially From ba6bfcdfb43f06f025613348bb6c71ff9b597b35 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Sat, 3 Jun 2017 10:33:53 -0700 Subject: [PATCH 0355/2287] [3.6] Turn on macOS builds for Travis (GH-1846) (#1929) Initially the macOS builds are allowed to fail until such time that they can be determined to be stable and not add an unacceptable amount of time to the overall Travis-passing process. (cherry picked from commit 21c2dd7cf8414c903f0e83cf1d6b7f02f645f422) --- .travis.yml | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index e4e7b3d9b0246a..4dfefb72700dbd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,21 +14,24 @@ branches: matrix: fast_finish: true allow_failures: - - env: - - TESTING=coverage + - env: OPTIONAL=true include: - os: linux language: c compiler: clang # gcc also works, but to keep the # of concurrent builds down, we use one C - # compiler here and the other to run the coverage build. - env: - - TESTING=cpython + # compiler here and the other to run the coverage build. Clang is preferred + # in this instance for its better error messages. + env: TESTING=cpython + - os: osx + language: c + compiler: clang + # Testing under macOS is optional until testing stability has been demonstrated. + env: OPTIONAL=true - os: linux language: python python: 3.6 - env: - - TESTING=docs + env: TESTING=docs before_script: - cd Doc # Sphinx is pinned so that new versions that introduce new warnings won't suddenly cause build failures. @@ -39,8 +42,7 @@ matrix: - os: linux language: c compiler: gcc - env: - - TESTING=coverage + env: OPTIONAL=true before_script: - | if ! git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '(\.(rst|yml)$)|(^Doc)/' From 7e6d999b6c22de2594df8bca56aedf60ba4714b0 Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Sun, 4 Jun 2017 17:14:03 -0500 Subject: [PATCH 0356/2287] [3.6] Fix skipping test_UNC_path on AppVeyor due to a different error being raised (GH-1920) We get `ERROR_BAD_NETPATH` (53) on AppVeyor which is translated to ENOENT (2). (cherry picked from commit 7a99625e0d95cd88ed8842d8677b5beea1fde5ae) --- Lib/test/test_import/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index 760908efe671fe..4aca9e597cf9f9 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -567,7 +567,7 @@ def test_UNC_path(self): try: os.listdir(unc) except OSError as e: - if e.errno in (errno.EPERM, errno.EACCES): + if e.errno in (errno.EPERM, errno.EACCES, errno.ENOENT): # See issue #15338 self.skipTest("cannot access administrative share %r" % (unc,)) raise From 47779d720a0fa0eec818065f41b17d0f2d77d3ff Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Sun, 4 Jun 2017 19:50:37 -0500 Subject: [PATCH 0357/2287] [3.6] Only run AppVeyor on long-lived branches (GH-1941) Also on the short-lived `buildbot-custom` branch. (cherry picked from commit d3bedf356aca04ed9135a84b08) --- .github/appveyor.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/appveyor.yml b/.github/appveyor.yml index a870e5b57d9250..d8bfb9adf9378d 100644 --- a/.github/appveyor.yml +++ b/.github/appveyor.yml @@ -1,5 +1,10 @@ version: 3.6.1+.{build} clone_depth: 5 +branches: + only: + - master + - /\d\.\d/ + - buildbot-custom build_script: - cmd: PCbuild\build.bat -e test_script: From 86eb93fae6fc5bf121de815b82697f2bc5bc126c Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 4 Jun 2017 20:06:48 -0700 Subject: [PATCH 0358/2287] bpo-30530: Update Descriptor How To Documentation (GH-1845) (GH-1953) Update the code example in Functions and Methods section Remove objtype argument in MethodType (cherry picked from commit 1bced56567335745f91676192fc39c06aab30da9) --- Doc/howto/descriptor.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index c2bf473e1ff9ea..2dd6c34e2ced02 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -282,7 +282,7 @@ this:: . . . def __get__(self, obj, objtype=None): "Simulate func_descr_get() in Objects/funcobject.c" - return types.MethodType(self, obj, objtype) + return types.MethodType(self, obj) Running the interpreter shows how the function descriptor works in practice:: From ce40550acd3a8928bb6fef4d4e73642a8a69745d Mon Sep 17 00:00:00 2001 From: csabella Date: Sun, 4 Jun 2017 23:12:23 -0400 Subject: [PATCH 0359/2287] bpo-30538: Update count() in Functional Programming HOWTO (GH-1919) (GH-1943) * bpo-30538: Update count() in Functional HOWTO * bpo-30538: Update enumerate() arguments in Functional HOWTO (cherry picked from commit 9be4ff359daa67cde6246494f643ed7cd2825d46) --- Doc/howto/functional.rst | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/Doc/howto/functional.rst b/Doc/howto/functional.rst index a82dca7077e905..40601812a77cb5 100644 --- a/Doc/howto/functional.rst +++ b/Doc/howto/functional.rst @@ -653,8 +653,9 @@ This can also be written as a list comprehension: [0, 2, 4, 6, 8] -:func:`enumerate(iter) ` counts off the elements in the iterable, -returning 2-tuples containing the count and each element. :: +:func:`enumerate(iter, start=0) ` counts off the elements in the +iterable returning 2-tuples containing the count (from *start*) and +each element. :: >>> for item in enumerate(['subject', 'verb', 'object']): ... print(item) @@ -747,14 +748,16 @@ The module's functions fall into a few broad classes: Creating new iterators ---------------------- -:func:`itertools.count(n) ` returns an infinite stream of -integers, increasing by 1 each time. You can optionally supply the starting -number, which defaults to 0:: +:func:`itertools.count(start, step) ` returns an infinite +stream of evenly spaced values. You can optionally supply the starting number, +which defaults to 0, and the interval between numbers, which defaults to 1:: itertools.count() => 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ... itertools.count(10) => 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ... + itertools.count(10, 5) => + 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, ... :func:`itertools.cycle(iter) ` saves a copy of the contents of a provided iterable and returns a new iterator that returns its elements from @@ -1060,10 +1063,10 @@ write the obvious :keyword:`for` loop:: for i in [1,2,3]: product *= i -A related function is `itertools.accumulate(iterable, func=operator.add) `. It performs the same calculation, but instead of +returning only the final result, :func:`accumulate` returns an iterator that +also yields each partial result:: itertools.accumulate([1,2,3,4,5]) => 1, 3, 6, 10, 15 @@ -1235,6 +1238,8 @@ Python documentation Documentation for the :mod:`itertools` module. +Documentation for the :mod:`functools` module. + Documentation for the :mod:`operator` module. :pep:`289`: "Generator Expressions" From d125738e93a35125d0edbe8070dd47160bcda829 Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Mon, 5 Jun 2017 19:10:21 -0500 Subject: [PATCH 0360/2287] [3.6] bpo-30417: Disable 'cpu' and 'tzdata' resources on Travis (GH-1928) Also weakens the 'should this be run?' regex to allow all builds when .travis.yml changes. (cherry picked from commit c53b13b270767948fddb58b287149c499f9a03c4) --- .travis.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4dfefb72700dbd..cb33e9b61e8631 100644 --- a/.travis.yml +++ b/.travis.yml @@ -45,7 +45,7 @@ matrix: env: OPTIONAL=true before_script: - | - if ! git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '(\.(rst|yml)$)|(^Doc)/' + if ! git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '(\.rst$)|(^Doc)|(^Misc)' then echo "Only docs were updated, stopping build process." exit @@ -57,16 +57,16 @@ matrix: ./venv/bin/python -m pip install -U coverage script: # Skip tests that re-run the entire test suite. - - ./venv/bin/python -m coverage run --pylib -m test -uall -x test_multiprocessing_fork -x test_multiprocessing_forkserver -x test_multiprocessing_spawn + - ./venv/bin/python -m coverage run --pylib -m test -uall,-cpu,-tzdata -x test_multiprocessing_fork -x test_multiprocessing_forkserver -x test_multiprocessing_spawn after_script: # Probably should be after_success once test suite updated to run under coverage.py. # Make the `coverage` command available to Codecov w/ a version of Python that can parse all source files. - source ./venv/bin/activate - bash <(curl -s https://codecov.io/bash) -# Travis provides only 2 cores, so don't overdue the parallelism and waste memory. +# Travis provides only 2 cores, so don't overdo the parallelism and waste memory. before_script: - | - if ! git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '(\.(rst|yml)$)|(^Doc)/' + if ! git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '(\.rst$)|(^Doc)|(^Misc)' then echo "Only docs were updated, stopping build process." exit @@ -76,7 +76,7 @@ before_script: script: # `-r -w` implicitly provided through `make buildbottest`. - - make buildbottest TESTOPTS="-j4" + - make buildbottest TESTOPTS="-j4 -uall,-cpu,-tzdata" notifications: email: false From 798cfb212383a6f5a31b610825d1af1d376804b2 Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Tue, 6 Jun 2017 12:19:37 +1000 Subject: [PATCH 0361/2287] bpo-30052: Always regenerate cross-references (GH-1339) (GH-1921) The patch for bpo-30052 changed the preferred link target for :func:`bytes` and :func`bytearray` references to be the respective type definitions rather than the corresponding builtin function entries. This patch changes the daily documentation builds to disable the output caching in Sphinx, in order to ensure that cross-reference changes like this one are reliably picked up and applied automatically after merging. (cherry picked from commit 7a82f9c2b94d31c8f4cc8bb8e3151765d8b148d7) --- Doc/Makefile | 9 +++++++-- Misc/NEWS | 9 +++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Doc/Makefile b/Doc/Makefile index 94697f95671894..ae59f3294f1c06 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -159,15 +159,20 @@ serve: ../Tools/scripts/serve.py build/html # Targets for daily automated doc build +# By default, Sphinx only rebuilds pages where the page content has changed. +# This means it doesn't always pick up changes to preferred link targets, etc +# To ensure such changes are picked up, we build the published docs with +# `-E` (to ignore the cached environment) and `-a` (to ignore already existing +# output files) # for development releases: always build autobuild-dev: - make dist SPHINXOPTS='$(SPHINXOPTS) -A daily=1 -A versionswitcher=1' + make dist SPHINXOPTS='$(SPHINXOPTS) -Ea -A daily=1 -A versionswitcher=1' -make suspicious # for quick rebuilds (HTML only) autobuild-dev-html: - make html SPHINXOPTS='$(SPHINXOPTS) -A daily=1 -A versionswitcher=1' + make html SPHINXOPTS='$(SPHINXOPTS) -Ea -A daily=1 -A versionswitcher=1' # for stable releases: only build if not in pre-release stage (alpha, beta) # release candidate downloads are okay, since the stable tree can be in that stage diff --git a/Misc/NEWS b/Misc/NEWS index 86dd1b4543819c..1656e07f6eb1df 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -192,6 +192,15 @@ Build Documentation ------------- +- Issue #30052: the link targets for :func:`bytes` and + :func:`bytearray` are now their respective type definitions, rather + than the corresponding builtin function entries. Use :ref:`bytes ` + and :ref:`bytearray ` to reference the latter. + + In order to ensure this and future cross-reference updates are applied + automatically, the daily documentation builds now disable the default + output caching features in Sphinx. + - bpo-26985: Add missing info of code object in inspect documentation. Tools/Demos From 01ea561f29aec4fa82cabc3896409f918d6ef470 Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Mon, 5 Jun 2017 22:41:17 -0500 Subject: [PATCH 0362/2287] [3.6] Install dependencies in Travis OSX build (GH-1952) (cherry picked from commit 167e0fc211c06df) --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index cb33e9b61e8631..2b4556fc6fc462 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,6 +28,10 @@ matrix: compiler: clang # Testing under macOS is optional until testing stability has been demonstrated. env: OPTIONAL=true + before_install: + - brew install openssl xz + - export CPPFLAGS="-I$(brew --prefix openssl)/include" + - export LDFLAGS="-L$(brew --prefix openssl)/lib" - os: linux language: python python: 3.6 From e1a60d903276da10d1ac098e59103f4a72bef08e Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 6 Jun 2017 08:56:59 -0700 Subject: [PATCH 0363/2287] [3.6] bpo-30303: IDLE: Add _utest argument to textview (GH-1499) (#1916) (cherry picked from commit ba365da9cee8901fad08ab0b61c7489c110e5c97) --- Lib/idlelib/idle_test/test_textview.py | 42 +++++++++++++++++++++++++- Lib/idlelib/textview.py | 26 ++++++++++------ 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/Lib/idlelib/idle_test/test_textview.py b/Lib/idlelib/idle_test/test_textview.py index f018f5ef1975ba..67fc0b7c4f1c6d 100644 --- a/Lib/idlelib/idle_test/test_textview.py +++ b/Lib/idlelib/idle_test/test_textview.py @@ -13,7 +13,7 @@ import unittest import os -from tkinter import Tk +from tkinter import Tk, Button from idlelib.idle_test.mock_idle import Func from idlelib.idle_test.mock_tk import Mbox_func @@ -96,5 +96,45 @@ def test_view_file(self): self.assertIsNone(view) +class ButtonClickTextViewTest(unittest.TestCase): + + def setUp(self): + self.view = None + self.called = False + + def tearDown(self): + if self.view: + self.view.destroy() + + def test_view_text_bind_with_button(self): + def _command(): + self.called = True + self.view = tv.view_text(root, 'TITLE_TEXT', 'COMMAND', _utest=True) + button = Button(root, text='BUTTON', command=_command) + button.invoke() + self.addCleanup(button.destroy) + + self.assertEqual(self.called, True) + self.assertEqual(self.view.title(), 'TITLE_TEXT') + self.assertEqual(self.view.textView.get('1.0', '1.end'), 'COMMAND') + + def test_view_file_bind_with_button(self): + def _command(): + self.called = True + self.view = tv.view_file(root, 'TITLE_FILE', __file__, _utest=True) + button = Button(root, text='BUTTON', command=_command) + button.invoke() + self.addCleanup(button.destroy) + + self.assertEqual(self.called, True) + self.assertEqual(self.view.title(), 'TITLE_FILE') + with open(__file__) as f: + self.assertEqual(self.view.textView.get('1.0', '1.end'), + f.readline().strip()) + f.readline() + self.assertEqual(self.view.textView.get('3.0', '3.end'), + f.readline().strip()) + + if __name__ == '__main__': unittest.main(verbosity=2) diff --git a/Lib/idlelib/textview.py b/Lib/idlelib/textview.py index adee326e1deb91..f33ac32a33a3bb 100644 --- a/Lib/idlelib/textview.py +++ b/Lib/idlelib/textview.py @@ -9,14 +9,15 @@ class TextViewer(Toplevel): "A simple text viewer dialog for IDLE." - def __init__(self, parent, title, text, modal=True, _htest=False): - """Show the given text in a scrollable window with a 'close' button + def __init__(self, parent, title, text, modal=True, + _htest=False, _utest=False): + """Show the given text in a scrollable window with a 'close' button. - If modal option set to False, user can interact with other windows, - otherwise they will be unable to interact with other windows until - the textview window is closed. + If modal is left True, users cannot interact with other windows + until the textview window is closed. _htest - bool; change box location when running htest. + _utest - bool; don't wait_window when running unittest. """ Toplevel.__init__(self, parent) self.configure(borderwidth=5) @@ -42,9 +43,11 @@ def __init__(self, parent, title, text, modal=True, _htest=False): if modal: self.transient(parent) self.grab_set() - self.wait_window() + if not _utest: + self.wait_window() def CreateWidgets(self): + "Create Frame with Text (with vertical Scrollbar) and Button." frameText = Frame(self, relief=SUNKEN, height=700) frameButtons = Frame(self) self.buttonOk = Button(frameButtons, text='Close', @@ -65,10 +68,12 @@ def Ok(self, event=None): self.destroy() -def view_text(parent, title, text, modal=True): - return TextViewer(parent, title, text, modal) +def view_text(parent, title, text, modal=True, _utest=False): + "Display text in a TextViewer." + return TextViewer(parent, title, text, modal, _utest=_utest) -def view_file(parent, title, filename, encoding=None, modal=True): +def view_file(parent, title, filename, encoding=None, modal=True, _utest=False): + "Display file in a TextViever or show error message." try: with open(filename, 'r', encoding=encoding) as file: contents = file.read() @@ -81,7 +86,8 @@ def view_file(parent, title, filename, encoding=None, modal=True): message=str(err), parent=parent) else: - return view_text(parent, title, contents, modal) + return view_text(parent, title, contents, modal, _utest=_utest) + if __name__ == '__main__': import unittest From 68e5af89d46db6250a0fa7fe4249c66f866faff8 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 6 Jun 2017 19:23:02 +0300 Subject: [PATCH 0364/2287] [3.6] bpo-30567: Fix refleak in sys.getwindowsversion (GH-1940) (#1970) (cherry picked from commit 48fb766) --- Python/sysmodule.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 99e6b5ea018ea1..b09268b0e53854 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -985,10 +985,10 @@ sys_getwindowsversion(PyObject *self) } PyMem_RawFree(verblock); } - PyStructSequence_SET_ITEM(version, pos++, PyTuple_Pack(3, - PyLong_FromLong(realMajor), - PyLong_FromLong(realMinor), - PyLong_FromLong(realBuild) + PyStructSequence_SET_ITEM(version, pos++, Py_BuildValue("(kkk)", + realMajor, + realMinor, + realBuild )); if (PyErr_Occurred()) { From b25b7254d909697bb7f3aa893b740cb650547cb6 Mon Sep 17 00:00:00 2001 From: wim glenn Date: Tue, 6 Jun 2017 14:32:14 -0500 Subject: [PATCH 0365/2287] bpo-30583: Fix typo in datetime dateutil documentation (GH-1972) (GH-1974) Replace `datetuil` into `dateutil` (cherry picked from commit 53f2af16551eb3a080da313257603c31ef8b93b4) --- Doc/library/datetime.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index c9318557f5c826..98fe86eba8ac77 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -1849,11 +1849,11 @@ only EST (fixed offset -5 hours), or only EDT (fixed offset -4 hours)). .. seealso:: - `datetuil.tz `_ + `dateutil.tz `_ The standard library has :class:`timezone` class for handling arbitrary fixed offsets from UTC and :attr:`timezone.utc` as UTC timezone instance. - *datetuil.tz* library brings the *IANA timezone database* (also known as the + *dateutil.tz* library brings the *IANA timezone database* (also known as the Olson database) to Python and its usage is recommended. `IANA timezone database `_ From 2bafc0dccac2390a52670ba289878318b6ea0293 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 6 Jun 2017 13:47:14 -0700 Subject: [PATCH 0366/2287] =?UTF-8?q?[3.6]=20bpo-30557:=20faulthandler=20n?= =?UTF-8?q?ow=20correctly=20filters=20and=20displays=20exception=20?= =?UTF-8?q?=E2=80=A6=20(#1960)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * bpo-30557: faulthandler now correctly filters and displays exception codes on Windows (#1924) * bpo-30557: faulthandler now correctly filters and displays exception codes on Windows * Adds test for non-fatal exceptions. * Adds bpo number to comment. * bpo-30557: Fix test_faulthandler (#1969) On Windows 8, 8.1 and 10 at least, the exit code is the exception code (no bit is cleared). --- Lib/test/test_faulthandler.py | 28 ++++++++++++++++++++++++++++ Misc/NEWS | 3 +++ Modules/faulthandler.c | 8 ++++---- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py index 01cbae3f200b1a..20fe1e2655946f 100644 --- a/Lib/test/test_faulthandler.py +++ b/Lib/test/test_faulthandler.py @@ -755,6 +755,34 @@ def test_raise_exception(self): 3, name) + @unittest.skipUnless(MS_WINDOWS, 'specific to Windows') + def test_raise_nonfatal_exception(self): + # These exceptions are not strictly errors. Letting + # faulthandler display the traceback when they are + # raised is likely to result in noise. However, they + # may still terminate the process if there is no + # handler installed for them (which there typically + # is, e.g. for debug messages). + for exc in ( + 0x00000000, + 0x34567890, + 0x40000000, + 0x40001000, + 0x70000000, + 0x7FFFFFFF, + ): + output, exitcode = self.get_output(f""" + import faulthandler + faulthandler.enable() + faulthandler._raise_exception(0x{exc:x}) + """ + ) + self.assertEqual(output, []) + # On Windows older than 7 SP1, the actual exception code has + # bit 29 cleared. + self.assertIn(exitcode, + (exc, exc & ~0x10000000)) + @unittest.skipUnless(MS_WINDOWS, 'specific to Windows') def test_disable_windows_exc_handler(self): code = dedent(""" diff --git a/Misc/NEWS b/Misc/NEWS index 1656e07f6eb1df..6177ee40ab6577 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -45,6 +45,9 @@ Core and Builtins Library ------- +- bpo-30557: faulthandler now correctly filters and displays exception codes + on Windows + - bpo-30378: Fix the problem that logging.handlers.SysLogHandler cannot handle IPv6 addresses. diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index 61fc4908b0fe9b..2efa998ff89aac 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -373,8 +373,8 @@ faulthandler_exc_handler(struct _EXCEPTION_POINTERS *exc_info) DWORD code = exc_info->ExceptionRecord->ExceptionCode; DWORD flags = exc_info->ExceptionRecord->ExceptionFlags; - /* only log fatal exceptions */ - if (flags & EXCEPTION_NONCONTINUABLE) { + /* bpo-30557: only log fatal exceptions */ + if (!(code & 0x80000000)) { /* call the next exception handler */ return EXCEPTION_CONTINUE_SEARCH; } @@ -391,8 +391,8 @@ faulthandler_exc_handler(struct _EXCEPTION_POINTERS *exc_info) case EXCEPTION_IN_PAGE_ERROR: PUTS(fd, "page error"); break; case EXCEPTION_STACK_OVERFLOW: PUTS(fd, "stack overflow"); break; default: - PUTS(fd, "code "); - _Py_DumpDecimal(fd, code); + PUTS(fd, "code 0x"); + _Py_DumpHexadecimal(fd, code, 8); } PUTS(fd, "\n\n"); From 063f0b358331322d84f85008e6c01f80ff321fd6 Mon Sep 17 00:00:00 2001 From: gfyoung Date: Tue, 6 Jun 2017 17:17:18 -0400 Subject: [PATCH 0367/2287] bpo-29596: Improve clinic howto documentation (GH-1710) (GH-1976) Clarify that `two-pass` buffer can only be dumped once, and it prints out all text sent to it during all processing, even from Clinic blocks *after* the dumping point. --- Doc/howto/clinic.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/howto/clinic.rst b/Doc/howto/clinic.rst index eaab20ad975548..083a299cb32a56 100644 --- a/Doc/howto/clinic.rst +++ b/Doc/howto/clinic.rst @@ -1407,8 +1407,8 @@ Let's start with defining some terminology: ``two-pass`` A buffer like ``buffer``. However, a two-pass buffer can only - be written once, and it prints out all text sent to it during - all of processing, even from Clinic blocks *after* the + be dumped once, and it prints out all text sent to it during + all processing, even from Clinic blocks *after* the dumping point. ``suppress`` The text is suppressed—thrown away. @@ -1471,7 +1471,7 @@ preset configurations, as follows: The default filename is ``"{dirname}/clinic/{basename}.h"``. ``buffer`` - Save up all most of the output from Clinic, to be written into + Save up most of the output from Clinic, to be written into your file near the end. For Python files implementing modules or builtin types, it's recommended that you dump the buffer just above the static structures for your module or From 6fb12b5c43945f61f3da82e33eafb4ddae2296ee Mon Sep 17 00:00:00 2001 From: Nate Date: Tue, 6 Jun 2017 17:31:03 -0700 Subject: [PATCH 0368/2287] bpo-29581: bpo-29581: Make ABCMeta.__new__ pass **kwargs to type.__new__ (GH-527) (GH-1282) Many metaclasses in the standard library don't play nice with __init_subclass__. This bug makes ABCMeta in particular with __init_subclass__, which is an 80/20 solution for me personally. AFAICT, a general solution to this problem requires updating all metaclasses in the standard library to make sure they pass **kwargs to type.__new__, whereas this PR only fixes ABCMeta. For context, see https://bugs.python.org/issue29581. * added a test combining ABCMeta and __init_subclass__ * Added NEWS item (cherry picked from commit bd583ef9857d99f9145ad0bb2c4424cc0baa63fc) * [3.6] bpo-29581: Make ABCMeta.__new__ pass **kwargs to type.__new__ (GH-527) Many metaclasses in the standard library don't play nice with __init_subclass__. This bug makes ABCMeta in particular with __init_subclass__, which is an 80/20 solution for me personally. AFAICT, a general solution to this problem requires updating all metaclasses in the standard library to make sure they pass **kwargs to type.__new__, whereas this PR only fixes ABCMeta. For context, see https://bugs.python.org/issue29581. * added a test combining ABCMeta and __init_subclass__ * Added NEWS item. (cherry picked from commit bd583ef9857d99f9145ad0bb2c4424cc0baa63fc) * **kwargs -> ``kwargs`` in attempts to fix the Travis build. * Quote the **kwargs --- Lib/abc.py | 4 ++-- Lib/test/test_abc.py | 12 ++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Lib/abc.py b/Lib/abc.py index 1cbf96a61f238f..43a34a0bbded78 100644 --- a/Lib/abc.py +++ b/Lib/abc.py @@ -129,8 +129,8 @@ class ABCMeta(type): # external code. _abc_invalidation_counter = 0 - def __new__(mcls, name, bases, namespace): - cls = super().__new__(mcls, name, bases, namespace) + def __new__(mcls, name, bases, namespace, **kwargs): + cls = super().__new__(mcls, name, bases, namespace, **kwargs) # Compute set of abstract method names abstracts = {name for name, value in namespace.items() diff --git a/Lib/test/test_abc.py b/Lib/test/test_abc.py index e1765f0d5a54cb..4bc838200413af 100644 --- a/Lib/test/test_abc.py +++ b/Lib/test/test_abc.py @@ -404,5 +404,17 @@ class C(A, B): self.assertEqual(B.counter, 1) +class TestABCWithInitSubclass(unittest.TestCase): + def test_works_with_init_subclass(self): + saved_kwargs = {} + class ReceivesClassKwargs: + def __init_subclass__(cls, **kwargs): + super().__init_subclass__() + saved_kwargs.update(kwargs) + class Receiver(ReceivesClassKwargs, abc.ABC, x=1, y=2, z=3): + pass + self.assertEqual(saved_kwargs, dict(x=1, y=2, z=3)) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS index 6177ee40ab6577..515960daf7930f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -45,6 +45,9 @@ Core and Builtins Library ------- +- bpo-29581: ABCMeta.__new__ now accepts ``**kwargs``, allowing abstract base + classes to use keyword parameters in __init_subclass__. Patch by Nate Soares. + - bpo-30557: faulthandler now correctly filters and displays exception codes on Windows From 09b6c0c71ea944f7e8b46998f3ebaf5b9fbe15f6 Mon Sep 17 00:00:00 2001 From: Nate Date: Tue, 6 Jun 2017 21:21:34 -0700 Subject: [PATCH 0369/2287] [3.6] bpo-29822: make inspect.isabstract() work during __init_subclass__ (#1979) At the time when an abstract base class' __init_subclass__ runs, ABCMeta.__new__ has not yet finished running, so in the presence of __init_subclass__, inspect.isabstract() can no longer depend only on TPFLAGS_IS_ABSTRACT. (cherry picked from commit fcfe80ec2592fed8b3941c79056a8737abef7d3b) --- Lib/inspect.py | 23 ++++++++++++++++++++++- Lib/test/test_inspect.py | 24 ++++++++++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/Lib/inspect.py b/Lib/inspect.py index a2dcb888a0c609..2894672f501e8b 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -31,6 +31,7 @@ __author__ = ('Ka-Ping Yee ', 'Yury Selivanov ') +import abc import ast import dis import collections.abc @@ -291,7 +292,27 @@ def isroutine(object): def isabstract(object): """Return true if the object is an abstract base class (ABC).""" - return bool(isinstance(object, type) and object.__flags__ & TPFLAGS_IS_ABSTRACT) + if not isinstance(object, type): + return False + if object.__flags__ & TPFLAGS_IS_ABSTRACT: + return True + if not issubclass(type(object), abc.ABCMeta): + return False + if hasattr(object, '__abstractmethods__'): + # It looks like ABCMeta.__new__ has finished running; + # TPFLAGS_IS_ABSTRACT should have been accurate. + return False + # It looks like ABCMeta.__new__ has not finished running yet; we're + # probably in __init_subclass__. We'll look for abstractmethods manually. + for name, value in object.__dict__.items(): + if getattr(value, "__isabstractmethod__", False): + return True + for base in object.__bases__: + for name in getattr(base, "__abstractmethods__", ()): + value = getattr(object, name, None) + if getattr(value, "__isabstractmethod__", False): + return True + return False def getmembers(object, predicate=None): """Return all members of an object as (name, value) pairs sorted by name. diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index cfea281c70db11..37e451188a97be 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -232,6 +232,30 @@ def foo(self): self.assertFalse(inspect.isabstract(int)) self.assertFalse(inspect.isabstract(5)) + def test_isabstract_during_init_subclass(self): + from abc import ABCMeta, abstractmethod + isabstract_checks = [] + class AbstractChecker(metaclass=ABCMeta): + def __init_subclass__(cls): + isabstract_checks.append(inspect.isabstract(cls)) + class AbstractClassExample(AbstractChecker): + @abstractmethod + def foo(self): + pass + class ClassExample(AbstractClassExample): + def foo(self): + pass + self.assertEqual(isabstract_checks, [True, False]) + + isabstract_checks.clear() + class AbstractChild(AbstractClassExample): + pass + class AbstractGrandchild(AbstractChild): + pass + class ConcreteGrandchild(ClassExample): + pass + self.assertEqual(isabstract_checks, [True, True, False]) + class TestInterpreterStack(IsTestBase): def __init__(self, *args, **kwargs): diff --git a/Misc/NEWS b/Misc/NEWS index 515960daf7930f..b819c6db73af2f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -45,6 +45,9 @@ Core and Builtins Library ------- +- bpo-29822: inspect.isabstract() now works during __init_subclass__. Patch + by Nate Soares. + - bpo-29581: ABCMeta.__new__ now accepts ``**kwargs``, allowing abstract base classes to use keyword parameters in __init_subclass__. Patch by Nate Soares. From ceabf9acf03f9bbe660d856bff90ecab475ab543 Mon Sep 17 00:00:00 2001 From: Antoine Pietri Date: Wed, 7 Jun 2017 19:18:56 +0200 Subject: [PATCH 0370/2287] bpo-30177: pathlib: include the full path in resolve(strict=False) (#1893) (#1985) --- Lib/pathlib.py | 19 ++++++++----------- Lib/test/test_pathlib.py | 21 ++++++++++++--------- Misc/ACKS | 1 + 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 70f5cba76ffa8a..48b566d9295f8f 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -187,19 +187,18 @@ def resolve(self, path, strict=False): if strict: return self._ext_to_normal(_getfinalpathname(s)) else: + tail_parts = [] # End of the path after the first one not found while True: try: s = self._ext_to_normal(_getfinalpathname(s)) except FileNotFoundError: previous_s = s - s = os.path.dirname(s) + s, tail = os.path.split(s) + tail_parts.append(tail) if previous_s == s: return path else: - if previous_s is None: - return s - else: - return s + os.path.sep + os.path.basename(previous_s) + return os.path.join(s, *reversed(tail_parts)) # Means fallback on absolute return None @@ -330,12 +329,10 @@ def _resolve(path, rest): try: target = accessor.readlink(newpath) except OSError as e: - if e.errno != EINVAL: - if strict: - raise - else: - return newpath - # Not a symlink + if e.errno != EINVAL and strict: + raise + # Not a symlink, or non-strict mode. We just leave the path + # untouched. path = newpath else: seen[newpath] = None # not resolved symlink diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 846f721e8d9abb..6502413a73d061 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1507,10 +1507,10 @@ def test_resolve_common(self): os.path.join(BASE, 'foo')) p = P(BASE, 'foo', 'in', 'spam') self.assertEqual(str(p.resolve(strict=False)), - os.path.join(BASE, 'foo')) + os.path.join(BASE, 'foo', 'in', 'spam')) p = P(BASE, '..', 'foo', 'in', 'spam') self.assertEqual(str(p.resolve(strict=False)), - os.path.abspath(os.path.join('foo'))) + os.path.abspath(os.path.join('foo', 'in', 'spam'))) # These are all relative symlinks p = P(BASE, 'dirB', 'fileB') self._check_resolve_relative(p, p) @@ -1522,16 +1522,18 @@ def test_resolve_common(self): self._check_resolve_relative(p, P(BASE, 'dirB', 'fileB')) # Non-strict p = P(BASE, 'dirA', 'linkC', 'fileB', 'foo', 'in', 'spam') - self._check_resolve_relative(p, P(BASE, 'dirB', 'fileB', 'foo'), False) + self._check_resolve_relative(p, P(BASE, 'dirB', 'fileB', 'foo', 'in', + 'spam'), False) p = P(BASE, 'dirA', 'linkC', '..', 'foo', 'in', 'spam') if os.name == 'nt': # In Windows, if linkY points to dirB, 'dirA\linkY\..' # resolves to 'dirA' without resolving linkY first. - self._check_resolve_relative(p, P(BASE, 'dirA', 'foo'), False) + self._check_resolve_relative(p, P(BASE, 'dirA', 'foo', 'in', + 'spam'), False) else: # In Posix, if linkY points to dirB, 'dirA/linkY/..' # resolves to 'dirB/..' first before resolving to parent of dirB. - self._check_resolve_relative(p, P(BASE, 'foo'), False) + self._check_resolve_relative(p, P(BASE, 'foo', 'in', 'spam'), False) # Now create absolute symlinks d = tempfile.mkdtemp(suffix='-dirD') self.addCleanup(support.rmtree, d) @@ -1541,16 +1543,17 @@ def test_resolve_common(self): self._check_resolve_absolute(p, P(BASE, 'dirB', 'fileB')) # Non-strict p = P(BASE, 'dirA', 'linkX', 'linkY', 'foo', 'in', 'spam') - self._check_resolve_relative(p, P(BASE, 'dirB', 'foo'), False) + self._check_resolve_relative(p, P(BASE, 'dirB', 'foo', 'in', 'spam'), + False) p = P(BASE, 'dirA', 'linkX', 'linkY', '..', 'foo', 'in', 'spam') if os.name == 'nt': # In Windows, if linkY points to dirB, 'dirA\linkY\..' # resolves to 'dirA' without resolving linkY first. - self._check_resolve_relative(p, P(d, 'foo'), False) + self._check_resolve_relative(p, P(d, 'foo', 'in', 'spam'), False) else: # In Posix, if linkY points to dirB, 'dirA/linkY/..' # resolves to 'dirB/..' first before resolving to parent of dirB. - self._check_resolve_relative(p, P(BASE, 'foo'), False) + self._check_resolve_relative(p, P(BASE, 'foo', 'in', 'spam'), False) @with_symlinks def test_resolve_dot(self): @@ -1564,7 +1567,7 @@ def test_resolve_dot(self): r = q / '3' / '4' self.assertRaises(FileNotFoundError, r.resolve, strict=True) # Non-strict - self.assertEqual(r.resolve(strict=False), p / '3') + self.assertEqual(r.resolve(strict=False), p / '3' / '4') def test_with(self): p = self.cls(BASE) diff --git a/Misc/ACKS b/Misc/ACKS index 7fc5fecc8a4605..bbdc69d9c9fd64 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1190,6 +1190,7 @@ Steve Piercy Jim St. Pierre Dan Pierson Martijn Pieters +Antoine Pietri Anand B. Pillai François Pinard Tom Pinckney From 2c7f927369922562adecd5c25ad55b4bf733f716 Mon Sep 17 00:00:00 2001 From: Matthias Klose Date: Wed, 7 Jun 2017 18:07:41 -0700 Subject: [PATCH 0371/2287] [3.6] trivial: update config.{guess,sub} from gnu.org. (GH-1987) (#1990) * Update config.{guess,sub} from gnu.org. (cherry picked from commit 6f46683a6257f22f25d136ed080d58d0c060a43b) --- config.guess | 197 ++++++++++++++++++++++++++++++++------------------- config.sub | 90 ++++++++++++++++------- 2 files changed, 191 insertions(+), 96 deletions(-) diff --git a/config.guess b/config.guess index 1f5c50c0d1529d..2193702b12af30 100755 --- a/config.guess +++ b/config.guess @@ -1,8 +1,8 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2014 Free Software Foundation, Inc. +# Copyright 1992-2017 Free Software Foundation, Inc. -timestamp='2014-03-23' +timestamp='2017-05-27' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -24,12 +24,12 @@ timestamp='2014-03-23' # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # -# Originally written by Per Bothner. +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # -# Please send patches with a ChangeLog entry to config-patches@gnu.org. +# Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` @@ -50,7 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2014 Free Software Foundation, Inc. +Copyright 1992-2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -168,19 +168,29 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || \ + echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-unknown + ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. + # to ELF recently (or will in the future) and ABI. case "${UNAME_MACHINE_ARCH}" in + earm*) + os=netbsdelf + ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ @@ -197,6 +207,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in os=netbsd ;; esac + # Determine ABI tags. + case "${UNAME_MACHINE_ARCH}" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` + ;; + esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need @@ -207,13 +224,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in release='-gnu' ;; *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" + echo "${machine}-${os}${release}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` @@ -223,6 +240,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE} + exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; @@ -235,6 +256,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; + *:Sortix:*:*) + echo ${UNAME_MACHINE}-unknown-sortix + exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) @@ -251,42 +275,42 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; + UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; + UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; + UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; + UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; + UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; + UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; + UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; + UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; + UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 @@ -359,16 +383,16 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build - SUN_ARCH="i386" + SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then - SUN_ARCH="x86_64" + SUN_ARCH=x86_64 fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` @@ -393,7 +417,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} @@ -579,8 +603,9 @@ EOF else IBM_ARCH=powerpc fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi @@ -617,13 +642,13 @@ EOF sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi @@ -662,11 +687,11 @@ EOF exit (0); } EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ ${HP_ARCH} = "hppa2.0w" ] + if [ ${HP_ARCH} = hppa2.0w ] then eval $set_cc_for_build @@ -679,12 +704,12 @@ EOF # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then - HP_ARCH="hppa2.0w" + HP_ARCH=hppa2.0w else - HP_ARCH="hppa64" + HP_ARCH=hppa64 fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} @@ -789,14 +814,14 @@ EOF echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) @@ -812,10 +837,11 @@ EOF UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; esac + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin @@ -878,7 +904,7 @@ EOF exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix @@ -901,7 +927,7 @@ EOF EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) @@ -932,6 +958,9 @@ EOF crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; + e2k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; @@ -944,6 +973,9 @@ EOF ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; + k1om:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; @@ -969,6 +1001,9 @@ EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; + mips64el:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; @@ -1001,6 +1036,9 @@ EOF ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; @@ -1020,7 +1058,7 @@ EOF echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} @@ -1099,7 +1137,7 @@ EOF # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that + # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; @@ -1248,6 +1286,9 @@ EOF SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux${UNAME_RELEASE} + exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; @@ -1261,16 +1302,23 @@ EOF UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub @@ -1285,7 +1333,7 @@ EOF exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then + if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi @@ -1294,15 +1342,18 @@ EOF *:QNX:*:4*) echo i386-pc-qnx exit ;; - NEO-?:NONSTOP_KERNEL:*:*) + NEO-*:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; - NSR-?:NONSTOP_KERNEL:*:*) + NSR-*:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk${UNAME_RELEASE} + exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; @@ -1316,7 +1367,7 @@ EOF # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - if test "$cputype" = "386"; then + if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" @@ -1358,7 +1409,7 @@ EOF echo i386-pc-xenix exit ;; i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'` exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos @@ -1369,23 +1420,25 @@ EOF x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; esac cat >&2 < in order to provide the needed -information to handle your system. +If $0 has already been updated, send the following data and any +information you think might be pertinent to config-patches@gnu.org to +provide the necessary information to handle your system. config.guess timestamp = $timestamp diff --git a/config.sub b/config.sub index d654d03cdcd222..40ea5dfe1152f0 100755 --- a/config.sub +++ b/config.sub @@ -1,8 +1,8 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright 1992-2014 Free Software Foundation, Inc. +# Copyright 1992-2017 Free Software Foundation, Inc. -timestamp='2014-05-01' +timestamp='2017-04-02' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -25,7 +25,7 @@ timestamp='2014-05-01' # of the GNU General Public License, version 3 ("GPLv3"). -# Please send patches with a ChangeLog entry to config-patches@gnu.org. +# Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. @@ -33,7 +33,7 @@ timestamp='2014-05-01' # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases @@ -53,8 +53,7 @@ timestamp='2014-05-01' me=`echo "$0" | sed -e 's,.*/,,'` usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. @@ -68,7 +67,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright 1992-2014 Free Software Foundation, Inc. +Copyright 1992-2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -117,8 +116,8 @@ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ + kopensolaris*-gnu* | cloudabi*-eabi* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` @@ -255,15 +254,16 @@ case $basic_machine in | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ + | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ - | epiphany \ - | fido | fr30 | frv \ + | e2k | epiphany \ + | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ - | i370 | i860 | i960 | ia64 \ + | i370 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ @@ -301,10 +301,12 @@ case $basic_machine in | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pru \ | pyramid \ + | riscv32 | riscv64 \ | rl78 | rx \ | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ @@ -312,6 +314,8 @@ case $basic_machine in | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | visium \ + | wasm32 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) @@ -326,6 +330,9 @@ case $basic_machine in c6x) basic_machine=tic6x-unknown ;; + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none @@ -371,17 +378,18 @@ case $basic_machine in | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ + | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ + | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ - | i*86-* | i860-* | i960-* | ia64-* \ + | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ @@ -422,13 +430,15 @@ case $basic_machine in | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pru-* \ | pyramid-* \ + | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ @@ -436,6 +446,8 @@ case $basic_machine in | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ + | visium-* \ + | wasm32-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ @@ -512,6 +524,9 @@ case $basic_machine in basic_machine=i386-pc os=-aros ;; + asmjs) + basic_machine=asmjs-unknown + ;; aux) basic_machine=m68k-apple os=-aux @@ -632,6 +647,14 @@ case $basic_machine in basic_machine=m68k-bull os=-sysv3 ;; + e500v[12]) + basic_machine=powerpc-unknown + os=$os"spe" + ;; + e500v[12]-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + os=$os"spe" + ;; ebmon29k) basic_machine=a29k-amd os=-ebmon @@ -773,6 +796,9 @@ case $basic_machine in basic_machine=m68k-isi os=-sysv ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` + ;; m68knommu) basic_machine=m68k-unknown os=-linux @@ -828,6 +854,10 @@ case $basic_machine in basic_machine=powerpc-unknown os=-morphos ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; msdos) basic_machine=i386-pc os=-msdos @@ -920,6 +950,9 @@ case $basic_machine in nsr-tandem) basic_machine=nsr-tandem ;; + nsx-tandem) + basic_machine=nsx-tandem + ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf @@ -1004,7 +1037,7 @@ case $basic_machine in ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; - ppcle | powerpclittle | ppc-le | powerpc-little) + ppcle | powerpclittle) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) @@ -1014,7 +1047,7 @@ case $basic_machine in ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) + ppc64le | powerpc64little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) @@ -1215,6 +1248,9 @@ case $basic_machine in basic_machine=a29k-wrs os=-vxworks ;; + wasm32) + basic_machine=wasm32-unknown + ;; w65*) basic_machine=w65-wdc os=-none @@ -1360,27 +1396,28 @@ case $os in | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* \ + | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -bitrig* | -openbsd* | -solidbsd* \ + | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* | -cegcc* \ + | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ + | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1512,6 +1549,8 @@ case $os in ;; -nacl*) ;; + -ios) + ;; -none) ;; *) @@ -1607,6 +1646,9 @@ case $basic_machine in sparc-* | *-sun) os=-sunos4.1.1 ;; + pru-*) + os=-elf + ;; *-be) os=-beos ;; From 854f7ba1d5cbb6a42511beae66c8dbe34f2cbcd3 Mon Sep 17 00:00:00 2001 From: "Nathaniel J. Smith" Date: Thu, 8 Jun 2017 04:14:40 -0700 Subject: [PATCH 0372/2287] [3.6] bpo-30594: Fixed refcounting in newPySSLSocket (GH-1992) (#1994) If pass a server_hostname= that fails IDNA decoding to SSLContext.wrap_socket or SSLContext.wrap_bio, then the SSLContext object had a spurious Py_DECREF called on it, eventually leading to segfaults. (cherry picked from commit 65ece7ca2366308fa91a39a8dfa255e6bdce3cca) --- Modules/_ssl.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 2a2c18fe2f7309..dbfbd44399299b 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -599,6 +599,7 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock, self->ssl = NULL; self->Socket = NULL; self->ctx = sslctx; + Py_INCREF(sslctx); self->shutdown_seen_zero = 0; self->handshake_done = 0; self->owner = NULL; @@ -613,8 +614,6 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock, self->server_hostname = hostname; } - Py_INCREF(sslctx); - /* Make sure the SSL error state is initialized */ (void) ERR_get_state(); ERR_clear_error(); From ca1b66fd059758bbd6e2cc62c8f2adecefe8f942 Mon Sep 17 00:00:00 2001 From: Denis Osipov Date: Thu, 8 Jun 2017 17:02:05 +0500 Subject: [PATCH 0373/2287] [3.6] bpo-30584: Fix test_os fails on non-English Windows (GH-1980) (#1999) * Fix bpo-30584 * Adding a comment mentionning the bpo and explaining what is the identifier * Add Denis Osipov to Misc/ACKS (cherry picked from commit 897bba75632dfce87c355e3cd4700468357715a7) --- Lib/test/test_os.py | 4 +++- Misc/ACKS | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index e9fdb0719f4bf4..46ad2099a9f524 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -473,7 +473,9 @@ def test_access_denied(self): # force CreateFile to fail with ERROR_ACCESS_DENIED. DETACHED_PROCESS = 8 subprocess.check_call( - ['icacls.exe', fname, '/deny', 'Users:(S)'], + # bpo-30584: Use security identifier *S-1-5-32-545 instead + # of localized "Users" to not depend on the locale. + ['icacls.exe', fname, '/deny', '*S-1-5-32-545:(S)'], creationflags=DETACHED_PROCESS ) result = os.stat(fname) diff --git a/Misc/ACKS b/Misc/ACKS index bbdc69d9c9fd64..c2ebf7faa40a9e 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1121,6 +1121,7 @@ William Orr Michele Orrù Tomáš Orsava Oleg Oshmyan +Denis Osipov Denis S. Otkidach Peter Otten Michael Otteneder From 31b950ab86f5c99a18c16dbf1900b854b94e0659 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 8 Jun 2017 23:13:12 +0200 Subject: [PATCH 0374/2287] bpo-30601: Fix a refleak in WindowsConsoleIO (#2003) (#2008) Fix a reference leak in _io._WindowsConsoleIO: PyUnicode_FSDecoder() always initialize decodedname when it succeed and it doesn't clear input decodedname object. (cherry picked from commit 29adc13bd797d9c9e7fcb893a7c49ce7f7ad388c) --- Modules/_io/winconsoleio.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Modules/_io/winconsoleio.c b/Modules/_io/winconsoleio.c index cbe21422bb4653..94dfe3e4c63146 100644 --- a/Modules/_io/winconsoleio.c +++ b/Modules/_io/winconsoleio.c @@ -101,7 +101,7 @@ char _PyIO_get_console_type(PyObject *path_or_fd) { DWORD length; wchar_t name_buf[MAX_PATH], *pname_buf = name_buf; - + length = GetFullPathNameW(decoded_wstr, MAX_PATH, pname_buf, NULL); if (length > MAX_PATH) { pname_buf = PyMem_New(wchar_t, length); @@ -305,8 +305,7 @@ _io__WindowsConsoleIO___init___impl(winconsoleio *self, PyObject *nameobj, self->fd = fd; if (fd < 0) { - PyObject *decodedname = Py_None; - Py_INCREF(decodedname); + PyObject *decodedname; int d = PyUnicode_FSDecoder(nameobj, (void*)&decodedname); if (!d) From b319d09ee4427aac1ee8f298692127d34ef57dc0 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 8 Jun 2017 23:14:07 +0200 Subject: [PATCH 0375/2287] bpo-30418: Popen.communicate() always ignore EINVAL (#2002) (#2004) On Windows, subprocess.Popen.communicate() now also ignore EINVAL on stdin.write() if the child process is still running but closed the pipe. (cherry picked from commit d52aa31378ae43e044a300edfe8285954c167216) --- Lib/subprocess.py | 14 ++++++++------ Misc/NEWS | 3 +++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 172126929160bf..e626a8afdbb7f0 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -776,19 +776,21 @@ def _stdin_write(self, input): self.stdin.write(input) except BrokenPipeError: pass # communicate() must ignore broken pipe errors. - except OSError as e: - if e.errno == errno.EINVAL and self.poll() is not None: - # Issue #19612: On Windows, stdin.write() fails with EINVAL - # if the process already exited before the write + except OSError as exc: + if exc.errno == errno.EINVAL: + # bpo-19612, bpo-30418: On Windows, stdin.write() fails + # with EINVAL if the child process exited or if the child + # process is still running but closed the pipe. pass else: raise + try: self.stdin.close() except BrokenPipeError: pass # communicate() must ignore broken pipe errors. - except OSError as e: - if e.errno == errno.EINVAL and self.poll() is not None: + except OSError as exc: + if exc.errno == errno.EINVAL: pass else: raise diff --git a/Misc/NEWS b/Misc/NEWS index b819c6db73af2f..d10e7a371f489d 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -45,6 +45,9 @@ Core and Builtins Library ------- +- bpo-30418: On Windows, subprocess.Popen.communicate() now also ignore EINVAL + on stdin.write() if the child process is still running but closed the pipe. + - bpo-29822: inspect.isabstract() now works during __init_subclass__. Patch by Nate Soares. From 570b1c971c31cd08dbf060f4e21636c40aa47786 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 9 Jun 2017 00:38:06 +0300 Subject: [PATCH 0376/2287] [3.6] bpo-30529: Fix errors for invalid whitespaces in f-string subexpressions. (GH-1888) (#2013) 'invalid character in identifier' now is raised instead of 'f-string: empty expression not allowed' if a subexpression contains only whitespaces and they are not accepted by Python parser. (cherry picked from commit 2e9cd58) --- Lib/test/test_fstring.py | 10 ++++++++++ Python/ast.c | 31 +++++++------------------------ 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index 25730029ae76f1..b39870457af492 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -280,6 +280,10 @@ def test_missing_expression(self): "f'{10:{ }}'", "f' { } '", + # The Python parser ignores also the following + # whitespace characters in additional to a space. + "f'''{\t\f\r\n}'''", + # Catch the empty expression before the # invalid conversion. "f'{!x}'", @@ -300,6 +304,12 @@ def test_missing_expression(self): "f'{:x'", ]) + # Different error message is raised for other whitespace characters. + self.assertAllRaise(SyntaxError, 'invalid character in identifier', + ["f'''{\xa0}'''", + "\xa0", + ]) + def test_parens_in_expressions(self): self.assertEqual(f'{3,}', '(3,)') diff --git a/Python/ast.c b/Python/ast.c index ed05a1e53bdb5e..c61ca4bbcd5528 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -4247,49 +4247,32 @@ fstring_compile_expr(const char *expr_start, const char *expr_end, struct compiling *c, const node *n) { - int all_whitespace = 1; - int kind; - void *data; PyCompilerFlags cf; mod_ty mod; char *str; - PyObject *o; Py_ssize_t len; - Py_ssize_t i; + const char *s; assert(expr_end >= expr_start); assert(*(expr_start-1) == '{'); assert(*expr_end == '}' || *expr_end == '!' || *expr_end == ':'); - /* We know there are no escapes here, because backslashes are not allowed, - and we know it's utf-8 encoded (per PEP 263). But, in order to check - that each char is not whitespace, we need to decode it to unicode. - Which is unfortunate, but such is life. */ - /* If the substring is all whitespace, it's an error. We need to catch this here, and not when we call PyParser_ASTFromString, because turning the expression '' in to '()' would go from being invalid to valid. */ - /* Note that this code says an empty string is all whitespace. That's - important. There's a test for it: f'{}'. */ - o = PyUnicode_DecodeUTF8(expr_start, expr_end-expr_start, NULL); - if (o == NULL) - return NULL; - len = PyUnicode_GET_LENGTH(o); - kind = PyUnicode_KIND(o); - data = PyUnicode_DATA(o); - for (i = 0; i < len; i++) { - if (!Py_UNICODE_ISSPACE(PyUnicode_READ(kind, data, i))) { - all_whitespace = 0; + for (s = expr_start; s != expr_end; s++) { + char c = *s; + /* The Python parser ignores only the following whitespace + characters (\r already is converted to \n). */ + if (!(c == ' ' || c == '\t' || c == '\n' || c == '\f')) { break; } } - Py_DECREF(o); - if (all_whitespace) { + if (s == expr_end) { ast_error(c, n, "f-string: empty expression not allowed"); return NULL; } - /* Reuse len to be the length of the utf-8 input string. */ len = expr_end - expr_start; /* Allocate 3 extra bytes: open paren, close paren, null byte. */ str = PyMem_RawMalloc(len + 3); From f0ff849adc6b4a01f9d1f08d9ad0f1511ff84541 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 9 Jun 2017 13:24:53 +0200 Subject: [PATCH 0377/2287] bpo-30524: Fix _PyStack_UnpackDict() (#1886) * bpo-29259: Remove unused func parameter of _PyStack_UnpackDict() * bpo-29286: Change _PyStack_UnpackDict() prototype to be able to notify of failure when args is NULL. _PyStack_UnpackDict() now returns -1 on error. --- Include/abstract.h | 16 +++++++++------- Objects/abstract.c | 19 ++++++++++--------- Objects/methodobject.c | 3 +-- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/Include/abstract.h b/Include/abstract.h index 7d137a22bfb7a8..6bb76ec95f1b2e 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -290,21 +290,23 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ PyObject **values, PyObject *kwnames); - /* Convert (args, nargs, kwargs) into a (stack, nargs, kwnames). + /* Convert (args, nargs, kwargs: dict) into (stack, nargs, kwnames: tuple). - Return a new stack which should be released by PyMem_Free(), or return - args unchanged if kwargs is NULL or an empty dictionary. + Return 0 on success, raise an exception and return -1 on error. + + Write the new stack into *p_stack. If *p_stack is differen than args, it + must be released by PyMem_Free(). The stack uses borrowed references. The type of keyword keys is not checked, these checks should be done - later (ex: _PyArg_ParseStack). */ - PyAPI_FUNC(PyObject **) _PyStack_UnpackDict( + later (ex: _PyArg_ParseStackAndKeywords). */ + PyAPI_FUNC(int) _PyStack_UnpackDict( PyObject **args, Py_ssize_t nargs, PyObject *kwargs, - PyObject **kwnames, - PyObject *func); + PyObject ***p_stack, + PyObject **p_kwnames); /* Call the callable object func with the "fast call" calling convention: args is a C array for positional arguments (nargs is the number of diff --git a/Objects/abstract.c b/Objects/abstract.c index d838856d452872..3585b34ca4d8bd 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -2389,9 +2389,9 @@ _PyStack_AsDict(PyObject **values, PyObject *kwnames) return kwdict; } -PyObject ** +int _PyStack_UnpackDict(PyObject **args, Py_ssize_t nargs, PyObject *kwargs, - PyObject **p_kwnames, PyObject *func) + PyObject ***p_stack, PyObject **p_kwnames) { PyObject **stack, **kwstack; Py_ssize_t nkwargs; @@ -2402,27 +2402,27 @@ _PyStack_UnpackDict(PyObject **args, Py_ssize_t nargs, PyObject *kwargs, assert(nargs >= 0); assert(kwargs == NULL || PyDict_CheckExact(kwargs)); - nkwargs = (kwargs != NULL) ? PyDict_Size(kwargs) : 0; - if (!nkwargs) { + if (kwargs == NULL || (nkwargs = PyDict_Size(kwargs)) == 0) { + *p_stack = args; *p_kwnames = NULL; - return args; + return 0; } if ((size_t)nargs > PY_SSIZE_T_MAX / sizeof(stack[0]) - (size_t)nkwargs) { PyErr_NoMemory(); - return NULL; + return -1; } stack = PyMem_Malloc((nargs + nkwargs) * sizeof(stack[0])); if (stack == NULL) { PyErr_NoMemory(); - return NULL; + return -1; } kwnames = PyTuple_New(nkwargs); if (kwnames == NULL) { PyMem_Free(stack); - return NULL; + return -1; } /* Copy position arguments (borrowed references) */ @@ -2441,8 +2441,9 @@ _PyStack_UnpackDict(PyObject **args, Py_ssize_t nargs, PyObject *kwargs, i++; } + *p_stack = stack; *p_kwnames = kwnames; - return stack; + return 0; } PyObject * diff --git a/Objects/methodobject.c b/Objects/methodobject.c index c2001f0169b030..fe52545667f2ed 100644 --- a/Objects/methodobject.c +++ b/Objects/methodobject.c @@ -243,8 +243,7 @@ _PyCFunction_FastCallDict(PyObject *func_obj, PyObject **args, Py_ssize_t nargs, PyObject *kwnames; _PyCFunctionFast fastmeth = (_PyCFunctionFast)meth; - stack = _PyStack_UnpackDict(args, nargs, kwargs, &kwnames, func_obj); - if (stack == NULL) { + if (_PyStack_UnpackDict(args, nargs, kwargs, &stack, &kwnames) < 0) { return NULL; } From c422959daca0598fabbefa5de4417ebce3b1da06 Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Fri, 9 Jun 2017 22:37:53 +1000 Subject: [PATCH 0378/2287] [3.6] bpo-19180: Updated references for RFC 1750, RFC 3280 & RFC 4366 * RFC 1750 has been been obsoleted by RFC 4086. * RFC 3280 has been obsoleted by RFC 5280. * RFC 4366 has been obsoleted by RFC 6066. (cherry picked from commit 63c2c8ac17750ba2be2cfc4e339cae1f4edee54f) --- Doc/library/ssl.rst | 19 ++++++++----------- Modules/_ssl.c | 2 +- Modules/clinic/_ssl.c.h | 2 +- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index 0ce73c14095480..16756e1d73e767 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -374,9 +374,9 @@ Certificate handling Verify that *cert* (in decoded format as returned by :meth:`SSLSocket.getpeercert`) matches the given *hostname*. The rules applied are those for checking the identity of HTTPS servers as outlined - in :rfc:`2818` and :rfc:`6125`. In addition to HTTPS, this function - should be suitable for checking the identity of servers in various - SSL-based protocols such as FTPS, IMAPS, POPS and others. + in :rfc:`2818`, :rfc:`5280` and :rfc:`6125`. In addition to HTTPS, this + function should be suitable for checking the identity of servers in + various SSL-based protocols such as FTPS, IMAPS, POPS and others. :exc:`CertificateError` is raised on failure. On success, the function returns nothing:: @@ -820,7 +820,7 @@ Constants .. data:: HAS_SNI Whether the OpenSSL library has built-in support for the *Server Name - Indication* extension (as defined in :rfc:`4366`). + Indication* extension (as defined in :rfc:`6066`). .. versionadded:: 3.2 @@ -2306,14 +2306,11 @@ successful call of :func:`~ssl.RAND_add`, :func:`~ssl.RAND_bytes` or `RFC 1422: Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management `_ Steve Kent - `RFC 1750: Randomness Recommendations for Security `_ - D. Eastlake et. al. + `RFC 4086: Randomness Requirements for Security `_ + Donald E., Jeffrey I. Schiller - `RFC 3280: Internet X.509 Public Key Infrastructure Certificate and CRL Profile `_ - Housley et. al. - - `RFC 4366: Transport Layer Security (TLS) Extensions `_ - Blake-Wilson et. al. + `RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile `_ + D. Cooper `RFC 5246: The Transport Layer Security (TLS) Protocol Version 1.2 `_ T. Dierks et. al. diff --git a/Modules/_ssl.c b/Modules/_ssl.c index dbfbd44399299b..a421fc0d2d6ff2 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -4475,7 +4475,7 @@ _ssl.RAND_add Mix string into the OpenSSL PRNG state. entropy (a float) is a lower bound on the entropy contained in -string. See RFC 1750. +string. See RFC 4086. [clinic start generated code]*/ static PyObject * diff --git a/Modules/clinic/_ssl.c.h b/Modules/clinic/_ssl.c.h index 29f58384394c98..333aad76b404fc 100644 --- a/Modules/clinic/_ssl.c.h +++ b/Modules/clinic/_ssl.c.h @@ -839,7 +839,7 @@ PyDoc_STRVAR(_ssl_RAND_add__doc__, "Mix string into the OpenSSL PRNG state.\n" "\n" "entropy (a float) is a lower bound on the entropy contained in\n" -"string. See RFC 1750."); +"string. See RFC 4086."); #define _SSL_RAND_ADD_METHODDEF \ {"RAND_add", (PyCFunction)_ssl_RAND_add, METH_VARARGS, _ssl_RAND_add__doc__}, From af609a00a64fd58bd67c102f208ed9fe15c2748d Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 9 Jun 2017 07:32:46 -0700 Subject: [PATCH 0379/2287] bpo-24755: Document asyncio.wrap_future (GH-603) (GH-2019) (cherry picked from commit 824f6879121413e09439fffef54580413e44bf46) --- Doc/library/asyncio-task.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index 558d17c0969793..804f1925b40929 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -540,6 +540,11 @@ Task functions .. deprecated:: 3.4.4 +.. function:: wrap_future(future, \*, loop=None) + + Wrap a :class:`concurrent.futures.Future` object in a :class:`Future` + object. + .. function:: gather(\*coros_or_futures, loop=None, return_exceptions=False) Return a future aggregating results from the given coroutine objects or From bbeaccc76b2a4a7e2601579446c84cb12fea5f05 Mon Sep 17 00:00:00 2001 From: terryjreedy Date: Fri, 9 Jun 2017 15:59:31 -0400 Subject: [PATCH 0380/2287] [3.6] IDLE test_textview: add comments and test, increase coverage to 100% (GH-1641) (#2018) (cherry picked from commit 295304d412700cc6621bb592109fa42249a9dcdb) --- Lib/idlelib/idle_test/test_textview.py | 33 +++++++++++++++++++------- Lib/idlelib/textview.py | 1 + 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/Lib/idlelib/idle_test/test_textview.py b/Lib/idlelib/idle_test/test_textview.py index 67fc0b7c4f1c6d..57b886aba11f31 100644 --- a/Lib/idlelib/idle_test/test_textview.py +++ b/Lib/idlelib/idle_test/test_textview.py @@ -5,7 +5,7 @@ Using mock Text would not change this. Other mocks are used to retrieve information about calls. -Coverage: 94%. +Coverage: 100%. ''' from idlelib import textview as tv from test.support import requires @@ -28,14 +28,20 @@ def tearDownModule(): root.destroy() # Pyflakes falsely sees root as undefined. del root +# If we call TextViewer or wrapper functions with defaults +# modal=True, _utest=False, test hangs on call to wait_window. +# Have also gotten tk error 'can't invoke "event" command'. + class TV(tv.TextViewer): # Used in TextViewTest. transient = Func() grab_set = Func() wait_window = Func() -class TextViewTest(unittest.TestCase): +# Call wrapper class with mock wait_window. +class TextViewTest(unittest.TestCase): + def setUp(self): TV.transient.__init__() TV.grab_set.__init__() @@ -64,6 +70,7 @@ def test_ok(self): view.destroy() +# Call TextViewer with modal=False. class ViewFunctionTest(unittest.TestCase): @classmethod @@ -77,26 +84,34 @@ def tearDownClass(cls): del cls.orig_error def test_view_text(self): - # If modal True, get tk error 'can't invoke "event" command'. view = tv.view_text(root, 'Title', 'test text', modal=False) self.assertIsInstance(view, tv.TextViewer) view.Ok() def test_view_file(self): - test_dir = os.path.dirname(__file__) - testfile = os.path.join(test_dir, 'test_textview.py') - view = tv.view_file(root, 'Title', testfile, modal=False) + view = tv.view_file(root, 'Title', __file__, modal=False) self.assertIsInstance(view, tv.TextViewer) self.assertIn('Test', view.textView.get('1.0', '1.end')) view.Ok() + def test_bad_file(self): # Mock showerror will be used; view_file will return None. - testfile = os.path.join(test_dir, '../notthere.py') - view = tv.view_file(root, 'Title', testfile, modal=False) + view = tv.view_file(root, 'Title', 'abc.xyz', modal=False) self.assertIsNone(view) + self.assertEqual(tv.showerror.title, 'File Load Error') + + def test_bad_encoding(self): + p = os.path + fn = p.abspath(p.join(p.dirname(__file__), '..', 'CREDITS.txt')) + tv.showerror.title = None + view = tv.view_file(root, 'Title', fn, 'ascii', modal=False) + self.assertIsNone(view) + self.assertEqual(tv.showerror.title, 'Unicode Decode Error') + -class ButtonClickTextViewTest(unittest.TestCase): +# Call TextViewer with _utest=True. +class ButtonClickTest(unittest.TestCase): def setUp(self): self.view = None diff --git a/Lib/idlelib/textview.py b/Lib/idlelib/textview.py index f33ac32a33a3bb..dc1a7bfc9eff38 100644 --- a/Lib/idlelib/textview.py +++ b/Lib/idlelib/textview.py @@ -87,6 +87,7 @@ def view_file(parent, title, filename, encoding=None, modal=True, _utest=False): parent=parent) else: return view_text(parent, title, contents, modal, _utest=_utest) + return None if __name__ == '__main__': From b7577456c430283f8b7ec4e914b701cb943cc69b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 9 Jun 2017 22:28:32 +0200 Subject: [PATCH 0381/2287] bpo-30524: Write unit tests for FASTCALL (#2022) (#2030) Test C functions: * _PyObject_FastCall() * _PyObject_FastCallDict() * _PyObject_FastCallKeywords() (cherry picked from commit 3b5cf85edc188345668f987c824a2acb338a7816) --- Lib/test/test_call.py | 176 ++++++++++++++++++++++++++++++++++++++ Modules/_testcapimodule.c | 101 ++++++++++++++++++++++ 2 files changed, 277 insertions(+) diff --git a/Lib/test/test_call.py b/Lib/test/test_call.py index e2b8e0fd1233d9..2e8819be5dac68 100644 --- a/Lib/test/test_call.py +++ b/Lib/test/test_call.py @@ -1,4 +1,10 @@ +import datetime import unittest +from test.support import cpython_only +try: + import _testcapi +except ImportError: + _testcapi = None # The test cases here cover several paths through the function calling # code. They depend on the METH_XXX flag that is used to define a C @@ -122,5 +128,175 @@ def test_oldargs1_2_kw(self): self.assertRaises(TypeError, [].count, x=2, y=2) +def pyfunc(arg1, arg2): + return [arg1, arg2] + + +def pyfunc_noarg(): + return "noarg" + + +class PythonClass: + def method(self, arg1, arg2): + return [arg1, arg2] + + def method_noarg(self): + return "noarg" + + @classmethod + def class_method(cls): + return "classmethod" + + @staticmethod + def static_method(): + return "staticmethod" + + +PYTHON_INSTANCE = PythonClass() + + +IGNORE_RESULT = object() + + +@cpython_only +class FastCallTests(unittest.TestCase): + # Test calls with positional arguments + CALLS_POSARGS = ( + # (func, args: tuple, result) + + # Python function with 2 arguments + (pyfunc, (1, 2), [1, 2]), + + # Python function without argument + (pyfunc_noarg, (), "noarg"), + + # Python class methods + (PythonClass.class_method, (), "classmethod"), + (PythonClass.static_method, (), "staticmethod"), + + # Python instance methods + (PYTHON_INSTANCE.method, (1, 2), [1, 2]), + (PYTHON_INSTANCE.method_noarg, (), "noarg"), + (PYTHON_INSTANCE.class_method, (), "classmethod"), + (PYTHON_INSTANCE.static_method, (), "staticmethod"), + + # C function: METH_NOARGS + (globals, (), IGNORE_RESULT), + + # C function: METH_O + (id, ("hello",), IGNORE_RESULT), + + # C function: METH_VARARGS + (dir, (1,), IGNORE_RESULT), + + # C function: METH_VARARGS | METH_KEYWORDS + (min, (5, 9), 5), + + # C function: METH_FASTCALL + (divmod, (1000, 33), (30, 10)), + + # C type static method: METH_FASTCALL | METH_CLASS + (int.from_bytes, (b'\x01\x00', 'little'), 1), + + # bpo-30524: Test that calling a C type static method with no argument + # doesn't crash (ignore the result): METH_FASTCALL | METH_CLASS + (datetime.datetime.now, (), IGNORE_RESULT), + ) + + # Test calls with positional and keyword arguments + CALLS_KWARGS = ( + # (func, args: tuple, kwargs: dict, result) + + # Python function with 2 arguments + (pyfunc, (1,), {'arg2': 2}, [1, 2]), + (pyfunc, (), {'arg1': 1, 'arg2': 2}, [1, 2]), + + # Python instance methods + (PYTHON_INSTANCE.method, (1,), {'arg2': 2}, [1, 2]), + (PYTHON_INSTANCE.method, (), {'arg1': 1, 'arg2': 2}, [1, 2]), + + # C function: METH_VARARGS | METH_KEYWORDS + (max, ([],), {'default': 9}, 9), + + # C type static method: METH_FASTCALL | METH_CLASS + (int.from_bytes, (b'\x01\x00',), {'byteorder': 'little'}, 1), + (int.from_bytes, (), {'bytes': b'\x01\x00', 'byteorder': 'little'}, 1), + ) + + def check_result(self, result, expected): + if expected is IGNORE_RESULT: + return + self.assertEqual(result, expected) + + def test_fastcall(self): + # Test _PyObject_FastCall() + + for func, args, expected in self.CALLS_POSARGS: + with self.subTest(func=func, args=args): + result = _testcapi.pyobject_fastcall(func, args) + self.check_result(result, expected) + + if not args: + # args=NULL, nargs=0 + result = _testcapi.pyobject_fastcall(func, None) + self.check_result(result, expected) + + def test_fastcall_dict(self): + # Test _PyObject_FastCallDict() + + for func, args, expected in self.CALLS_POSARGS: + with self.subTest(func=func, args=args): + # kwargs=NULL + result = _testcapi.pyobject_fastcalldict(func, args, None) + self.check_result(result, expected) + + # kwargs={} + result = _testcapi.pyobject_fastcalldict(func, args, {}) + self.check_result(result, expected) + + if not args: + # args=NULL, nargs=0, kwargs=NULL + result = _testcapi.pyobject_fastcalldict(func, None, None) + self.check_result(result, expected) + + # args=NULL, nargs=0, kwargs={} + result = _testcapi.pyobject_fastcalldict(func, None, {}) + self.check_result(result, expected) + + for func, args, kwargs, expected in self.CALLS_KWARGS: + with self.subTest(func=func, args=args, kwargs=kwargs): + result = _testcapi.pyobject_fastcalldict(func, args, kwargs) + self.check_result(result, expected) + + def test_fastcall_keywords(self): + # Test _PyObject_FastCallKeywords() + + for func, args, expected in self.CALLS_POSARGS: + with self.subTest(func=func, args=args): + # kwnames=NULL + result = _testcapi.pyobject_fastcallkeywords(func, args, None) + self.check_result(result, expected) + + # kwnames=() + result = _testcapi.pyobject_fastcallkeywords(func, args, ()) + self.check_result(result, expected) + + if not args: + # kwnames=NULL + result = _testcapi.pyobject_fastcallkeywords(func, None, None) + self.check_result(result, expected) + + # kwnames=() + result = _testcapi.pyobject_fastcallkeywords(func, None, ()) + self.check_result(result, expected) + + for func, args, kwargs, expected in self.CALLS_KWARGS: + with self.subTest(func=func, args=args, kwargs=kwargs): + kwnames = tuple(kwargs.keys()) + args = args + tuple(kwargs.values()) + result = _testcapi.pyobject_fastcallkeywords(func, args, kwnames) + self.check_result(result, expected) + + if __name__ == "__main__": unittest.main() diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index c76eefab4e80cf..5e73293e0e0eaf 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -4027,6 +4027,104 @@ dict_get_version(PyObject *self, PyObject *args) } +static int +fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs) +{ + if (args == Py_None) { + *stack = NULL; + *nargs = 0; + } + else if (PyTuple_Check(args)) { + *stack = &PyTuple_GET_ITEM(args, 0); + *nargs = PyTuple_GET_SIZE(args); + } + else { + PyErr_SetString(PyExc_TypeError, "args must be None or a tuple"); + return -1; + } + return 0; +} + + +static PyObject * +test_pyobject_fastcall(PyObject *self, PyObject *args) +{ + PyObject *func, *func_args; + PyObject **stack; + Py_ssize_t nargs; + + if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) { + return NULL; + } + + if (fastcall_args(func_args, &stack, &nargs) < 0) { + return NULL; + } + return _PyObject_FastCall(func, stack, nargs); +} + + +static PyObject * +test_pyobject_fastcalldict(PyObject *self, PyObject *args) +{ + PyObject *func, *func_args, *kwargs; + PyObject **stack; + Py_ssize_t nargs; + + if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwargs)) { + return NULL; + } + + if (fastcall_args(func_args, &stack, &nargs) < 0) { + return NULL; + } + + if (kwargs == Py_None) { + kwargs = NULL; + } + else if (!PyDict_Check(kwargs)) { + PyErr_SetString(PyExc_TypeError, "kwnames must be None or a dict"); + return NULL; + } + + return _PyObject_FastCallDict(func, stack, nargs, kwargs); +} + + +static PyObject * +test_pyobject_fastcallkeywords(PyObject *self, PyObject *args) +{ + PyObject *func, *func_args, *kwnames = NULL; + PyObject **stack; + Py_ssize_t nargs, nkw; + + if (!PyArg_ParseTuple(args, "OOO", &func, &func_args, &kwnames)) { + return NULL; + } + + if (fastcall_args(func_args, &stack, &nargs) < 0) { + return NULL; + } + + if (kwnames == Py_None) { + kwnames = NULL; + } + else if (PyTuple_Check(kwnames)) { + nkw = PyTuple_GET_SIZE(kwnames); + if (nargs < nkw) { + PyErr_SetString(PyExc_ValueError, "kwnames longer than args"); + return NULL; + } + nargs -= nkw; + } + else { + PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple"); + return NULL; + } + return _PyObject_FastCallKeywords(func, stack, nargs, kwnames); +} + + static PyMethodDef TestMethods[] = { {"raise_exception", raise_exception, METH_VARARGS}, {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS}, @@ -4230,6 +4328,9 @@ static PyMethodDef TestMethods[] = { {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS}, {"tracemalloc_get_traceback", tracemalloc_get_traceback, METH_VARARGS}, {"dict_get_version", dict_get_version, METH_VARARGS}, + {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS}, + {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS}, + {"pyobject_fastcallkeywords", test_pyobject_fastcallkeywords, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; From e89f95bfd0881a9b80c3b1430d154a77bdf5a824 Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Fri, 9 Jun 2017 17:06:39 -0400 Subject: [PATCH 0382/2287] [3.6] bpo-30039: Don't run signal handlers while resuming a yield from stack (GH-1081) (#1640) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If we have a chain of generators/coroutines that are 'yield from'ing each other, then resuming the stack works like: - call send() on the outermost generator - this enters _PyEval_EvalFrameDefault, which re-executes the YIELD_FROM opcode - which calls send() on the next generator - which enters _PyEval_EvalFrameDefault, which re-executes the YIELD_FROM opcode - ...etc. However, every time we enter _PyEval_EvalFrameDefault, the first thing we do is to check for pending signals, and if there are any then we run the signal handler. And if it raises an exception, then we immediately propagate that exception *instead* of starting to execute bytecode. This means that e.g. a SIGINT at the wrong moment can "break the chain" – it can be raised in the middle of our yield from chain, with the bottom part of the stack abandoned for the garbage collector. The fix is pretty simple: there's already a special case in _PyEval_EvalFrameEx where it skips running signal handlers if the next opcode is SETUP_FINALLY. (I don't see how this accomplishes anything useful, but that's another story.) If we extend this check to also skip running signal handlers when the next opcode is YIELD_FROM, then that closes the hole – now the exception can only be raised at the innermost stack frame. This shouldn't have any performance implications, because the opcode check happens inside the "slow path" after we've already determined that there's a pending signal or something similar for us to process; the vast majority of the time this isn't true and the new check doesn't run at all.. (cherry picked from commit ab4413a7e9bda95b6fcd517073e2a51dafaa1624) --- Lib/test/test_generators.py | 29 +++++++++++++++++++++++++++++ Misc/NEWS | 4 ++++ Modules/_testcapimodule.c | 24 ++++++++++++++++++++++++ Python/ceval.c | 17 ++++++++++++++--- 4 files changed, 71 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py index f81c82f705e43c..7107bd9993258f 100644 --- a/Lib/test/test_generators.py +++ b/Lib/test/test_generators.py @@ -10,6 +10,35 @@ from test import support +_testcapi = support.import_module('_testcapi') + + +# This tests to make sure that if a SIGINT arrives just before we send into a +# yield from chain, the KeyboardInterrupt is raised in the innermost +# generator (see bpo-30039). +class SignalAndYieldFromTest(unittest.TestCase): + + def generator1(self): + return (yield from self.generator2()) + + def generator2(self): + try: + yield + except KeyboardInterrupt: + return "PASSED" + else: + return "FAILED" + + def test_raise_and_yield_from(self): + gen = self.generator1() + gen.send(None) + try: + _testcapi.raise_SIGINT_then_send_None(gen) + except BaseException as _exc: + exc = _exc + self.assertIs(type(exc), StopIteration) + self.assertEqual(exc.value, "PASSED") + class FinalizationTest(unittest.TestCase): diff --git a/Misc/NEWS b/Misc/NEWS index d10e7a371f489d..580f5793a1e94c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -19,6 +19,10 @@ Core and Builtins - bpo-25794: Fixed type.__setattr__() and type.__delattr__() for non-interned attribute names. Based on patch by Eryk Sun. +- bpo-30039: If a KeyboardInterrupt happens when the interpreter is in + the middle of resuming a chain of nested 'yield from' or 'await' + calls, it's now correctly delivered to the innermost frame. + - bpo-12414: sys.getsizeof() on a code object now returns the sizes which includes the code struct and sizes of objects which it references. Patch by Dong-hee Na. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 5e73293e0e0eaf..c3d829c7139cad 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -4125,6 +4125,29 @@ test_pyobject_fastcallkeywords(PyObject *self, PyObject *args) } +static PyObject * +raise_SIGINT_then_send_None(PyObject *self, PyObject *args) +{ + PyGenObject *gen; + + if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen)) + return NULL; + + /* This is used in a test to check what happens if a signal arrives just + as we're in the process of entering a yield from chain (see + bpo-30039). + + Needs to be done in C, because: + - we don't have a Python wrapper for raise() + - we need to make sure that the Python-level signal handler doesn't run + *before* we enter the generator frame, which is impossible in Python + because we check for signals before every bytecode operation. + */ + raise(SIGINT); + return _PyGen_Send(gen, Py_None); +} + + static PyMethodDef TestMethods[] = { {"raise_exception", raise_exception, METH_VARARGS}, {"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS}, @@ -4331,6 +4354,7 @@ static PyMethodDef TestMethods[] = { {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS}, {"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS}, {"pyobject_fastcallkeywords", test_pyobject_fastcallkeywords, METH_VARARGS}, + {"raise_SIGINT_then_send_None", raise_SIGINT_then_send_None, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; diff --git a/Python/ceval.c b/Python/ceval.c index 5dc0444a1acf5c..eba892c1ce3b3c 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1119,9 +1119,20 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) Py_MakePendingCalls() above. */ if (_Py_atomic_load_relaxed(&eval_breaker)) { - if (_Py_OPCODE(*next_instr) == SETUP_FINALLY) { - /* Make the last opcode before - a try: finally: block uninterruptible. */ + if (_Py_OPCODE(*next_instr) == SETUP_FINALLY || + _Py_OPCODE(*next_instr) == YIELD_FROM) { + /* Two cases where we skip running signal handlers and other + pending calls: + - If we're about to enter the try: of a try/finally (not + *very* useful, but might help in some cases and it's + traditional) + - If we're resuming a chain of nested 'yield from' or + 'await' calls, then each frame is parked with YIELD_FROM + as its next opcode. If the user hit control-C we want to + wait until we've reached the innermost frame before + running the signal handler and raising KeyboardInterrupt + (see bpo-30039). + */ goto fast_next_opcode; } if (_Py_atomic_load_relaxed(&pendingcalls_to_do)) { From fa7f519113fd32f432f9f52a956bbcdc542dce93 Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Fri, 9 Jun 2017 17:07:48 -0400 Subject: [PATCH 0383/2287] Fix waiter cancellation in asyncio.Lock (#1031) (#2037) Avoid a deadlock when the waiter who is about to take the lock is cancelled Issue #27585 --- Lib/asyncio/locks.py | 17 ++++++++++++----- Lib/test/test_asyncio/test_locks.py | 22 ++++++++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/Lib/asyncio/locks.py b/Lib/asyncio/locks.py index deefc938ecfb01..92661830a06228 100644 --- a/Lib/asyncio/locks.py +++ b/Lib/asyncio/locks.py @@ -176,6 +176,10 @@ def acquire(self): yield from fut self._locked = True return True + except futures.CancelledError: + if not self._locked: + self._wake_up_first() + raise finally: self._waiters.remove(fut) @@ -192,14 +196,17 @@ def release(self): """ if self._locked: self._locked = False - # Wake up the first waiter who isn't cancelled. - for fut in self._waiters: - if not fut.done(): - fut.set_result(True) - break + self._wake_up_first() else: raise RuntimeError('Lock is not acquired.') + def _wake_up_first(self): + """Wake up the first waiter who isn't cancelled.""" + for fut in self._waiters: + if not fut.done(): + fut.set_result(True) + break + class Event: """Asynchronous equivalent to threading.Event. diff --git a/Lib/test/test_asyncio/test_locks.py b/Lib/test/test_asyncio/test_locks.py index 152948c8138975..c85e8b1a32f73a 100644 --- a/Lib/test/test_asyncio/test_locks.py +++ b/Lib/test/test_asyncio/test_locks.py @@ -176,6 +176,28 @@ def lockit(name, blocker): self.assertTrue(tb.cancelled()) self.assertTrue(tc.done()) + def test_finished_waiter_cancelled(self): + lock = asyncio.Lock(loop=self.loop) + + ta = asyncio.Task(lock.acquire(), loop=self.loop) + test_utils.run_briefly(self.loop) + self.assertTrue(lock.locked()) + + tb = asyncio.Task(lock.acquire(), loop=self.loop) + test_utils.run_briefly(self.loop) + self.assertEqual(len(lock._waiters), 1) + + # Create a second waiter, wake up the first, and cancel it. + # Without the fix, the second was not woken up. + tc = asyncio.Task(lock.acquire(), loop=self.loop) + lock.release() + tb.cancel() + test_utils.run_briefly(self.loop) + + self.assertTrue(lock.locked()) + self.assertTrue(ta.done()) + self.assertTrue(tb.cancelled()) + def test_release_not_acquired(self): lock = asyncio.Lock(loop=self.loop) diff --git a/Misc/NEWS b/Misc/NEWS index 580f5793a1e94c..0342c71cd65a13 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,9 @@ Core and Builtins Library ------- +- bpo-27585: Fix waiter cancellation in asyncio.Lock. + Patch by Mathieu Sornay. + - bpo-30418: On Windows, subprocess.Popen.communicate() now also ignore EINVAL on stdin.write() if the child process is still running but closed the pipe. From d24429a20def5e77ee415fdd8f37faf020a96bff Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 9 Jun 2017 14:34:32 -0700 Subject: [PATCH 0384/2287] [3.6] Clarify what --enable-optimizations does (GH-1847) (GH-2039) (cherry picked from commit b4e5fee6f5bcc50500ea6261a22021db58955b55) --- configure | 20 ++++---------------- configure.ac | 4 ++-- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/configure b/configure index 09a94624c1b2b4..10ac675ea8624f 100755 --- a/configure +++ b/configure @@ -784,7 +784,6 @@ infodir docdir oldincludedir includedir -runstatedir localstatedir sharedstatedir sysconfdir @@ -896,7 +895,6 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' -runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1149,15 +1147,6 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; - -runstatedir | --runstatedir | --runstatedi | --runstated \ - | --runstate | --runstat | --runsta | --runst | --runs \ - | --run | --ru | --r) - ac_prev=runstatedir ;; - -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ - | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ - | --run=* | --ru=* | --r=*) - runstatedir=$ac_optarg ;; - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1295,7 +1284,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir runstatedir + libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1448,7 +1437,6 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -1489,8 +1477,8 @@ Optional Features: Build (MacOSX|Darwin) framework --enable-shared disable/enable building shared python library --enable-profiling enable C-level code profiling - --enable-optimizations Enable expensive optimizations (PGO, etc). Disabled - by default. + --enable-optimizations Enable expensive, stable optimizations (PGO, etc). + Disabled by default. --enable-loadable-sqlite-extensions support loadable extensions in _sqlite module --enable-ipv6 Enable ipv6 (with ipv4) support @@ -17983,7 +17971,7 @@ mv config.c Modules if test "$Py_OPT" = 'false' -a "$Py_DEBUG" != 'true'; then echo "" >&6 echo "" >&6 - echo "If you want a release build with all optimizations active (LTO, PGO, etc)," >&6 + echo "If you want a release build with all stable optimizations active (PGO, etc)," >&6 echo "please run ./configure --enable-optimizations" >&6 echo "" >&6 echo "" >&6 diff --git a/configure.ac b/configure.ac index 146ae22a632a59..962006704f9cbc 100644 --- a/configure.ac +++ b/configure.ac @@ -1284,7 +1284,7 @@ AC_SUBST(DEF_MAKE_ALL_RULE) AC_SUBST(DEF_MAKE_RULE) Py_OPT='false' AC_MSG_CHECKING(for --enable-optimizations) -AC_ARG_ENABLE(optimizations, AS_HELP_STRING([--enable-optimizations], [Enable expensive optimizations (PGO, etc). Disabled by default.]), +AC_ARG_ENABLE(optimizations, AS_HELP_STRING([--enable-optimizations], [Enable expensive, stable optimizations (PGO, etc). Disabled by default.]), [ if test "$enableval" != no then @@ -5452,7 +5452,7 @@ mv config.c Modules if test "$Py_OPT" = 'false' -a "$Py_DEBUG" != 'true'; then echo "" >&AS_MESSAGE_FD echo "" >&AS_MESSAGE_FD - echo "If you want a release build with all optimizations active (LTO, PGO, etc)," >&AS_MESSAGE_FD + echo "If you want a release build with all stable optimizations active (PGO, etc)," >&AS_MESSAGE_FD echo "please run ./configure --enable-optimizations" >&AS_MESSAGE_FD echo "" >&AS_MESSAGE_FD echo "" >&AS_MESSAGE_FD From 7a16a4535d691eff79fcc65ae57e69741e6c83df Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Fri, 9 Jun 2017 18:33:31 -0400 Subject: [PATCH 0385/2287] Closing transport during handshake process leaks socket (#480) (#2044) --- Lib/asyncio/sslproto.py | 7 +++++-- Lib/test/test_asyncio/test_sslproto.py | 15 +++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index ab7ff0bf93d076..6e9ce2968a0826 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -551,8 +551,11 @@ def _get_extra_info(self, name, default=None): def _start_shutdown(self): if self._in_shutdown: return - self._in_shutdown = True - self._write_appdata(b'') + if self._in_handshake: + self._abort() + else: + self._in_shutdown = True + self._write_appdata(b'') def _write_appdata(self, data): self._write_backlog.append((data, 0)) diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index f1771c5561afea..bcd236ea2632ed 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -42,6 +42,7 @@ def mock_handshake(callback): sslpipe.do_handshake.side_effect = mock_handshake with mock.patch('asyncio.sslproto._SSLPipe', return_value=sslpipe): ssl_proto.connection_made(transport) + return transport def test_cancel_handshake(self): # Python issue #23197: cancelling a handshake must not raise an @@ -95,6 +96,20 @@ def test_connection_lost(self): test_utils.run_briefly(self.loop) self.assertIsInstance(waiter.exception(), ConnectionAbortedError) + def test_close_during_handshake(self): + # bpo-29743 Closing transport during handshake process leaks socket + waiter = asyncio.Future(loop=self.loop) + ssl_proto = self.ssl_protocol(waiter) + + def do_handshake(callback): + return [] + + transport = self.connection_made(ssl_proto) + test_utils.run_briefly(self.loop) + + ssl_proto._app_transport.close() + self.assertTrue(transport.abort.called) + def test_get_extra_info_on_closed_connection(self): waiter = asyncio.Future(loop=self.loop) ssl_proto = self.ssl_protocol(waiter) diff --git a/Misc/NEWS b/Misc/NEWS index 0342c71cd65a13..7bd46d5578750e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,9 @@ Core and Builtins Library ------- +- bpo-29743: Closing transport during handshake process leaks open socket. + Patch by Nikolay Kim + - bpo-27585: Fix waiter cancellation in asyncio.Lock. Patch by Mathieu Sornay. From fe9c7a0fd3412efb7598b395e70a5a85219e2e6b Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Fri, 9 Jun 2017 19:14:35 -0400 Subject: [PATCH 0386/2287] Break circular references when closing SSLTransport objects (#981) (#2049) --- Lib/asyncio/sslproto.py | 10 ++++++---- Misc/NEWS | 3 +++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index 6e9ce2968a0826..7948c4c3b4efe6 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -686,12 +686,14 @@ def _fatal_error(self, exc, message='Fatal error on transport'): self._transport._force_close(exc) def _finalize(self): + self._sslpipe = None + if self._transport is not None: self._transport.close() def _abort(self): - if self._transport is not None: - try: + try: + if self._transport is not None: self._transport.abort() - finally: - self._finalize() + finally: + self._finalize() diff --git a/Misc/NEWS b/Misc/NEWS index 7bd46d5578750e..213a6e9c2f6442 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,9 @@ Core and Builtins Library ------- +- bpo-29870: Fix ssl sockets leaks when connection is aborted in asyncio/ssl + implementation. Patch by Michaël Sghaïer. + - bpo-29743: Closing transport during handshake process leaks open socket. Patch by Nikolay Kim From fe796efa66ff6d45bb9f3e94790b72b4486d803e Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 9 Jun 2017 17:02:04 -0700 Subject: [PATCH 0387/2287] [3.6] Make codecov config on master the only config used (GH-2041) (GH-2052) This will allow for centralized management of the Codecov config to prevent skew as well as easier management going forward. Closes python/core-workflowGH-81. (cherry picked from commit 11ffb4543bc000dea527bcc0417e2f8bda13790f) --- .github/codecov.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/codecov.yml b/.github/codecov.yml index fcf9df6a7a698e..dc21321d0baaf0 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -1,4 +1,5 @@ codecov: + strict_yaml_branch: master notify: require_ci_to_pass: true comment: off From 10c9a09ef4810f0235f5f585dcce70eca049604a Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 9 Jun 2017 18:33:31 -0700 Subject: [PATCH 0388/2287] [3.6] bpo-30335: Add deprecation alias entry for assertNotRegexpMatches (GH-1536) (GH-2055) Document that assertNotRegexpMatches is a deprecated alias for assertNotRegex. (cherry picked from commit 74921ed8941fce14c2a53dc7280f43eb01fe4ed8) --- Doc/library/unittest.rst | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 92e567d12824fa..2099bd1e2e979c 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -1170,6 +1170,9 @@ Test cases :meth:`.assertRegex`. .. versionadded:: 3.2 :meth:`.assertNotRegex`. + .. versionadded:: 3.5 + The name ``assertNotRegexpMatches`` is a deprecated alias + for :meth:`.assertNotRegex`. .. method:: assertCountEqual(first, second, msg=None) @@ -1435,9 +1438,9 @@ For historical reasons, some of the :class:`TestCase` methods had one or more aliases that are now deprecated. The following table lists the correct names along with their deprecated aliases: - ============================== ====================== ====================== + ============================== ====================== ======================= Method Name Deprecated alias Deprecated alias - ============================== ====================== ====================== + ============================== ====================== ======================= :meth:`.assertEqual` failUnlessEqual assertEquals :meth:`.assertNotEqual` failIfEqual assertNotEquals :meth:`.assertTrue` failUnless assert\_ @@ -1446,8 +1449,9 @@ along with their deprecated aliases: :meth:`.assertAlmostEqual` failUnlessAlmostEqual assertAlmostEquals :meth:`.assertNotAlmostEqual` failIfAlmostEqual assertNotAlmostEquals :meth:`.assertRegex` assertRegexpMatches + :meth:`.assertNotRegex` assertNotRegexpMatches :meth:`.assertRaisesRegex` assertRaisesRegexp - ============================== ====================== ====================== + ============================== ====================== ======================= .. deprecated:: 3.1 the fail* aliases listed in the second column. @@ -1455,8 +1459,9 @@ along with their deprecated aliases: the assert* aliases listed in the third column. .. deprecated:: 3.2 ``assertRegexpMatches`` and ``assertRaisesRegexp`` have been renamed to - :meth:`.assertRegex` and :meth:`.assertRaisesRegex` - + :meth:`.assertRegex` and :meth:`.assertRaisesRegex`. + .. deprecated:: 3.5 + the ``assertNotRegexpMatches`` name in favor of :meth:`.assertNotRegex`. .. _testsuite-objects: From e380c19b7e88d97d3497016f1065d6922415db1c Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Fri, 9 Jun 2017 22:26:31 -0500 Subject: [PATCH 0389/2287] [3.6] bpo-30417: Disable `cpu` resource on AppVeyor (GH-1951) (cherry picked from commit 42e3acda86829def9adc354fbee77597b849bf9e) --- .github/appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/appveyor.yml b/.github/appveyor.yml index d8bfb9adf9378d..04566eafe58bfd 100644 --- a/.github/appveyor.yml +++ b/.github/appveyor.yml @@ -8,7 +8,7 @@ branches: build_script: - cmd: PCbuild\build.bat -e test_script: -- cmd: PCbuild\rt.bat -q -uall -rwW --slowest --timeout=1200 -j0 +- cmd: PCbuild\rt.bat -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0 # Only trigger AppVeyor if actual code or its configuration changes only_commits: From 753422f6e32e13d96319b090788f0474f1e21fc4 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 9 Jun 2017 20:36:28 -0700 Subject: [PATCH 0390/2287] bpo-30266: support "= None" pattern in AbstractContextManager (GH-1448) (GH-2054) contextlib.AbstractContextManager now supports anti-registration by setting __enter__ = None or __exit__ = None, following the pattern introduced in bpo-25958.. (cherry picked from commit 57161aac5eb9bcb0b43e551a1937ff0a84c1ec52) --- Lib/contextlib.py | 5 ++--- Lib/test/test_contextlib.py | 10 ++++++++++ Misc/NEWS | 4 ++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Lib/contextlib.py b/Lib/contextlib.py index 5e47054954ba5a..6fcba9c7d28083 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -1,6 +1,7 @@ """Utilities for with-statement contexts. See PEP 343.""" import abc import sys +import _collections_abc from collections import deque from functools import wraps @@ -25,9 +26,7 @@ def __exit__(self, exc_type, exc_value, traceback): @classmethod def __subclasshook__(cls, C): if cls is AbstractContextManager: - if (any("__enter__" in B.__dict__ for B in C.__mro__) and - any("__exit__" in B.__dict__ for B in C.__mro__)): - return True + return _collections_abc._check_methods(C, "__enter__", "__exit__") return NotImplemented diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py index b1a467d952da0f..2301f759d80858 100644 --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -44,6 +44,16 @@ def __exit__(self, *args): self.assertTrue(issubclass(DefaultEnter, AbstractContextManager)) + class NoEnter(ManagerFromScratch): + __enter__ = None + + self.assertFalse(issubclass(NoEnter, AbstractContextManager)) + + class NoExit(ManagerFromScratch): + __exit__ = None + + self.assertFalse(issubclass(NoExit, AbstractContextManager)) + class ContextManagerTestCase(unittest.TestCase): diff --git a/Misc/NEWS b/Misc/NEWS index 213a6e9c2f6442..e6517695a62c20 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -96,6 +96,10 @@ Library - bpo-30048: Fixed ``Task.cancel()`` can be ignored when the task is running coroutine and the coroutine returned without any more ``await``. +- bpo-30266: contextlib.AbstractContextManager now supports anti-registration + by setting __enter__ = None or __exit__ = None, following the pattern + introduced in bpo-25958. Patch by Jelle Zijlstra. + - bpo-30298: Weaken the condition of deprecation warnings for inline modifiers. Now allowed several subsequential inline modifiers at the start of the pattern (e.g. ``'(?i)(?s)...'``). In verbose mode whitespaces and comments From 361362f3a0d6ebb458a8d826a698463085c5a8f7 Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Sat, 10 Jun 2017 00:15:28 -0400 Subject: [PATCH 0391/2287] [3.6] Fix TypeError is asyncio/proactor_events (GH-993) (#2061) (cherry picked from commit 34792d25ab7329241ea24595286d65d54c266274) --- Lib/asyncio/proactor_events.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index ff12877fae2f23..a81645d9c5d859 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -232,8 +232,9 @@ class _ProactorBaseWritePipeTransport(_ProactorBasePipeTransport, def write(self, data): if not isinstance(data, (bytes, bytearray, memoryview)): - raise TypeError('data argument must be byte-ish (%r)', - type(data)) + msg = ("data argument must be a bytes-like object, not '%s'" % + type(data).__name__) + raise TypeError(msg) if self._eof_written: raise RuntimeError('write_eof() already called') From 12cbd87ac0bb826d653040044c6b526dcdb6f6d1 Mon Sep 17 00:00:00 2001 From: terryjreedy Date: Sat, 10 Jun 2017 02:53:19 -0400 Subject: [PATCH 0392/2287] [3.6] bpo-30290: IDLE - pep8 names and tests for help-about (#2070) (cherry picked from commit 054e09147aaa6f61aca6cd40c7bf7ce6dc54a04b) * bpo-30290: IDLE: Refactor help_about to PEP8 names (#1714) Patch by Cheryl Sabella. (cherry picked from commit 5a346d5dbc1f0f70eca706a8ba19f7645bf17837) * IDLE test_help_about: edit and add test. (#1838) Coverage is now 100% (cherry picked from commit eca7da0f13c78013b924fe7306f3e2e59c0af40b) --- Lib/idlelib/help_about.py | 210 +++++++++++++---------- Lib/idlelib/idle_test/test_help_about.py | 111 ++++++++++-- 2 files changed, 222 insertions(+), 99 deletions(-) diff --git a/Lib/idlelib/help_about.py b/Lib/idlelib/help_about.py index 071bd3ec0f219c..f0a40e927c3634 100644 --- a/Lib/idlelib/help_about.py +++ b/Lib/idlelib/help_about.py @@ -4,7 +4,8 @@ import os from sys import version -from tkinter import * +from tkinter import Toplevel, Frame, Label, Button +from tkinter import SUNKEN, TOP, BOTTOM, LEFT, X, BOTH, W, EW, NSEW from idlelib import textview @@ -13,9 +14,13 @@ class AboutDialog(Toplevel): """Modal about dialog for idle """ - def __init__(self, parent, title, _htest=False): - """ + def __init__(self, parent, title, _htest=False, _utest=False): + """Create popup, do not return until tk widget destroyed. + + parent - parent of this dialog + title - string which is title of popup dialog _htest - bool, change box location when running htest + _utest - bool, don't wait_window when running unittest """ Toplevel.__init__(self, parent) self.configure(borderwidth=5) @@ -25,125 +30,152 @@ def __init__(self, parent, title, _htest=False): parent.winfo_rooty()+(30 if not _htest else 100))) self.bg = "#707070" self.fg = "#ffffff" - self.CreateWidgets() - self.resizable(height=FALSE, width=FALSE) + self.create_widgets() + self.resizable(height=False, width=False) self.title(title) self.transient(parent) self.grab_set() - self.protocol("WM_DELETE_WINDOW", self.Ok) + self.protocol("WM_DELETE_WINDOW", self.ok) self.parent = parent - self.buttonOk.focus_set() - self.bind('',self.Ok) #dismiss dialog - self.bind('',self.Ok) #dismiss dialog - self.wait_window() + self.button_ok.focus_set() + self.bind('', self.ok) # dismiss dialog + self.bind('', self.ok) # dismiss dialog + self._current_textview = None + self._utest = _utest - def CreateWidgets(self): + if not _utest: + self.deiconify() + self.wait_window() + + def create_widgets(self): release = version[:version.index(' ')] - frameMain = Frame(self, borderwidth=2, relief=SUNKEN) - frameButtons = Frame(self) - frameButtons.pack(side=BOTTOM, fill=X) - frameMain.pack(side=TOP, expand=TRUE, fill=BOTH) - self.buttonOk = Button(frameButtons, text='Close', - command=self.Ok) - self.buttonOk.pack(padx=5, pady=5) - #self.picture = Image('photo', data=self.pictureData) - frameBg = Frame(frameMain, bg=self.bg) - frameBg.pack(expand=TRUE, fill=BOTH) - labelTitle = Label(frameBg, text='IDLE', fg=self.fg, bg=self.bg, - font=('courier', 24, 'bold')) - labelTitle.grid(row=0, column=0, sticky=W, padx=10, pady=10) - #labelPicture = Label(frameBg, text='[picture]') - #image=self.picture, bg=self.bg) - #labelPicture.grid(row=1, column=1, sticky=W, rowspan=2, - # padx=0, pady=3) - byline = "Python's Integrated DeveLopment Environment" + 5*'\n' - labelDesc = Label(frameBg, text=byline, justify=LEFT, - fg=self.fg, bg=self.bg) - labelDesc.grid(row=2, column=0, sticky=W, columnspan=3, padx=10, pady=5) - labelEmail = Label(frameBg, text='email: idle-dev@python.org', - justify=LEFT, fg=self.fg, bg=self.bg) - labelEmail.grid(row=6, column=0, columnspan=2, - sticky=W, padx=10, pady=0) - labelWWW = Label(frameBg, text='https://docs.python.org/' + - version[:3] + '/library/idle.html', - justify=LEFT, fg=self.fg, bg=self.bg) - labelWWW.grid(row=7, column=0, columnspan=2, sticky=W, padx=10, pady=0) - Frame(frameBg, borderwidth=1, relief=SUNKEN, + frame = Frame(self, borderwidth=2, relief=SUNKEN) + frame_buttons = Frame(self) + frame_buttons.pack(side=BOTTOM, fill=X) + frame.pack(side=TOP, expand=True, fill=BOTH) + self.button_ok = Button(frame_buttons, text='Close', + command=self.ok) + self.button_ok.pack(padx=5, pady=5) + + frame_background = Frame(frame, bg=self.bg) + frame_background.pack(expand=True, fill=BOTH) + + header = Label(frame_background, text='IDLE', fg=self.fg, + bg=self.bg, font=('courier', 24, 'bold')) + header.grid(row=0, column=0, sticky=W, padx=10, pady=10) + byline_text = "Python's Integrated DeveLopment Environment" + 5*'\n' + byline = Label(frame_background, text=byline_text, justify=LEFT, + fg=self.fg, bg=self.bg) + byline.grid(row=2, column=0, sticky=W, columnspan=3, padx=10, pady=5) + email = Label(frame_background, text='email: idle-dev@python.org', + justify=LEFT, fg=self.fg, bg=self.bg) + email.grid(row=6, column=0, columnspan=2, sticky=W, padx=10, pady=0) + docs = Label(frame_background, text='https://docs.python.org/' + + version[:3] + '/library/idle.html', + justify=LEFT, fg=self.fg, bg=self.bg) + docs.grid(row=7, column=0, columnspan=2, sticky=W, padx=10, pady=0) + + Frame(frame_background, borderwidth=1, relief=SUNKEN, height=2, bg=self.bg).grid(row=8, column=0, sticky=EW, columnspan=3, padx=5, pady=5) - labelPythonVer = Label(frameBg, text='Python version: ' + - release, fg=self.fg, bg=self.bg) - labelPythonVer.grid(row=9, column=0, sticky=W, padx=10, pady=0) - tkVer = self.tk.call('info', 'patchlevel') - labelTkVer = Label(frameBg, text='Tk version: '+ - tkVer, fg=self.fg, bg=self.bg) - labelTkVer.grid(row=9, column=1, sticky=W, padx=2, pady=0) - py_button_f = Frame(frameBg, bg=self.bg) - py_button_f.grid(row=10, column=0, columnspan=2, sticky=NSEW) - buttonLicense = Button(py_button_f, text='License', width=8, - highlightbackground=self.bg, - command=self.ShowLicense) - buttonLicense.pack(side=LEFT, padx=10, pady=10) - buttonCopyright = Button(py_button_f, text='Copyright', width=8, + + pyver = Label(frame_background, text='Python version: ' + release, + fg=self.fg, bg=self.bg) + pyver.grid(row=9, column=0, sticky=W, padx=10, pady=0) + tk_patchlevel = self.tk.call('info', 'patchlevel') + tkver = Label(frame_background, text='Tk version: ' + tk_patchlevel, + fg=self.fg, bg=self.bg) + tkver.grid(row=9, column=1, sticky=W, padx=2, pady=0) + py_buttons = Frame(frame_background, bg=self.bg) + py_buttons.grid(row=10, column=0, columnspan=2, sticky=NSEW) + self.py_license = Button(py_buttons, text='License', width=8, + highlightbackground=self.bg, + command=self.show_py_license) + self.py_license.pack(side=LEFT, padx=10, pady=10) + self.py_copyright = Button(py_buttons, text='Copyright', width=8, + highlightbackground=self.bg, + command=self.show_py_copyright) + self.py_copyright.pack(side=LEFT, padx=10, pady=10) + self.py_credits = Button(py_buttons, text='Credits', width=8, highlightbackground=self.bg, - command=self.ShowCopyright) - buttonCopyright.pack(side=LEFT, padx=10, pady=10) - buttonCredits = Button(py_button_f, text='Credits', width=8, - highlightbackground=self.bg, - command=self.ShowPythonCredits) - buttonCredits.pack(side=LEFT, padx=10, pady=10) - Frame(frameBg, borderwidth=1, relief=SUNKEN, + command=self.show_py_credits) + self.py_credits.pack(side=LEFT, padx=10, pady=10) + + Frame(frame_background, borderwidth=1, relief=SUNKEN, height=2, bg=self.bg).grid(row=11, column=0, sticky=EW, columnspan=3, padx=5, pady=5) - idle_v = Label(frameBg, text='IDLE version: ' + release, - fg=self.fg, bg=self.bg) - idle_v.grid(row=12, column=0, sticky=W, padx=10, pady=0) - idle_button_f = Frame(frameBg, bg=self.bg) - idle_button_f.grid(row=13, column=0, columnspan=3, sticky=NSEW) - idle_about_b = Button(idle_button_f, text='README', width=8, - highlightbackground=self.bg, - command=self.ShowIDLEAbout) - idle_about_b.pack(side=LEFT, padx=10, pady=10) - idle_news_b = Button(idle_button_f, text='NEWS', width=8, - highlightbackground=self.bg, - command=self.ShowIDLENEWS) - idle_news_b.pack(side=LEFT, padx=10, pady=10) - idle_credits_b = Button(idle_button_f, text='Credits', width=8, - highlightbackground=self.bg, - command=self.ShowIDLECredits) - idle_credits_b.pack(side=LEFT, padx=10, pady=10) - # License, et all, are of type _sitebuiltins._Printer - def ShowLicense(self): + idlever = Label(frame_background, text='IDLE version: ' + release, + fg=self.fg, bg=self.bg) + idlever.grid(row=12, column=0, sticky=W, padx=10, pady=0) + idle_buttons = Frame(frame_background, bg=self.bg) + idle_buttons.grid(row=13, column=0, columnspan=3, sticky=NSEW) + self.readme = Button(idle_buttons, text='README', width=8, + highlightbackground=self.bg, + command=self.show_readme) + self.readme.pack(side=LEFT, padx=10, pady=10) + self.idle_news = Button(idle_buttons, text='NEWS', width=8, + highlightbackground=self.bg, + command=self.show_idle_news) + self.idle_news.pack(side=LEFT, padx=10, pady=10) + self.idle_credits = Button(idle_buttons, text='Credits', width=8, + highlightbackground=self.bg, + command=self.show_idle_credits) + self.idle_credits.pack(side=LEFT, padx=10, pady=10) + + # License, copyright, and credits are of type _sitebuiltins._Printer + def show_py_license(self): + "Handle License button event." self.display_printer_text('About - License', license) - def ShowCopyright(self): + def show_py_copyright(self): + "Handle Copyright button event." self.display_printer_text('About - Copyright', copyright) - def ShowPythonCredits(self): + def show_py_credits(self): + "Handle Python Credits button event." self.display_printer_text('About - Python Credits', credits) # Encode CREDITS.txt to utf-8 for proper version of Loewis. # Specify others as ascii until need utf-8, so catch errors. - def ShowIDLECredits(self): + def show_idle_credits(self): + "Handle Idle Credits button event." self.display_file_text('About - Credits', 'CREDITS.txt', 'utf-8') - def ShowIDLEAbout(self): + def show_readme(self): + "Handle Readme button event." self.display_file_text('About - Readme', 'README.txt', 'ascii') - def ShowIDLENEWS(self): + def show_idle_news(self): + "Handle News button event." self.display_file_text('About - NEWS', 'NEWS.txt', 'utf-8') def display_printer_text(self, title, printer): + """Create textview for built-in constants. + + Built-in constants have type _sitebuiltins._Printer. The + text is extracted from the built-in and then sent to a text + viewer with self as the parent and title as the title of + the popup. + """ printer._Printer__setup() text = '\n'.join(printer._Printer__lines) - textview.view_text(self, title, text) + self._current_textview = textview.view_text( + self, title, text, _utest=self._utest) def display_file_text(self, title, filename, encoding=None): + """Create textview for filename. + + The filename needs to be in the current directory. The path + is sent to a text viewer with self as the parent, title as + the title of the popup, and the file encoding. + """ fn = os.path.join(os.path.abspath(os.path.dirname(__file__)), filename) - textview.view_file(self, title, fn, encoding) + self._current_textview = textview.view_file( + self, title, fn, encoding, _utest=self._utest) - def Ok(self, event=None): + def ok(self, event=None): + "Dismiss help_about dialog." self.destroy() diff --git a/Lib/idlelib/idle_test/test_help_about.py b/Lib/idlelib/idle_test/test_help_about.py index 843efb9ad2458c..b98405df52a0c7 100644 --- a/Lib/idlelib/idle_test/test_help_about.py +++ b/Lib/idlelib/idle_test/test_help_about.py @@ -1,24 +1,116 @@ '''Test idlelib.help_about. -Coverage: +Coverage: 100% ''' -from idlelib import help_about -from idlelib import textview +from test.support import requires, findfile +from tkinter import Tk, TclError +import unittest from idlelib.idle_test.mock_idle import Func from idlelib.idle_test.mock_tk import Mbox_func -import unittest +from idlelib.help_about import AboutDialog as About +from idlelib import textview + +class LiveDialogTest(unittest.TestCase): + """Simulate user clicking buttons other than [Close]. + + Test that invoked textview has text from source. + """ + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = Tk() + cls.root.withdraw() + cls.dialog = About(cls.root, 'About IDLE', _utest=True) + + @classmethod + def tearDownClass(cls): + del cls.dialog + cls.root.update_idletasks() + cls.root.destroy() + del cls.root + + def test_dialog_title(self): + """Test about dialog title""" + self.assertEqual(self.dialog.title(), 'About IDLE') + + def test_printer_buttons(self): + """Test buttons whose commands use printer function.""" + dialog = self.dialog + button_sources = [(self.dialog.py_license, license), + (self.dialog.py_copyright, copyright), + (self.dialog.py_credits, credits)] + + for button, printer in button_sources: + printer._Printer__setup() + button.invoke() + self.assertEqual( + printer._Printer__lines[0], + dialog._current_textview.textView.get('1.0', '1.end')) + self.assertEqual( + printer._Printer__lines[1], + dialog._current_textview.textView.get('2.0', '2.end')) + dialog._current_textview.destroy() + + def test_file_buttons(self): + """Test buttons that display files.""" + dialog = self.dialog + button_sources = [(self.dialog.readme, 'README.txt'), + (self.dialog.idle_news, 'NEWS.txt'), + (self.dialog.idle_credits, 'CREDITS.txt')] + + for button, filename in button_sources: + button.invoke() + fn = findfile(filename, subdir='idlelib') + with open(fn) as f: + self.assertEqual( + f.readline().strip(), + dialog._current_textview.textView.get('1.0', '1.end')) + f.readline() + self.assertEqual(f.readline().strip(), + dialog._current_textview.textView.get('3.0', '3.end')) + dialog._current_textview.destroy() + + +class CloseTest(unittest.TestCase): + """Simulate user clicking [Close] button""" + + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = Tk() + cls.root.withdraw() + cls.dialog = About(cls.root, 'About IDLE', _utest=True) + + @classmethod + def tearDownClass(cls): + del cls.dialog + cls.root.update_idletasks() + cls.root.destroy() + del cls.root + + def test_close(self): + self.assertEqual(self.dialog.winfo_class(), 'Toplevel') + self.dialog.button_ok.invoke() + with self.assertRaises(TclError): + self.dialog.winfo_class() + -About = help_about.AboutDialog class Dummy_about_dialog(): # Dummy class for testing file display functions. - idle_credits = About.ShowIDLECredits - idle_readme = About.ShowIDLEAbout - idle_news = About.ShowIDLENEWS + idle_credits = About.show_idle_credits + idle_readme = About.show_readme + idle_news = About.show_idle_news # Called by the above display_file_text = About.display_file_text + _utest = True class DisplayFileTest(unittest.TestCase): + """Test functions that display files. + + While somewhat redundant with gui-based test_file_dialog, + these unit tests run on all buildbots, not just a few. + """ dialog = Dummy_about_dialog() @classmethod @@ -29,14 +121,13 @@ def setUpClass(cls): cls.view = Func() textview.showerror = cls.error textview.view_text = cls.view - cls.About = Dummy_about_dialog() @classmethod def tearDownClass(cls): textview.showerror = cls.orig_error textview.view_text = cls.orig_view - def test_file_isplay(self): + def test_file_display(self): for handler in (self.dialog.idle_credits, self.dialog.idle_readme, self.dialog.idle_news): From 0b7629cd846e3e160ac07cafc4e97644024f11b8 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 10 Jun 2017 11:20:03 +0200 Subject: [PATCH 0393/2287] bpo-30038: fix race condition in signal delivery + wakeup fd (#1082) (#2075) Before, it was possible to get the following sequence of events (especially on Windows, where the C-level signal handler for SIGINT is run in a separate thread): - SIGINT arrives - trip_signal is called - trip_signal writes to the wakeup fd - the main thread wakes up from select()-or-equivalent - the main thread checks for pending signals, but doesn't see any - the main thread drains the wakeup fd - the main thread goes back to sleep - trip_signal sets is_tripped=1 and calls Py_AddPendingCall to notify the main thread the it should run the Python-level signal handler - the main thread doesn't notice because it's asleep This has been causing repeated failures in the Trio test suite: https://github.com/python-trio/trio/issues/119 (cherry picked from commit 4ae01496971624c75080431806ed1c08e00f22c7) --- Modules/signalmodule.c | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index e27075b2001946..ed2f4e8cf0a2dc 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -244,6 +244,32 @@ trip_signal(int sig_num) Handlers[sig_num].tripped = 1; + if (!is_tripped) { + /* Set is_tripped after setting .tripped, as it gets + cleared in PyErr_CheckSignals() before .tripped. */ + is_tripped = 1; + Py_AddPendingCall(checksignals_witharg, NULL); + } + + /* And then write to the wakeup fd *after* setting all the globals and + doing the Py_AddPendingCall. We used to write to the wakeup fd and then + set the flag, but this allowed the following sequence of events + (especially on windows, where trip_signal runs in a new thread): + + - main thread blocks on select([wakeup_fd], ...) + - signal arrives + - trip_signal writes to the wakeup fd + - the main thread wakes up + - the main thread checks the signal flags, sees that they're unset + - the main thread empties the wakeup fd + - the main thread goes back to sleep + - trip_signal sets the flags to request the Python-level signal handler + be run + - the main thread doesn't notice, because it's asleep + + See bpo-30038 for more details. + */ + #ifdef MS_WINDOWS fd = Py_SAFE_DOWNCAST(wakeup.fd, SOCKET_T, int); #else @@ -281,13 +307,6 @@ trip_signal(int sig_num) } } } - - if (!is_tripped) { - /* Set is_tripped after setting .tripped, as it gets - cleared in PyErr_CheckSignals() before .tripped. */ - is_tripped = 1; - Py_AddPendingCall(checksignals_witharg, NULL); - } } static void From 911068e250ee2b0847ca78d9ff527e0d6bf94551 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 10 Jun 2017 13:48:53 +0300 Subject: [PATCH 0394/2287] [3.6] Regenerate Argument Clinic code for bpo-19180. (GH-2073). (#2077) (cherry picked from commit 5f31d5cf6efa8c304d352e34f9f2a1ed0074298e) --- Modules/_ssl.c | 2 +- Modules/clinic/_ssl.c.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/_ssl.c b/Modules/_ssl.c index a421fc0d2d6ff2..0fffaaceb26419 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -4480,7 +4480,7 @@ string. See RFC 4086. static PyObject * _ssl_RAND_add_impl(PyObject *module, Py_buffer *view, double entropy) -/*[clinic end generated code: output=e6dd48df9c9024e9 input=580c85e6a3a4fe29]*/ +/*[clinic end generated code: output=e6dd48df9c9024e9 input=5c33017422828f5c]*/ { const char *buf; Py_ssize_t len, written; diff --git a/Modules/clinic/_ssl.c.h b/Modules/clinic/_ssl.c.h index 333aad76b404fc..75f8f5a60bb088 100644 --- a/Modules/clinic/_ssl.c.h +++ b/Modules/clinic/_ssl.c.h @@ -1168,4 +1168,4 @@ _ssl_enum_crls(PyObject *module, PyObject **args, Py_ssize_t nargs, PyObject *kw #ifndef _SSL_ENUM_CRLS_METHODDEF #define _SSL_ENUM_CRLS_METHODDEF #endif /* !defined(_SSL_ENUM_CRLS_METHODDEF) */ -/*[clinic end generated code: output=a859b21fe68a6115 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=56cead8610faa505 input=a9049054013a1b77]*/ From 6e14fd2a14cef6ea0709ad234ab41198c2195591 Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Sat, 10 Jun 2017 10:00:45 -0400 Subject: [PATCH 0395/2287] [3.6] bpo-29406: asyncio SSL contexts leak sockets after calling close with certain servers (GH-409) (#2062) * bpo-29406: asyncio SSL contexts leak sockets after calling close with certain servers (#409) (cherry picked from commit a608d2d5a7f1aabe9bcbfc220135c5e126189390) * [3.6] bpo-29406: asyncio SSL contexts leak sockets after calling close with certain servers (GH-409) * asyncio SSL contexts leak sockets after calling close with certain servers * cleanup _shutdown_timeout_handle on _fatal_error. (cherry picked from commit a608d2d5a7f1aabe9bcbfc220135c5e126189390) --- Lib/asyncio/sslproto.py | 24 +++++++++++++++++- Lib/test/test_asyncio/test_sslproto.py | 34 ++++++++++++++++++++++++++ Misc/NEWS | 4 +++ 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index 7948c4c3b4efe6..3b1eb993dfc7a8 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -7,6 +7,7 @@ from . import base_events from . import compat +from . import futures from . import protocols from . import transports from .log import logger @@ -412,7 +413,7 @@ class SSLProtocol(protocols.Protocol): def __init__(self, loop, app_protocol, sslcontext, waiter, server_side=False, server_hostname=None, - call_connection_made=True): + call_connection_made=True, shutdown_timeout=5.0): if ssl is None: raise RuntimeError('stdlib ssl module not available') @@ -443,6 +444,8 @@ def __init__(self, loop, app_protocol, sslcontext, waiter, self._session_established = False self._in_handshake = False self._in_shutdown = False + self._shutdown_timeout = shutdown_timeout + self._shutdown_timeout_handle = None # transport, ex: SelectorSocketTransport self._transport = None self._call_connection_made = call_connection_made @@ -557,6 +560,15 @@ def _start_shutdown(self): self._in_shutdown = True self._write_appdata(b'') + if self._shutdown_timeout is not None: + self._shutdown_timeout_handle = self._loop.call_later( + self._shutdown_timeout, self._on_shutdown_timeout) + + def _on_shutdown_timeout(self): + if self._transport is not None: + self._fatal_error( + futures.TimeoutError(), 'Can not complete shitdown operation') + def _write_appdata(self, data): self._write_backlog.append((data, 0)) self._write_buffer_size += len(data) @@ -684,12 +696,22 @@ def _fatal_error(self, exc, message='Fatal error on transport'): }) if self._transport: self._transport._force_close(exc) + self._transport = None + + if self._shutdown_timeout_handle is not None: + self._shutdown_timeout_handle.cancel() + self._shutdown_timeout_handle = None def _finalize(self): self._sslpipe = None if self._transport is not None: self._transport.close() + self._transport = None + + if self._shutdown_timeout_handle is not None: + self._shutdown_timeout_handle.cancel() + self._shutdown_timeout_handle = None def _abort(self): try: diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index bcd236ea2632ed..6bcaa9edb4306d 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -96,6 +96,40 @@ def test_connection_lost(self): test_utils.run_briefly(self.loop) self.assertIsInstance(waiter.exception(), ConnectionAbortedError) + def test_close_abort(self): + # From issue #bpo-29406 + # abort connection if server does not complete shutdown procedure + ssl_proto = self.ssl_protocol() + transport = self.connection_made(ssl_proto) + ssl_proto._on_handshake_complete(None) + ssl_proto._start_shutdown() + self.assertIsNotNone(ssl_proto._shutdown_timeout_handle) + + exc_handler = mock.Mock() + self.loop.set_exception_handler(exc_handler) + ssl_proto._shutdown_timeout_handle._run() + + exc_handler.assert_called_with( + self.loop, {'message': 'Can not complete shitdown operation', + 'exception': mock.ANY, + 'transport': transport, + 'protocol': ssl_proto} + ) + self.assertIsNone(ssl_proto._shutdown_timeout_handle) + + def test_close(self): + # From issue #bpo-29406 + # abort connection if server does not complete shutdown procedure + ssl_proto = self.ssl_protocol() + transport = self.connection_made(ssl_proto) + ssl_proto._on_handshake_complete(None) + ssl_proto._start_shutdown() + self.assertIsNotNone(ssl_proto._shutdown_timeout_handle) + + ssl_proto._finalize() + self.assertIsNone(ssl_proto._transport) + self.assertIsNone(ssl_proto._shutdown_timeout_handle) + def test_close_during_handshake(self): # bpo-29743 Closing transport during handshake process leaks socket waiter = asyncio.Future(loop=self.loop) diff --git a/Misc/NEWS b/Misc/NEWS index e6517695a62c20..9d4f5d432a1ec4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,10 @@ Core and Builtins Library ------- +- bpo-29406: asyncio SSL contexts leak sockets after calling close with + certain servers. + Patch by Nikolay Kim + - bpo-29870: Fix ssl sockets leaks when connection is aborted in asyncio/ssl implementation. Patch by Michaël Sghaïer. From 76eabd3a21dc578de6093d45dd8d69a5ec4b9afe Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 10 Jun 2017 07:25:33 -0700 Subject: [PATCH 0396/2287] bpo-25409: Clarify fnmatch and fnmatchcase documentation (GH-1535) (GH-2065) Mention that fnmatchcase does not call normcase, and fnmatch does. (cherry picked from commit e5f6e86c48c7b2eb9e1d6a0e72867b4d8b4720f3) --- Doc/library/fnmatch.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/fnmatch.rst b/Doc/library/fnmatch.rst index c03a9d31123739..634c26e95702e9 100644 --- a/Doc/library/fnmatch.rst +++ b/Doc/library/fnmatch.rst @@ -43,9 +43,8 @@ patterns. .. function:: fnmatch(filename, pattern) Test whether the *filename* string matches the *pattern* string, returning - :const:`True` or :const:`False`. If the operating system is case-insensitive, - then both parameters will be normalized to all lower- or upper-case before - the comparison is performed. :func:`fnmatchcase` can be used to perform a + :const:`True` or :const:`False`. Both parameters are case-normalized + using :func:`os.path.normcase`. :func:`fnmatchcase` can be used to perform a case-sensitive comparison, regardless of whether that's standard for the operating system. @@ -63,7 +62,8 @@ patterns. .. function:: fnmatchcase(filename, pattern) Test whether *filename* matches *pattern*, returning :const:`True` or - :const:`False`; the comparison is case-sensitive. + :const:`False`; the comparison is case-sensitive and does not apply + :func:`os.path.normcase`. .. function:: filter(names, pattern) From 865ed9ea67cf0d8a8dead91f3eac527553d92284 Mon Sep 17 00:00:00 2001 From: KatherineMichel Date: Sat, 10 Jun 2017 15:33:57 -0500 Subject: [PATCH 0397/2287] bpo-30312: Small correction in datastructures set code sample (GH-2081) (GH-2085) (cherry picked from commit ca816153445cba3baec15f7e890c71abfe495340) --- Doc/tutorial/datastructures.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst index 1a73ac9d05936a..f9ddf06c5e0e9e 100644 --- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -466,7 +466,7 @@ Here is a brief demonstration:: {'a', 'r', 'b', 'c', 'd'} >>> a - b # letters in a but not in b {'r', 'd', 'b'} - >>> a | b # letters in either a or b + >>> a | b # letters in a or b or both {'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'} >>> a & b # letters in both a and b {'a', 'c'} From 964c261dc9a6a901f50d5596d88248bfc4251a55 Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Sat, 10 Jun 2017 15:39:29 -0500 Subject: [PATCH 0398/2287] [3.6] bpo-27425: Be more explicit in .gitattributes (GH-840) (GH-2083) Also updates checked-in line endings on some files --- .gitattributes | 45 +- Lib/venv/scripts/nt/Activate.ps1 | 102 +- Lib/venv/scripts/nt/activate.bat | 64 +- Lib/venv/scripts/nt/deactivate.bat | 42 +- Modules/_decimal/tests/runall.bat | 222 ++-- PC/bdist_wininst/build.bat | 44 +- PCbuild/build.bat | 312 +++--- PCbuild/build_env.bat | 2 +- PCbuild/clean.bat | 10 +- PCbuild/env.bat | 32 +- PCbuild/get_externals.bat | 208 ++-- PCbuild/idle.bat | 30 +- PCbuild/pcbuild.sln | 1538 ++++++++++++++-------------- PCbuild/prepare_ssl.bat | 24 +- PCbuild/readme.txt | 600 +++++------ PCbuild/rt.bat | 126 +-- Tools/buildbot/build.bat | 34 +- Tools/buildbot/buildmsi.bat | 16 +- Tools/buildbot/clean.bat | 34 +- Tools/buildbot/test.bat | 38 +- Tools/msi/build.bat | 158 +-- Tools/msi/buildrelease.bat | 470 ++++----- Tools/msi/get_externals.bat | 54 +- Tools/msi/testrelease.bat | 234 ++--- Tools/msi/uploadrelease.bat | 152 +-- Tools/nuget/build.bat | 110 +- Tools/unicode/genwincodecs.bat | 14 +- 27 files changed, 2374 insertions(+), 2341 deletions(-) diff --git a/.gitattributes b/.gitattributes index 82694d81f276b2..5eead66489830d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,8 +1,41 @@ +# Binary data types +*.aif binary +*.aifc binary +*.aiff binary +*.au binary +*.bmp binary +*.exe binary +*.icns binary +*.gif binary +*.ico binary +*.jpg binary *.pck binary -Lib/test/cjkencodings/* binary -Lib/test/decimaltestdata/*.decTest binary +*.png binary +*.psd binary +*.tar binary +*.wav binary +*.whl binary +*.zip binary + +# Specific binary files Lib/test/sndhdrdata/sndhdr.* binary -Lib/test/test_email/data/msg_26.txt binary -Lib/test/xmltestdata/* binary -Lib/venv/scripts/nt/* binary -Lib/test/coding20731.py binary + +# Text files that should not be subject to eol conversion +Lib/test/cjkencodings/* -text +Lib/test/decimaltestdata/*.decTest -text +Lib/test/test_email/data/*.txt -text +Lib/test/xmltestdata/* -text +Lib/test/coding20731.py -text + +# Special files in third party code +Modules/zlib/zlib.map -text + +# CRLF files +*.bat text eol=crlf +*.ps1 text eol=crlf +*.sln text eol=crlf +*.vcxproj* text eol=crlf +*.props text eol=crlf +*.proj text eol=crlf +PCbuild/readme.txt text eol=crlf +PC/readme.txt text eol=crlf diff --git a/Lib/venv/scripts/nt/Activate.ps1 b/Lib/venv/scripts/nt/Activate.ps1 index 85646c89a81cb3..bf60869e552e97 100644 --- a/Lib/venv/scripts/nt/Activate.ps1 +++ b/Lib/venv/scripts/nt/Activate.ps1 @@ -1,51 +1,51 @@ -function global:deactivate ([switch]$NonDestructive) { - # Revert to original values - if (Test-Path function:_OLD_VIRTUAL_PROMPT) { - copy-item function:_OLD_VIRTUAL_PROMPT function:prompt - remove-item function:_OLD_VIRTUAL_PROMPT - } - - if (Test-Path env:_OLD_VIRTUAL_PYTHONHOME) { - copy-item env:_OLD_VIRTUAL_PYTHONHOME env:PYTHONHOME - remove-item env:_OLD_VIRTUAL_PYTHONHOME - } - - if (Test-Path env:_OLD_VIRTUAL_PATH) { - copy-item env:_OLD_VIRTUAL_PATH env:PATH - remove-item env:_OLD_VIRTUAL_PATH - } - - if (Test-Path env:VIRTUAL_ENV) { - remove-item env:VIRTUAL_ENV - } - - if (!$NonDestructive) { - # Self destruct! - remove-item function:deactivate - } -} - -deactivate -nondestructive - -$env:VIRTUAL_ENV="__VENV_DIR__" - -if (! $env:VIRTUAL_ENV_DISABLE_PROMPT) { - # Set the prompt to include the env name - # Make sure _OLD_VIRTUAL_PROMPT is global - function global:_OLD_VIRTUAL_PROMPT {""} - copy-item function:prompt function:_OLD_VIRTUAL_PROMPT - function global:prompt { - Write-Host -NoNewline -ForegroundColor Green '__VENV_PROMPT__' - _OLD_VIRTUAL_PROMPT - } -} - -# Clear PYTHONHOME -if (Test-Path env:PYTHONHOME) { - copy-item env:PYTHONHOME env:_OLD_VIRTUAL_PYTHONHOME - remove-item env:PYTHONHOME -} - -# Add the venv to the PATH -copy-item env:PATH env:_OLD_VIRTUAL_PATH -$env:PATH = "$env:VIRTUAL_ENV\__VENV_BIN_NAME__;$env:PATH" +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + if (Test-Path function:_OLD_VIRTUAL_PROMPT) { + copy-item function:_OLD_VIRTUAL_PROMPT function:prompt + remove-item function:_OLD_VIRTUAL_PROMPT + } + + if (Test-Path env:_OLD_VIRTUAL_PYTHONHOME) { + copy-item env:_OLD_VIRTUAL_PYTHONHOME env:PYTHONHOME + remove-item env:_OLD_VIRTUAL_PYTHONHOME + } + + if (Test-Path env:_OLD_VIRTUAL_PATH) { + copy-item env:_OLD_VIRTUAL_PATH env:PATH + remove-item env:_OLD_VIRTUAL_PATH + } + + if (Test-Path env:VIRTUAL_ENV) { + remove-item env:VIRTUAL_ENV + } + + if (!$NonDestructive) { + # Self destruct! + remove-item function:deactivate + } +} + +deactivate -nondestructive + +$env:VIRTUAL_ENV="__VENV_DIR__" + +if (! $env:VIRTUAL_ENV_DISABLE_PROMPT) { + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT {""} + copy-item function:prompt function:_OLD_VIRTUAL_PROMPT + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green '__VENV_PROMPT__' + _OLD_VIRTUAL_PROMPT + } +} + +# Clear PYTHONHOME +if (Test-Path env:PYTHONHOME) { + copy-item env:PYTHONHOME env:_OLD_VIRTUAL_PYTHONHOME + remove-item env:PYTHONHOME +} + +# Add the venv to the PATH +copy-item env:PATH env:_OLD_VIRTUAL_PATH +$env:PATH = "$env:VIRTUAL_ENV\__VENV_BIN_NAME__;$env:PATH" diff --git a/Lib/venv/scripts/nt/activate.bat b/Lib/venv/scripts/nt/activate.bat index 9eab147f314d3b..d76ca1359627ee 100644 --- a/Lib/venv/scripts/nt/activate.bat +++ b/Lib/venv/scripts/nt/activate.bat @@ -1,32 +1,32 @@ -@echo off -set "VIRTUAL_ENV=__VENV_DIR__" - -if not defined PROMPT ( - set "PROMPT=$P$G" -) - -if defined _OLD_VIRTUAL_PROMPT ( - set "PROMPT=%_OLD_VIRTUAL_PROMPT%" -) - -if defined _OLD_VIRTUAL_PYTHONHOME ( - set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" -) - -set "_OLD_VIRTUAL_PROMPT=%PROMPT%" -set "PROMPT=__VENV_PROMPT__%PROMPT%" - -if defined PYTHONHOME ( - set "_OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%" - set PYTHONHOME= -) - -if defined _OLD_VIRTUAL_PATH ( - set "PATH=%_OLD_VIRTUAL_PATH%" -) else ( - set "_OLD_VIRTUAL_PATH=%PATH%" -) - -set "PATH=%VIRTUAL_ENV%\__VENV_BIN_NAME__;%PATH%" - -:END +@echo off +set "VIRTUAL_ENV=__VENV_DIR__" + +if not defined PROMPT ( + set "PROMPT=$P$G" +) + +if defined _OLD_VIRTUAL_PROMPT ( + set "PROMPT=%_OLD_VIRTUAL_PROMPT%" +) + +if defined _OLD_VIRTUAL_PYTHONHOME ( + set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" +) + +set "_OLD_VIRTUAL_PROMPT=%PROMPT%" +set "PROMPT=__VENV_PROMPT__%PROMPT%" + +if defined PYTHONHOME ( + set "_OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%" + set PYTHONHOME= +) + +if defined _OLD_VIRTUAL_PATH ( + set "PATH=%_OLD_VIRTUAL_PATH%" +) else ( + set "_OLD_VIRTUAL_PATH=%PATH%" +) + +set "PATH=%VIRTUAL_ENV%\__VENV_BIN_NAME__;%PATH%" + +:END diff --git a/Lib/venv/scripts/nt/deactivate.bat b/Lib/venv/scripts/nt/deactivate.bat index 313c0791173682..1205c618686fbb 100644 --- a/Lib/venv/scripts/nt/deactivate.bat +++ b/Lib/venv/scripts/nt/deactivate.bat @@ -1,21 +1,21 @@ -@echo off - -if defined _OLD_VIRTUAL_PROMPT ( - set "PROMPT=%_OLD_VIRTUAL_PROMPT%" -) -set _OLD_VIRTUAL_PROMPT= - -if defined _OLD_VIRTUAL_PYTHONHOME ( - set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" - set _OLD_VIRTUAL_PYTHONHOME= -) - -if defined _OLD_VIRTUAL_PATH ( - set "PATH=%_OLD_VIRTUAL_PATH%" -) - -set _OLD_VIRTUAL_PATH= - -set VIRTUAL_ENV= - -:END +@echo off + +if defined _OLD_VIRTUAL_PROMPT ( + set "PROMPT=%_OLD_VIRTUAL_PROMPT%" +) +set _OLD_VIRTUAL_PROMPT= + +if defined _OLD_VIRTUAL_PYTHONHOME ( + set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" + set _OLD_VIRTUAL_PYTHONHOME= +) + +if defined _OLD_VIRTUAL_PATH ( + set "PATH=%_OLD_VIRTUAL_PATH%" +) + +set _OLD_VIRTUAL_PATH= + +set VIRTUAL_ENV= + +:END diff --git a/Modules/_decimal/tests/runall.bat b/Modules/_decimal/tests/runall.bat index 568f92f6ddf392..5bc872a63f83aa 100755 --- a/Modules/_decimal/tests/runall.bat +++ b/Modules/_decimal/tests/runall.bat @@ -1,111 +1,111 @@ -@ECHO OFF - -rem Test all machine configurations, pydebug, refleaks, release build. - -cd ..\..\..\ - - -echo. -echo # ====================================================================== -echo # Building Python -echo # ====================================================================== -echo. - -call "%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat" x64 -msbuild /noconsolelogger /target:clean PCbuild\pcbuild.sln /p:Configuration=Release /p:PlatformTarget=x64 -msbuild /noconsolelogger /target:clean PCbuild\pcbuild.sln /p:Configuration=Debug /p:PlatformTarget=x64 -msbuild /noconsolelogger PCbuild\pcbuild.sln /p:Configuration=Release /p:Platform=x64 -msbuild /noconsolelogger PCbuild\pcbuild.sln /p:Configuration=Debug /p:Platform=x64 - -call "%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat" x86 -msbuild /noconsolelogger PCbuild\pcbuild.sln /p:Configuration=Release /p:Platform=Win32 -msbuild /noconsolelogger PCbuild\pcbuild.sln /p:Configuration=Debug /p:Platform=Win32 -echo. -echo. - -echo. -echo # ====================================================================== -echo # test_decimal: platform=x64 -echo # ====================================================================== -echo. - -cd PCbuild\amd64 - -echo # ==================== refleak tests ======================= -echo. -python_d.exe -m test -uall -R 2:2 test_decimal -echo. -echo. - -echo # ==================== regular tests ======================= -echo. -python.exe -m test -uall test_decimal -echo. -echo. - -cd .. - -echo. -echo # ====================================================================== -echo # test_decimal: platform=x86 -echo # ====================================================================== -echo. - -echo # ==================== refleak tests ======================= -echo. -python_d.exe -m test -uall -R 2:2 test_decimal -echo. -echo. - -echo # ==================== regular tests ======================= -echo. -python.exe -m test -uall test_decimal -echo. -echo. - -cd amd64 - -echo. -echo # ====================================================================== -echo # deccheck: platform=x64 -echo # ====================================================================== -echo. - -echo # ==================== debug build ======================= -echo. -python_d.exe ..\..\Modules\_decimal\tests\deccheck.py -echo. -echo. - -echo # =================== release build ====================== -echo. -python.exe ..\..\Modules\_decimal\tests\deccheck.py -echo. -echo. - -cd .. - -echo. -echo # ====================================================================== -echo # deccheck: platform=x86 -echo # ====================================================================== -echo. -echo. - -echo # ==================== debug build ======================= -echo. -python_d.exe ..\Modules\_decimal\tests\deccheck.py -echo. -echo. - -echo # =================== release build ====================== -echo. -python.exe ..\Modules\_decimal\tests\deccheck.py -echo. -echo. - - -cd ..\Modules\_decimal\tests - - - +@ECHO OFF + +rem Test all machine configurations, pydebug, refleaks, release build. + +cd ..\..\..\ + + +echo. +echo # ====================================================================== +echo # Building Python +echo # ====================================================================== +echo. + +call "%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat" x64 +msbuild /noconsolelogger /target:clean PCbuild\pcbuild.sln /p:Configuration=Release /p:PlatformTarget=x64 +msbuild /noconsolelogger /target:clean PCbuild\pcbuild.sln /p:Configuration=Debug /p:PlatformTarget=x64 +msbuild /noconsolelogger PCbuild\pcbuild.sln /p:Configuration=Release /p:Platform=x64 +msbuild /noconsolelogger PCbuild\pcbuild.sln /p:Configuration=Debug /p:Platform=x64 + +call "%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat" x86 +msbuild /noconsolelogger PCbuild\pcbuild.sln /p:Configuration=Release /p:Platform=Win32 +msbuild /noconsolelogger PCbuild\pcbuild.sln /p:Configuration=Debug /p:Platform=Win32 +echo. +echo. + +echo. +echo # ====================================================================== +echo # test_decimal: platform=x64 +echo # ====================================================================== +echo. + +cd PCbuild\amd64 + +echo # ==================== refleak tests ======================= +echo. +python_d.exe -m test -uall -R 2:2 test_decimal +echo. +echo. + +echo # ==================== regular tests ======================= +echo. +python.exe -m test -uall test_decimal +echo. +echo. + +cd .. + +echo. +echo # ====================================================================== +echo # test_decimal: platform=x86 +echo # ====================================================================== +echo. + +echo # ==================== refleak tests ======================= +echo. +python_d.exe -m test -uall -R 2:2 test_decimal +echo. +echo. + +echo # ==================== regular tests ======================= +echo. +python.exe -m test -uall test_decimal +echo. +echo. + +cd amd64 + +echo. +echo # ====================================================================== +echo # deccheck: platform=x64 +echo # ====================================================================== +echo. + +echo # ==================== debug build ======================= +echo. +python_d.exe ..\..\Modules\_decimal\tests\deccheck.py +echo. +echo. + +echo # =================== release build ====================== +echo. +python.exe ..\..\Modules\_decimal\tests\deccheck.py +echo. +echo. + +cd .. + +echo. +echo # ====================================================================== +echo # deccheck: platform=x86 +echo # ====================================================================== +echo. +echo. + +echo # ==================== debug build ======================= +echo. +python_d.exe ..\Modules\_decimal\tests\deccheck.py +echo. +echo. + +echo # =================== release build ====================== +echo. +python.exe ..\Modules\_decimal\tests\deccheck.py +echo. +echo. + + +cd ..\Modules\_decimal\tests + + + diff --git a/PC/bdist_wininst/build.bat b/PC/bdist_wininst/build.bat index 25f565ce0a16d8..ee6856754faa8c 100644 --- a/PC/bdist_wininst/build.bat +++ b/PC/bdist_wininst/build.bat @@ -1,22 +1,22 @@ -@echo off -setlocal - -set D=%~dp0 -set PCBUILD=%~dp0..\..\PCBuild\ - - -echo Building Lib\distutils\command\wininst-xx.0.exe - -call "%PCBUILD%env.bat" x86 -if errorlevel 1 goto :eof - -msbuild "%D%bdist_wininst.vcxproj" "/p:SolutionDir=%PCBUILD%\" /p:Configuration=Release /p:Platform=Win32 -if errorlevel 1 goto :eof - - -echo Building Lib\distutils\command\wininst-xx.0-amd64.exe - -call "%PCBUILD%env.bat" x86_amd64 -if errorlevel 1 goto :eof - -msbuild "%D%bdist_wininst.vcxproj" "/p:SolutionDir=%PCBUILD%\" /p:Configuration=Release /p:Platform=x64 +@echo off +setlocal + +set D=%~dp0 +set PCBUILD=%~dp0..\..\PCBuild\ + + +echo Building Lib\distutils\command\wininst-xx.0.exe + +call "%PCBUILD%env.bat" x86 +if errorlevel 1 goto :eof + +msbuild "%D%bdist_wininst.vcxproj" "/p:SolutionDir=%PCBUILD%\" /p:Configuration=Release /p:Platform=Win32 +if errorlevel 1 goto :eof + + +echo Building Lib\distutils\command\wininst-xx.0-amd64.exe + +call "%PCBUILD%env.bat" x86_amd64 +if errorlevel 1 goto :eof + +msbuild "%D%bdist_wininst.vcxproj" "/p:SolutionDir=%PCBUILD%\" /p:Configuration=Release /p:Platform=x64 diff --git a/PCbuild/build.bat b/PCbuild/build.bat index f7f2858d7d9d99..8e1c168a8591f8 100644 --- a/PCbuild/build.bat +++ b/PCbuild/build.bat @@ -1,156 +1,156 @@ -@echo off -goto Run -:Usage -echo.%~nx0 [flags and arguments] [quoted MSBuild options] -echo. -echo.Build CPython from the command line. Requires the appropriate -echo.version(s) of Microsoft Visual Studio to be installed (see readme.txt). -echo.Also requires Subversion (svn.exe) to be on PATH if the '-e' flag is -echo.given. -echo. -echo.After the flags recognized by this script, up to 9 arguments to be passed -echo.directly to MSBuild may be passed. If the argument contains an '=', the -echo.entire argument must be quoted (e.g. `%~nx0 "/p:PlatformToolset=v100"`) -echo. -echo.Available flags: -echo. -h Display this help message -echo. -V Display version information for the current build -echo. -r Target Rebuild instead of Build -echo. -d Set the configuration to Debug -echo. -e Build external libraries fetched by get_externals.bat -echo. Extension modules that depend on external libraries will not attempt -echo. to build if this flag is not present -echo. -m Enable parallel build (enabled by default) -echo. -M Disable parallel build -echo. -v Increased output messages -echo. -k Attempt to kill any running Pythons before building (usually done -echo. automatically by the pythoncore project) -echo. --pgo Build with Profile-Guided Optimization. This flag -echo. overrides -c and -d -echo. --test-marker Enable the test marker within the build. -echo. -echo.Available flags to avoid building certain modules. -echo.These flags have no effect if '-e' is not given: -echo. --no-ssl Do not attempt to build _ssl -echo. --no-tkinter Do not attempt to build Tkinter -echo. -echo.Available arguments: -echo. -c Release ^| Debug ^| PGInstrument ^| PGUpdate -echo. Set the configuration (default: Release) -echo. -p x64 ^| Win32 -echo. Set the platform (default: Win32) -echo. -t Build ^| Rebuild ^| Clean ^| CleanAll -echo. Set the target manually -echo. --pgo-job The job to use for PGO training; implies --pgo -echo. (default: "-m test --pgo") -exit /b 127 - -:Run -setlocal -set platf=Win32 -set vs_platf=x86 -set conf=Release -set target=Build -set dir=%~dp0 -set parallel=/m -set verbose=/nologo /v:m -set kill= -set do_pgo= -set pgo_job=-m test --pgo -set on_64_bit=true - -rem This may not be 100% accurate, but close enough. -if "%ProgramFiles(x86)%"=="" (set on_64_bit=false) - -:CheckOpts -if "%~1"=="-h" goto Usage -if "%~1"=="-c" (set conf=%2) & shift & shift & goto CheckOpts -if "%~1"=="-p" (set platf=%2) & shift & shift & goto CheckOpts -if "%~1"=="-r" (set target=Rebuild) & shift & goto CheckOpts -if "%~1"=="-t" (set target=%2) & shift & shift & goto CheckOpts -if "%~1"=="-d" (set conf=Debug) & shift & goto CheckOpts -if "%~1"=="-m" (set parallel=/m) & shift & goto CheckOpts -if "%~1"=="-M" (set parallel=) & shift & goto CheckOpts -if "%~1"=="-v" (set verbose=/v:n) & shift & goto CheckOpts -if "%~1"=="-k" (set kill=true) & shift & goto CheckOpts -if "%~1"=="--pgo" (set do_pgo=true) & shift & goto CheckOpts -if "%~1"=="--pgo-job" (set do_pgo=true) & (set pgo_job=%~2) & shift & shift & goto CheckOpts -if "%~1"=="--test-marker" (set UseTestMarker=true) & shift & goto CheckOpts -if "%~1"=="-V" shift & goto Version -rem These use the actual property names used by MSBuild. We could just let -rem them in through the environment, but we specify them on the command line -rem anyway for visibility so set defaults after this -if "%~1"=="-e" (set IncludeExternals=true) & shift & goto CheckOpts -if "%~1"=="--no-ssl" (set IncludeSSL=false) & shift & goto CheckOpts -if "%~1"=="--no-tkinter" (set IncludeTkinter=false) & shift & goto CheckOpts - -if "%IncludeExternals%"=="" set IncludeExternals=false -if "%IncludeSSL%"=="" set IncludeSSL=true -if "%IncludeTkinter%"=="" set IncludeTkinter=true - -if "%IncludeExternals%"=="true" call "%dir%get_externals.bat" - -if "%platf%"=="x64" ( - if "%on_64_bit%"=="true" ( - rem This ought to always be correct these days... - set vs_platf=amd64 - ) else ( - if "%do_pgo%"=="true" ( - echo.ERROR: Cannot cross-compile with PGO - echo. 32bit operating system detected, if this is incorrect, - echo. make sure the ProgramFiles(x86^) environment variable is set - exit /b 1 - ) - set vs_platf=x86_amd64 - ) -) - -if not exist "%GIT%" where git > "%TEMP%\git.loc" 2> nul && set /P GIT= < "%TEMP%\git.loc" & del "%TEMP%\git.loc" -if exist "%GIT%" set GITProperty=/p:GIT="%GIT%" -if not exist "%GIT%" echo Cannot find Git on PATH & set GITProperty= - -rem Setup the environment -call "%dir%env.bat" %vs_platf% >nul - -if "%kill%"=="true" call :Kill - -if "%do_pgo%"=="true" ( - set conf=PGInstrument - call :Build - del /s "%dir%\*.pgc" - del /s "%dir%\..\Lib\*.pyc" - echo on - call "%dir%\..\python.bat" %pgo_job% - @echo off - call :Kill - set conf=PGUpdate - set target=Build -) -goto Build -:Kill -echo on -msbuild "%dir%\pythoncore.vcxproj" /t:KillPython %verbose%^ - /p:Configuration=%conf% /p:Platform=%platf%^ - /p:KillPython=true - -@echo off -goto :eof - -:Build -rem Call on MSBuild to do the work, echo the command. -rem Passing %1-9 is not the preferred option, but argument parsing in -rem batch is, shall we say, "lackluster" -echo on -msbuild "%dir%pcbuild.proj" /t:%target% %parallel% %verbose%^ - /p:Configuration=%conf% /p:Platform=%platf%^ - /p:IncludeExternals=%IncludeExternals%^ - /p:IncludeSSL=%IncludeSSL% /p:IncludeTkinter=%IncludeTkinter%^ - /p:UseTestMarker=%UseTestMarker% %GITProperty%^ - %1 %2 %3 %4 %5 %6 %7 %8 %9 - -@echo off -goto :eof - -:Version -rem Display the current build version information -msbuild "%dir%python.props" /t:ShowVersionInfo /v:m /nologo %1 %2 %3 %4 %5 %6 %7 %8 %9 +@echo off +goto Run +:Usage +echo.%~nx0 [flags and arguments] [quoted MSBuild options] +echo. +echo.Build CPython from the command line. Requires the appropriate +echo.version(s) of Microsoft Visual Studio to be installed (see readme.txt). +echo.Also requires Subversion (svn.exe) to be on PATH if the '-e' flag is +echo.given. +echo. +echo.After the flags recognized by this script, up to 9 arguments to be passed +echo.directly to MSBuild may be passed. If the argument contains an '=', the +echo.entire argument must be quoted (e.g. `%~nx0 "/p:PlatformToolset=v100"`) +echo. +echo.Available flags: +echo. -h Display this help message +echo. -V Display version information for the current build +echo. -r Target Rebuild instead of Build +echo. -d Set the configuration to Debug +echo. -e Build external libraries fetched by get_externals.bat +echo. Extension modules that depend on external libraries will not attempt +echo. to build if this flag is not present +echo. -m Enable parallel build (enabled by default) +echo. -M Disable parallel build +echo. -v Increased output messages +echo. -k Attempt to kill any running Pythons before building (usually done +echo. automatically by the pythoncore project) +echo. --pgo Build with Profile-Guided Optimization. This flag +echo. overrides -c and -d +echo. --test-marker Enable the test marker within the build. +echo. +echo.Available flags to avoid building certain modules. +echo.These flags have no effect if '-e' is not given: +echo. --no-ssl Do not attempt to build _ssl +echo. --no-tkinter Do not attempt to build Tkinter +echo. +echo.Available arguments: +echo. -c Release ^| Debug ^| PGInstrument ^| PGUpdate +echo. Set the configuration (default: Release) +echo. -p x64 ^| Win32 +echo. Set the platform (default: Win32) +echo. -t Build ^| Rebuild ^| Clean ^| CleanAll +echo. Set the target manually +echo. --pgo-job The job to use for PGO training; implies --pgo +echo. (default: "-m test --pgo") +exit /b 127 + +:Run +setlocal +set platf=Win32 +set vs_platf=x86 +set conf=Release +set target=Build +set dir=%~dp0 +set parallel=/m +set verbose=/nologo /v:m +set kill= +set do_pgo= +set pgo_job=-m test --pgo +set on_64_bit=true + +rem This may not be 100% accurate, but close enough. +if "%ProgramFiles(x86)%"=="" (set on_64_bit=false) + +:CheckOpts +if "%~1"=="-h" goto Usage +if "%~1"=="-c" (set conf=%2) & shift & shift & goto CheckOpts +if "%~1"=="-p" (set platf=%2) & shift & shift & goto CheckOpts +if "%~1"=="-r" (set target=Rebuild) & shift & goto CheckOpts +if "%~1"=="-t" (set target=%2) & shift & shift & goto CheckOpts +if "%~1"=="-d" (set conf=Debug) & shift & goto CheckOpts +if "%~1"=="-m" (set parallel=/m) & shift & goto CheckOpts +if "%~1"=="-M" (set parallel=) & shift & goto CheckOpts +if "%~1"=="-v" (set verbose=/v:n) & shift & goto CheckOpts +if "%~1"=="-k" (set kill=true) & shift & goto CheckOpts +if "%~1"=="--pgo" (set do_pgo=true) & shift & goto CheckOpts +if "%~1"=="--pgo-job" (set do_pgo=true) & (set pgo_job=%~2) & shift & shift & goto CheckOpts +if "%~1"=="--test-marker" (set UseTestMarker=true) & shift & goto CheckOpts +if "%~1"=="-V" shift & goto Version +rem These use the actual property names used by MSBuild. We could just let +rem them in through the environment, but we specify them on the command line +rem anyway for visibility so set defaults after this +if "%~1"=="-e" (set IncludeExternals=true) & shift & goto CheckOpts +if "%~1"=="--no-ssl" (set IncludeSSL=false) & shift & goto CheckOpts +if "%~1"=="--no-tkinter" (set IncludeTkinter=false) & shift & goto CheckOpts + +if "%IncludeExternals%"=="" set IncludeExternals=false +if "%IncludeSSL%"=="" set IncludeSSL=true +if "%IncludeTkinter%"=="" set IncludeTkinter=true + +if "%IncludeExternals%"=="true" call "%dir%get_externals.bat" + +if "%platf%"=="x64" ( + if "%on_64_bit%"=="true" ( + rem This ought to always be correct these days... + set vs_platf=amd64 + ) else ( + if "%do_pgo%"=="true" ( + echo.ERROR: Cannot cross-compile with PGO + echo. 32bit operating system detected, if this is incorrect, + echo. make sure the ProgramFiles(x86^) environment variable is set + exit /b 1 + ) + set vs_platf=x86_amd64 + ) +) + +if not exist "%GIT%" where git > "%TEMP%\git.loc" 2> nul && set /P GIT= < "%TEMP%\git.loc" & del "%TEMP%\git.loc" +if exist "%GIT%" set GITProperty=/p:GIT="%GIT%" +if not exist "%GIT%" echo Cannot find Git on PATH & set GITProperty= + +rem Setup the environment +call "%dir%env.bat" %vs_platf% >nul + +if "%kill%"=="true" call :Kill + +if "%do_pgo%"=="true" ( + set conf=PGInstrument + call :Build + del /s "%dir%\*.pgc" + del /s "%dir%\..\Lib\*.pyc" + echo on + call "%dir%\..\python.bat" %pgo_job% + @echo off + call :Kill + set conf=PGUpdate + set target=Build +) +goto Build +:Kill +echo on +msbuild "%dir%\pythoncore.vcxproj" /t:KillPython %verbose%^ + /p:Configuration=%conf% /p:Platform=%platf%^ + /p:KillPython=true + +@echo off +goto :eof + +:Build +rem Call on MSBuild to do the work, echo the command. +rem Passing %1-9 is not the preferred option, but argument parsing in +rem batch is, shall we say, "lackluster" +echo on +msbuild "%dir%pcbuild.proj" /t:%target% %parallel% %verbose%^ + /p:Configuration=%conf% /p:Platform=%platf%^ + /p:IncludeExternals=%IncludeExternals%^ + /p:IncludeSSL=%IncludeSSL% /p:IncludeTkinter=%IncludeTkinter%^ + /p:UseTestMarker=%UseTestMarker% %GITProperty%^ + %1 %2 %3 %4 %5 %6 %7 %8 %9 + +@echo off +goto :eof + +:Version +rem Display the current build version information +msbuild "%dir%python.props" /t:ShowVersionInfo /v:m /nologo %1 %2 %3 %4 %5 %6 %7 %8 %9 diff --git a/PCbuild/build_env.bat b/PCbuild/build_env.bat index 01024cff215d39..4c67ae3ac253c7 100644 --- a/PCbuild/build_env.bat +++ b/PCbuild/build_env.bat @@ -1 +1 @@ -@%comspec% /k env.bat %* +@%comspec% /k env.bat %* diff --git a/PCbuild/clean.bat b/PCbuild/clean.bat index 78517d225f9f44..6144c715f64e43 100644 --- a/PCbuild/clean.bat +++ b/PCbuild/clean.bat @@ -1,5 +1,5 @@ -@echo off -rem A batch program to clean a particular configuration, -rem just for convenience. - -call %~dp0build.bat -t Clean %* +@echo off +rem A batch program to clean a particular configuration, +rem just for convenience. + +call %~dp0build.bat -t Clean %* diff --git a/PCbuild/env.bat b/PCbuild/env.bat index 2b2c0051ce912f..9d4c9d1c32f7a4 100644 --- a/PCbuild/env.bat +++ b/PCbuild/env.bat @@ -1,16 +1,16 @@ -@echo off -rem This script adds the latest available tools to the path for the current -rem command window. However, most builds of Python will ignore the version -rem of the tools on PATH and use PlatformToolset instead. Ideally, both sets of -rem tools should be the same version to avoid potential conflicts. -rem -rem To build Python with an earlier toolset, pass "/p:PlatformToolset=v100" (or -rem 'v110', 'v120' or 'v140') to the build script. - -echo Build environments: x86, amd64, x86_amd64 -echo. -set VSTOOLS=%VS140COMNTOOLS% -if "%VSTOOLS%"=="" set VSTOOLS=%VS120COMNTOOLS% -if "%VSTOOLS%"=="" set VSTOOLS=%VS110COMNTOOLS% -if "%VSTOOLS%"=="" set VSTOOLS=%VS100COMNTOOLS% -call "%VSTOOLS%..\..\VC\vcvarsall.bat" %* +@echo off +rem This script adds the latest available tools to the path for the current +rem command window. However, most builds of Python will ignore the version +rem of the tools on PATH and use PlatformToolset instead. Ideally, both sets of +rem tools should be the same version to avoid potential conflicts. +rem +rem To build Python with an earlier toolset, pass "/p:PlatformToolset=v100" (or +rem 'v110', 'v120' or 'v140') to the build script. + +echo Build environments: x86, amd64, x86_amd64 +echo. +set VSTOOLS=%VS140COMNTOOLS% +if "%VSTOOLS%"=="" set VSTOOLS=%VS120COMNTOOLS% +if "%VSTOOLS%"=="" set VSTOOLS=%VS110COMNTOOLS% +if "%VSTOOLS%"=="" set VSTOOLS=%VS100COMNTOOLS% +call "%VSTOOLS%..\..\VC\vcvarsall.bat" %* diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index 3a2656e961ef7f..5767ab2eacf25b 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -1,104 +1,104 @@ -@echo off -setlocal -rem Simple script to fetch source for external libraries - -if not exist "%~dp0..\externals" mkdir "%~dp0..\externals" -pushd "%~dp0..\externals" - -if "%SVNROOT%"=="" set SVNROOT=http://svn.python.org/projects/external/ - -rem Optionally clean up first. Be warned that this can be very destructive! -if not "%1"=="" ( - for %%c in (-c --clean --clean-only) do ( - if "%1"=="%%c" goto clean - ) - goto usage -) -goto fetch - -:clean -echo.Cleaning up external libraries. -for /D %%d in ( - bzip2-* - db-* - nasm-* - openssl-* - tcl-* - tcltk* - tk-* - tix-* - sqlite-* - xz-* - ) do ( - echo.Removing %%d - rmdir /s /q %%d -) -if "%1"=="--clean-only" ( - goto end -) - -:fetch -rem Fetch current versions - -svn --version > nul 2>&1 -if ERRORLEVEL 9009 ( - echo.svn.exe must be on your PATH. - echo.Try TortoiseSVN (http://tortoisesvn.net/^) and be sure to check the - echo.command line tools option. - popd - exit /b 1 -) - -echo.Fetching external libraries... - -set libraries= -set libraries=%libraries% bzip2-1.0.6 -if NOT "%IncludeSSL%"=="false" set libraries=%libraries% nasm-2.11.06 -if NOT "%IncludeSSL%"=="false" set libraries=%libraries% openssl-1.0.2k -set libraries=%libraries% sqlite-3.14.2.0 -if NOT "%IncludeTkinter%"=="false" set libraries=%libraries% tcl-core-8.6.6.0 -if NOT "%IncludeTkinter%"=="false" set libraries=%libraries% tk-8.6.6.0 -if NOT "%IncludeTkinter%"=="false" set libraries=%libraries% tix-8.4.3.6 -set libraries=%libraries% xz-5.2.2 - -for %%e in (%libraries%) do ( - if exist %%e ( - echo.%%e already exists, skipping. - ) else ( - echo.Fetching %%e... - svn export -q %SVNROOT%%%e - ) -) - -goto end - -:usage -echo.invalid argument: %1 -echo.usage: %~n0 [[ -c ^| --clean ] ^| --clean-only ] -echo. -echo.Pull all sources necessary for compiling optional extension modules -echo.that rely on external libraries. Requires svn.exe to be on your PATH -echo.and pulls sources from %SVNROOT%. -echo. -echo.Use the -c or --clean option to clean up all external library sources -echo.before pulling in the current versions. -echo. -echo.Use the --clean-only option to do the same cleaning, without pulling in -echo.anything new. -echo. -echo.Only the first argument is checked, all others are ignored. -echo. -echo.**WARNING**: the cleaning options unconditionally remove any directory -echo.that is a child of -echo. %CD% -echo.and matches wildcard patterns beginning with bzip2-, db-, nasm-, openssl-, -echo.tcl-, tcltk, tk-, tix-, sqlite-, or xz-, and as such has the potential -echo.to be very destructive if you are not aware of what it is doing. Use with -echo.caution! -popd -exit /b -1 - - -:end -echo Finished. -popd +@echo off +setlocal +rem Simple script to fetch source for external libraries + +if not exist "%~dp0..\externals" mkdir "%~dp0..\externals" +pushd "%~dp0..\externals" + +if "%SVNROOT%"=="" set SVNROOT=http://svn.python.org/projects/external/ + +rem Optionally clean up first. Be warned that this can be very destructive! +if not "%1"=="" ( + for %%c in (-c --clean --clean-only) do ( + if "%1"=="%%c" goto clean + ) + goto usage +) +goto fetch + +:clean +echo.Cleaning up external libraries. +for /D %%d in ( + bzip2-* + db-* + nasm-* + openssl-* + tcl-* + tcltk* + tk-* + tix-* + sqlite-* + xz-* + ) do ( + echo.Removing %%d + rmdir /s /q %%d +) +if "%1"=="--clean-only" ( + goto end +) + +:fetch +rem Fetch current versions + +svn --version > nul 2>&1 +if ERRORLEVEL 9009 ( + echo.svn.exe must be on your PATH. + echo.Try TortoiseSVN (http://tortoisesvn.net/^) and be sure to check the + echo.command line tools option. + popd + exit /b 1 +) + +echo.Fetching external libraries... + +set libraries= +set libraries=%libraries% bzip2-1.0.6 +if NOT "%IncludeSSL%"=="false" set libraries=%libraries% nasm-2.11.06 +if NOT "%IncludeSSL%"=="false" set libraries=%libraries% openssl-1.0.2k +set libraries=%libraries% sqlite-3.14.2.0 +if NOT "%IncludeTkinter%"=="false" set libraries=%libraries% tcl-core-8.6.6.0 +if NOT "%IncludeTkinter%"=="false" set libraries=%libraries% tk-8.6.6.0 +if NOT "%IncludeTkinter%"=="false" set libraries=%libraries% tix-8.4.3.6 +set libraries=%libraries% xz-5.2.2 + +for %%e in (%libraries%) do ( + if exist %%e ( + echo.%%e already exists, skipping. + ) else ( + echo.Fetching %%e... + svn export -q %SVNROOT%%%e + ) +) + +goto end + +:usage +echo.invalid argument: %1 +echo.usage: %~n0 [[ -c ^| --clean ] ^| --clean-only ] +echo. +echo.Pull all sources necessary for compiling optional extension modules +echo.that rely on external libraries. Requires svn.exe to be on your PATH +echo.and pulls sources from %SVNROOT%. +echo. +echo.Use the -c or --clean option to clean up all external library sources +echo.before pulling in the current versions. +echo. +echo.Use the --clean-only option to do the same cleaning, without pulling in +echo.anything new. +echo. +echo.Only the first argument is checked, all others are ignored. +echo. +echo.**WARNING**: the cleaning options unconditionally remove any directory +echo.that is a child of +echo. %CD% +echo.and matches wildcard patterns beginning with bzip2-, db-, nasm-, openssl-, +echo.tcl-, tcltk, tk-, tix-, sqlite-, or xz-, and as such has the potential +echo.to be very destructive if you are not aware of what it is doing. Use with +echo.caution! +popd +exit /b -1 + + +:end +echo Finished. +popd diff --git a/PCbuild/idle.bat b/PCbuild/idle.bat index bacaaa8414a267..1978b99f6ee19d 100644 --- a/PCbuild/idle.bat +++ b/PCbuild/idle.bat @@ -1,15 +1,15 @@ -@echo off -rem start idle -rem Usage: idle [-d] -rem -d Run Debug build (python_d.exe). Else release build. - -setlocal -set exe=win32\python -PATH %PATH%;..\externals\tcltk\bin - -if "%1"=="-d" (set exe=%exe%_d) & shift - -set cmd=%exe% ../Lib/idlelib/idle.py %1 %2 %3 %4 %5 %6 %7 %8 %9 - -echo on -%cmd% +@echo off +rem start idle +rem Usage: idle [-d] +rem -d Run Debug build (python_d.exe). Else release build. + +setlocal +set exe=win32\python +PATH %PATH%;..\externals\tcltk\bin + +if "%1"=="-d" (set exe=%exe%_d) & shift + +set cmd=%exe% ../Lib/idlelib/idle.py %1 %2 %3 %4 %5 %6 %7 %8 %9 + +echo on +%cmd% diff --git a/PCbuild/pcbuild.sln b/PCbuild/pcbuild.sln index 580879930a83d0..736a5997037208 100644 --- a/PCbuild/pcbuild.sln +++ b/PCbuild/pcbuild.sln @@ -1,769 +1,769 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25123.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{553EC33E-9816-4996-A660-5D6186A0B0B3}" - ProjectSection(SolutionItems) = preProject - ..\Modules\getbuildinfo.c = ..\Modules\getbuildinfo.c - readme.txt = readme.txt - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "python", "python.vcxproj", "{B11D750F-CD1F-4A96-85CE-E69A5C5259F9}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pythoncore", "pythoncore.vcxproj", "{CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pythonw", "pythonw.vcxproj", "{F4229CC3-873C-49AE-9729-DD308ED4CD4A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winsound", "winsound.vcxproj", "{28B5D777-DDF2-4B6B-B34F-31D938813856}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_decimal", "_decimal.vcxproj", "{0E9791DB-593A-465F-98BC-681011311617}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ctypes", "_ctypes.vcxproj", "{0E9791DB-593A-465F-98BC-681011311618}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ctypes_test", "_ctypes_test.vcxproj", "{9EC7190A-249F-4180-A900-548FDCF3055F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_elementtree", "_elementtree.vcxproj", "{17E1E049-C309-4D79-843F-AE483C264AEA}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_msi", "_msi.vcxproj", "{31FFC478-7B4A-43E8-9954-8D03E2187E9C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_socket", "_socket.vcxproj", "{86937F53-C189-40EF-8CE8-8759D8E7D480}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_sqlite3", "_sqlite3.vcxproj", "{13CECB97-4119-4316-9D42-8534019A5A44}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ssl", "_ssl.vcxproj", "{C6E20F84-3247-4AD6-B051-B073268F73BA}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testcapi", "_testcapi.vcxproj", "{6901D91C-6E48-4BB7-9FEC-700C8131DF1D}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testimportmultiple", "_testimportmultiple.vcxproj", "{36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_tkinter", "_tkinter.vcxproj", "{4946ECAC-2E69-4BF8-A90A-F5136F5094DF}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_bz2", "_bz2.vcxproj", "{73FCD2BD-F133-46B7-8EC1-144CD82A59D5}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "select", "select.vcxproj", "{18CAE28C-B454-46C1-87A0-493D91D97F03}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_lzma", "_lzma.vcxproj", "{F9D71780-F393-11E0-BE50-0800200C9A66}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unicodedata", "unicodedata.vcxproj", "{ECC7CEAC-A5E5-458E-BB9E-2413CC847881}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pyexpat", "pyexpat.vcxproj", "{D06B6426-4762-44CC-8BAD-D79052507F2F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bdist_wininst", "..\PC\bdist_wininst\bdist_wininst.vcxproj", "{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_hashlib", "_hashlib.vcxproj", "{447F05A8-F581-4CAC-A466-5AC7936E207E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sqlite3", "sqlite3.vcxproj", "{A1A295E5-463C-437F-81CA-1F32367685DA}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_multiprocessing", "_multiprocessing.vcxproj", "{9E48B300-37D1-11DD-8C41-005056C00008}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "python3dll", "python3dll.vcxproj", "{885D4898-D08D-4091-9C40-C700CFE3FC5A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xxlimited", "xxlimited.vcxproj", "{F749B822-B489-4CA5-A3AD-CE078F5F338A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testbuffer", "_testbuffer.vcxproj", "{A2697BD3-28C1-4AEC-9106-8B748639FD16}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pylauncher", "pylauncher.vcxproj", "{7B2727B5-5A3F-40EE-A866-43A13CD31446}" - ProjectSection(ProjectDependencies) = postProject - {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782} = {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pywlauncher", "pywlauncher.vcxproj", "{1D4B18D3-7C12-4ECB-9179-8531FF876CE6}" - ProjectSection(ProjectDependencies) = postProject - {7B2727B5-5A3F-40EE-A866-43A13CD31446} = {7B2727B5-5A3F-40EE-A866-43A13CD31446} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_freeze_importlib", "_freeze_importlib.vcxproj", "{19C0C13F-47CA-4432-AFF3-799A296A4DDC}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_overlapped", "_overlapped.vcxproj", "{EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testembed", "_testembed.vcxproj", "{6DAC66D9-E703-4624-BE03-49112AB5AA62}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testmultiphase", "_testmultiphase.vcxproj", "{16BFE6F0-22EF-40B5-B831-7E937119EF10}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tcl", "tcl.vcxproj", "{B5FD6F1D-129E-4BFF-9340-03606FAC7283}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tix", "tix.vcxproj", "{C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tk", "tk.vcxproj", "{7E85ECCF-A72C-4DA4-9E52-884508E80BA1}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libeay", "libeay.vcxproj", "{E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ssleay", "ssleay.vcxproj", "{10615B24-73BF-4EFA-93AA-236916321317}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pyshellext", "pyshellext.vcxproj", "{0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testconsole", "_testconsole.vcxproj", "{B244E787-C445-441C-BDF4-5A4F1A3A1E51}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_asyncio", "_asyncio.vcxproj", "{384C224A-7474-476E-A01B-750EA7DE918C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liblzma", "liblzma.vcxproj", "{12728250-16EC-4DC6-94D7-E21DD88947F8}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - PGInstrument|Win32 = PGInstrument|Win32 - PGInstrument|x64 = PGInstrument|x64 - PGUpdate|Win32 = PGUpdate|Win32 - PGUpdate|x64 = PGUpdate|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|Win32.ActiveCfg = Debug|Win32 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|Win32.Build.0 = Debug|Win32 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|x64.ActiveCfg = Debug|x64 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|x64.Build.0 = Debug|x64 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|Win32.ActiveCfg = Release|Win32 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|Win32.Build.0 = Release|Win32 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|x64.ActiveCfg = Release|x64 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|x64.Build.0 = Release|x64 - {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|Win32.ActiveCfg = Debug|Win32 - {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|Win32.Build.0 = Debug|Win32 - {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|x64.ActiveCfg = Debug|x64 - {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|x64.Build.0 = Debug|x64 - {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|Win32.ActiveCfg = Release|Win32 - {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|Win32.Build.0 = Release|Win32 - {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|x64.ActiveCfg = Release|x64 - {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|x64.Build.0 = Release|x64 - {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|Win32.ActiveCfg = Debug|Win32 - {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|Win32.Build.0 = Debug|Win32 - {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|x64.ActiveCfg = Debug|x64 - {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|x64.Build.0 = Debug|x64 - {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|Win32.Build.0 = Release|Win32 - {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|x64.ActiveCfg = Release|x64 - {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|x64.Build.0 = Release|x64 - {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|Win32.Build.0 = Release|Win32 - {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|x64.ActiveCfg = Release|x64 - {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|x64.Build.0 = Release|x64 - {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|Win32.ActiveCfg = Release|Win32 - {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|Win32.Build.0 = Release|Win32 - {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|x64.ActiveCfg = Release|x64 - {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|x64.Build.0 = Release|x64 - {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|Win32.ActiveCfg = Debug|Win32 - {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|Win32.Build.0 = Debug|Win32 - {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|x64.ActiveCfg = Debug|x64 - {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|x64.Build.0 = Debug|x64 - {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|Win32.ActiveCfg = Release|Win32 - {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|Win32.Build.0 = Release|Win32 - {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|x64.ActiveCfg = Release|x64 - {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|x64.Build.0 = Release|x64 - {0E9791DB-593A-465F-98BC-681011311617}.Debug|Win32.ActiveCfg = Debug|Win32 - {0E9791DB-593A-465F-98BC-681011311617}.Debug|Win32.Build.0 = Debug|Win32 - {0E9791DB-593A-465F-98BC-681011311617}.Debug|x64.ActiveCfg = Debug|x64 - {0E9791DB-593A-465F-98BC-681011311617}.Debug|x64.Build.0 = Debug|x64 - {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {0E9791DB-593A-465F-98BC-681011311617}.Release|Win32.ActiveCfg = Release|Win32 - {0E9791DB-593A-465F-98BC-681011311617}.Release|Win32.Build.0 = Release|Win32 - {0E9791DB-593A-465F-98BC-681011311617}.Release|x64.ActiveCfg = Release|x64 - {0E9791DB-593A-465F-98BC-681011311617}.Release|x64.Build.0 = Release|x64 - {0E9791DB-593A-465F-98BC-681011311618}.Debug|Win32.ActiveCfg = Debug|Win32 - {0E9791DB-593A-465F-98BC-681011311618}.Debug|Win32.Build.0 = Debug|Win32 - {0E9791DB-593A-465F-98BC-681011311618}.Debug|x64.ActiveCfg = Debug|x64 - {0E9791DB-593A-465F-98BC-681011311618}.Debug|x64.Build.0 = Debug|x64 - {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {0E9791DB-593A-465F-98BC-681011311618}.Release|Win32.ActiveCfg = Release|Win32 - {0E9791DB-593A-465F-98BC-681011311618}.Release|Win32.Build.0 = Release|Win32 - {0E9791DB-593A-465F-98BC-681011311618}.Release|x64.ActiveCfg = Release|x64 - {0E9791DB-593A-465F-98BC-681011311618}.Release|x64.Build.0 = Release|x64 - {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|Win32.ActiveCfg = Debug|Win32 - {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|Win32.Build.0 = Debug|Win32 - {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|x64.ActiveCfg = Debug|x64 - {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|x64.Build.0 = Debug|x64 - {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|Win32.Build.0 = Release|Win32 - {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|x64.ActiveCfg = Release|x64 - {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|x64.Build.0 = Release|x64 - {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|Win32.Build.0 = Release|Win32 - {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|x64.ActiveCfg = Release|x64 - {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|x64.Build.0 = Release|x64 - {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|Win32.ActiveCfg = Release|Win32 - {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|Win32.Build.0 = Release|Win32 - {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|x64.ActiveCfg = Release|x64 - {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|x64.Build.0 = Release|x64 - {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|Win32.ActiveCfg = Debug|Win32 - {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|Win32.Build.0 = Debug|Win32 - {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|x64.ActiveCfg = Debug|x64 - {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|x64.Build.0 = Debug|x64 - {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|Win32.ActiveCfg = Release|Win32 - {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|Win32.Build.0 = Release|Win32 - {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|x64.ActiveCfg = Release|x64 - {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|x64.Build.0 = Release|x64 - {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|Win32.ActiveCfg = Debug|Win32 - {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|Win32.Build.0 = Debug|Win32 - {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|x64.ActiveCfg = Debug|x64 - {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|x64.Build.0 = Debug|x64 - {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|Win32.ActiveCfg = Release|Win32 - {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|Win32.Build.0 = Release|Win32 - {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|x64.ActiveCfg = Release|x64 - {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|x64.Build.0 = Release|x64 - {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|Win32.ActiveCfg = Debug|Win32 - {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|Win32.Build.0 = Debug|Win32 - {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|x64.ActiveCfg = Debug|x64 - {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|x64.Build.0 = Debug|x64 - {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|Win32.ActiveCfg = Release|Win32 - {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|Win32.Build.0 = Release|Win32 - {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|x64.ActiveCfg = Release|x64 - {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|x64.Build.0 = Release|x64 - {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|Win32.ActiveCfg = Debug|Win32 - {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|Win32.Build.0 = Debug|Win32 - {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|x64.ActiveCfg = Debug|x64 - {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|x64.Build.0 = Debug|x64 - {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {13CECB97-4119-4316-9D42-8534019A5A44}.Release|Win32.ActiveCfg = Release|Win32 - {13CECB97-4119-4316-9D42-8534019A5A44}.Release|Win32.Build.0 = Release|Win32 - {13CECB97-4119-4316-9D42-8534019A5A44}.Release|x64.ActiveCfg = Release|x64 - {13CECB97-4119-4316-9D42-8534019A5A44}.Release|x64.Build.0 = Release|x64 - {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|Win32.ActiveCfg = Debug|Win32 - {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|Win32.Build.0 = Debug|Win32 - {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|x64.ActiveCfg = Debug|x64 - {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|x64.Build.0 = Debug|x64 - {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|Win32.ActiveCfg = Release|Win32 - {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|Win32.Build.0 = Release|Win32 - {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|x64.ActiveCfg = Release|x64 - {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|x64.Build.0 = Release|x64 - {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|Win32.ActiveCfg = Debug|Win32 - {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|Win32.Build.0 = Debug|Win32 - {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|x64.ActiveCfg = Debug|x64 - {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|x64.Build.0 = Debug|x64 - {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|Win32.ActiveCfg = Release|Win32 - {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|Win32.Build.0 = Release|Win32 - {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|x64.ActiveCfg = Release|x64 - {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|x64.Build.0 = Release|x64 - {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Debug|Win32.ActiveCfg = Debug|Win32 - {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Debug|Win32.Build.0 = Debug|Win32 - {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Debug|x64.ActiveCfg = Debug|x64 - {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Debug|x64.Build.0 = Debug|x64 - {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGInstrument|Win32.Build.0 = Release|Win32 - {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGInstrument|x64.ActiveCfg = Release|x64 - {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGInstrument|x64.Build.0 = Release|x64 - {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGUpdate|Win32.Build.0 = Release|Win32 - {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGUpdate|x64.ActiveCfg = Release|x64 - {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGUpdate|x64.Build.0 = Release|x64 - {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Release|Win32.ActiveCfg = Release|Win32 - {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Release|Win32.Build.0 = Release|Win32 - {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Release|x64.ActiveCfg = Release|x64 - {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Release|x64.Build.0 = Release|x64 - {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Debug|Win32.ActiveCfg = Debug|Win32 - {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Debug|Win32.Build.0 = Debug|Win32 - {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Debug|x64.ActiveCfg = Debug|x64 - {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Debug|x64.Build.0 = Debug|x64 - {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Release|Win32.ActiveCfg = Release|Win32 - {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Release|Win32.Build.0 = Release|Win32 - {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Release|x64.ActiveCfg = Release|x64 - {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Release|x64.Build.0 = Release|x64 - {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|Win32.ActiveCfg = Debug|Win32 - {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|Win32.Build.0 = Debug|Win32 - {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|x64.ActiveCfg = Debug|x64 - {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|x64.Build.0 = Debug|x64 - {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|Win32.ActiveCfg = Release|Win32 - {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|Win32.Build.0 = Release|Win32 - {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|x64.ActiveCfg = Release|x64 - {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|x64.Build.0 = Release|x64 - {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|Win32.ActiveCfg = Debug|Win32 - {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|Win32.Build.0 = Debug|Win32 - {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|x64.ActiveCfg = Debug|x64 - {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|x64.Build.0 = Debug|x64 - {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|Win32.ActiveCfg = Release|Win32 - {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|Win32.Build.0 = Release|Win32 - {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|x64.ActiveCfg = Release|x64 - {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|x64.Build.0 = Release|x64 - {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32 - {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|Win32.Build.0 = Debug|Win32 - {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|x64.ActiveCfg = Debug|x64 - {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|x64.Build.0 = Debug|x64 - {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32 - {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|Win32.Build.0 = Release|Win32 - {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|x64.ActiveCfg = Release|x64 - {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|x64.Build.0 = Release|x64 - {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|Win32.ActiveCfg = Debug|Win32 - {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|Win32.Build.0 = Debug|Win32 - {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|x64.ActiveCfg = Debug|x64 - {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|x64.Build.0 = Debug|x64 - {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|Win32.ActiveCfg = Release|Win32 - {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|Win32.Build.0 = Release|Win32 - {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|x64.ActiveCfg = Release|x64 - {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|x64.Build.0 = Release|x64 - {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|Win32.ActiveCfg = Debug|Win32 - {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|Win32.Build.0 = Debug|Win32 - {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|x64.ActiveCfg = Debug|x64 - {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|x64.Build.0 = Debug|x64 - {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|Win32.ActiveCfg = Release|Win32 - {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|Win32.Build.0 = Release|Win32 - {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|x64.ActiveCfg = Release|x64 - {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|x64.Build.0 = Release|x64 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|Win32.ActiveCfg = Debug|Win32 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|x64.ActiveCfg = Release|x64 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|x64.ActiveCfg = Release|x64 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|x64.ActiveCfg = Release|x64 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|Win32.ActiveCfg = Release|Win32 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|x64.ActiveCfg = Release|x64 - {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|Win32.ActiveCfg = Debug|Win32 - {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|Win32.Build.0 = Debug|Win32 - {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|x64.ActiveCfg = Debug|x64 - {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|x64.Build.0 = Debug|x64 - {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|Win32.ActiveCfg = Release|Win32 - {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|Win32.Build.0 = Release|Win32 - {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|x64.ActiveCfg = Release|x64 - {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|x64.Build.0 = Release|x64 - {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|Win32.ActiveCfg = Debug|Win32 - {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|Win32.Build.0 = Debug|Win32 - {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|x64.ActiveCfg = Debug|x64 - {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|x64.Build.0 = Debug|x64 - {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|Win32.ActiveCfg = Release|Win32 - {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|Win32.Build.0 = Release|Win32 - {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|x64.ActiveCfg = Release|x64 - {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|x64.Build.0 = Release|x64 - {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|Win32.ActiveCfg = Debug|Win32 - {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|Win32.Build.0 = Debug|Win32 - {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|x64.ActiveCfg = Debug|x64 - {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|x64.Build.0 = Debug|x64 - {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {9E48B300-37D1-11DD-8C41-005056C00008}.Release|Win32.ActiveCfg = Release|Win32 - {9E48B300-37D1-11DD-8C41-005056C00008}.Release|Win32.Build.0 = Release|Win32 - {9E48B300-37D1-11DD-8C41-005056C00008}.Release|x64.ActiveCfg = Release|x64 - {9E48B300-37D1-11DD-8C41-005056C00008}.Release|x64.Build.0 = Release|x64 - {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|Win32.ActiveCfg = Debug|Win32 - {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|Win32.Build.0 = Debug|Win32 - {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|x64.ActiveCfg = Debug|x64 - {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|x64.Build.0 = Debug|x64 - {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|Win32.ActiveCfg = Debug|Win32 - {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|Win32.Build.0 = Debug|Win32 - {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|x64.ActiveCfg = Debug|x64 - {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|x64.Build.0 = Debug|x64 - {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|Win32.ActiveCfg = Debug|Win32 - {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|Win32.Build.0 = Debug|Win32 - {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|x64.ActiveCfg = Debug|x64 - {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|x64.Build.0 = Debug|x64 - {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|Win32.ActiveCfg = Release|Win32 - {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|Win32.Build.0 = Release|Win32 - {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|x64.ActiveCfg = Release|x64 - {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|x64.Build.0 = Release|x64 - {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|Win32.ActiveCfg = Release|Win32 - {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|x64.ActiveCfg = Release|x64 - {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|x64.ActiveCfg = Release|x64 - {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|x64.Build.0 = Release|x64 - {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|Win32.ActiveCfg = Release|Win32 - {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|Win32.Build.0 = Release|Win32 - {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|x64.ActiveCfg = Release|x64 - {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|x64.Build.0 = Release|x64 - {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|Win32.ActiveCfg = Debug|Win32 - {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|Win32.Build.0 = Debug|Win32 - {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|x64.ActiveCfg = Debug|x64 - {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|x64.Build.0 = Debug|x64 - {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|Win32.Build.0 = Release|Win32 - {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|x64.ActiveCfg = Release|x64 - {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|x64.Build.0 = Release|x64 - {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|Win32.Build.0 = Release|Win32 - {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|x64.ActiveCfg = Release|x64 - {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|x64.Build.0 = Release|x64 - {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|Win32.ActiveCfg = Release|Win32 - {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|Win32.Build.0 = Release|Win32 - {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|x64.ActiveCfg = Release|x64 - {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|x64.Build.0 = Release|x64 - {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|Win32.ActiveCfg = Debug|Win32 - {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|Win32.Build.0 = Debug|Win32 - {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|x64.ActiveCfg = Debug|x64 - {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|x64.Build.0 = Debug|x64 - {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|Win32.Build.0 = Release|Win32 - {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|x64.ActiveCfg = Release|x64 - {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|x64.Build.0 = Release|x64 - {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|Win32.Build.0 = Release|Win32 - {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|x64.ActiveCfg = Release|x64 - {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|x64.Build.0 = Release|x64 - {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|Win32.ActiveCfg = Release|Win32 - {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|Win32.Build.0 = Release|Win32 - {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|x64.ActiveCfg = Release|x64 - {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|x64.Build.0 = Release|x64 - {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|Win32.ActiveCfg = Debug|Win32 - {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|Win32.Build.0 = Debug|Win32 - {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|x64.ActiveCfg = Debug|x64 - {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|x64.Build.0 = Debug|x64 - {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|Win32.Build.0 = Release|Win32 - {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|x64.ActiveCfg = Release|x64 - {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|x64.Build.0 = Release|x64 - {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|Win32.Build.0 = Release|Win32 - {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|x64.ActiveCfg = Release|x64 - {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|x64.Build.0 = Release|x64 - {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|Win32.ActiveCfg = Release|Win32 - {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|Win32.Build.0 = Release|Win32 - {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|x64.ActiveCfg = Release|x64 - {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|x64.Build.0 = Release|x64 - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|Win32.ActiveCfg = Debug|Win32 - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|x64.ActiveCfg = Debug|x64 - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|x64.ActiveCfg = Release|Win32 - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGUpdate|x64.ActiveCfg = Release|Win32 - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|Win32.ActiveCfg = Release|Win32 - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|Win32.Build.0 = Release|Win32 - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|x64.ActiveCfg = Release|x64 - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|x64.Build.0 = Release|x64 - {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|Win32.ActiveCfg = Debug|Win32 - {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|Win32.Build.0 = Debug|Win32 - {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|x64.ActiveCfg = Debug|x64 - {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|x64.Build.0 = Debug|x64 - {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|Win32.ActiveCfg = Release|Win32 - {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|Win32.Build.0 = Release|Win32 - {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|x64.ActiveCfg = Release|x64 - {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|x64.Build.0 = Release|x64 - {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Debug|Win32.ActiveCfg = Debug|Win32 - {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Debug|Win32.Build.0 = Debug|Win32 - {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Debug|x64.ActiveCfg = Debug|x64 - {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Debug|x64.Build.0 = Debug|x64 - {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGInstrument|x64.ActiveCfg = Release|x64 - {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGUpdate|Win32.Build.0 = Release|Win32 - {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGUpdate|x64.ActiveCfg = Release|x64 - {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGUpdate|x64.Build.0 = Release|x64 - {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Release|Win32.ActiveCfg = Release|Win32 - {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Release|Win32.Build.0 = Release|Win32 - {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Release|x64.ActiveCfg = Release|x64 - {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Release|x64.Build.0 = Release|x64 - {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Debug|Win32.ActiveCfg = Debug|Win32 - {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Debug|Win32.Build.0 = Debug|Win32 - {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Debug|x64.ActiveCfg = Debug|x64 - {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Debug|x64.Build.0 = Debug|x64 - {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGInstrument|x64.ActiveCfg = Release|x64 - {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGUpdate|Win32.Build.0 = Release|Win32 - {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGUpdate|x64.ActiveCfg = Release|x64 - {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGUpdate|x64.Build.0 = Release|x64 - {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Release|Win32.ActiveCfg = Release|Win32 - {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Release|Win32.Build.0 = Release|Win32 - {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Release|x64.ActiveCfg = Release|x64 - {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Release|x64.Build.0 = Release|x64 - {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.Debug|Win32.ActiveCfg = Debug|Win32 - {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.Debug|Win32.Build.0 = Debug|Win32 - {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.Debug|x64.ActiveCfg = Debug|x64 - {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.Debug|x64.Build.0 = Debug|x64 - {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.PGInstrument|Win32.Build.0 = Release|Win32 - {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.PGInstrument|x64.ActiveCfg = Release|x64 - {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.PGInstrument|x64.Build.0 = Release|x64 - {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.PGUpdate|Win32.Build.0 = Release|Win32 - {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.PGUpdate|x64.ActiveCfg = Release|x64 - {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.PGUpdate|x64.Build.0 = Release|x64 - {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.Release|Win32.ActiveCfg = Release|Win32 - {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.Release|Win32.Build.0 = Release|Win32 - {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.Release|x64.ActiveCfg = Release|x64 - {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.Release|x64.Build.0 = Release|x64 - {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.Debug|Win32.ActiveCfg = Debug|Win32 - {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.Debug|Win32.Build.0 = Debug|Win32 - {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.Debug|x64.ActiveCfg = Debug|x64 - {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.Debug|x64.Build.0 = Debug|x64 - {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.PGInstrument|Win32.Build.0 = Release|Win32 - {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.PGInstrument|x64.ActiveCfg = Release|x64 - {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.PGInstrument|x64.Build.0 = Release|x64 - {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.PGUpdate|Win32.Build.0 = Release|Win32 - {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.PGUpdate|x64.ActiveCfg = Release|x64 - {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.PGUpdate|x64.Build.0 = Release|x64 - {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.Release|Win32.ActiveCfg = Release|Win32 - {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.Release|Win32.Build.0 = Release|Win32 - {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.Release|x64.ActiveCfg = Release|x64 - {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.Release|x64.Build.0 = Release|x64 - {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.Debug|Win32.ActiveCfg = Debug|Win32 - {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.Debug|Win32.Build.0 = Debug|Win32 - {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.Debug|x64.ActiveCfg = Debug|x64 - {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.Debug|x64.Build.0 = Debug|x64 - {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.PGInstrument|Win32.Build.0 = Release|Win32 - {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.PGInstrument|x64.ActiveCfg = Release|x64 - {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.PGInstrument|x64.Build.0 = Release|x64 - {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.PGUpdate|Win32.Build.0 = Release|Win32 - {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.PGUpdate|x64.ActiveCfg = Release|x64 - {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.PGUpdate|x64.Build.0 = Release|x64 - {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.Release|Win32.ActiveCfg = Release|Win32 - {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.Release|Win32.Build.0 = Release|Win32 - {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.Release|x64.ActiveCfg = Release|x64 - {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.Release|x64.Build.0 = Release|x64 - {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Debug|Win32.ActiveCfg = Debug|Win32 - {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Debug|Win32.Build.0 = Debug|Win32 - {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Debug|x64.ActiveCfg = Debug|x64 - {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Debug|x64.Build.0 = Debug|x64 - {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGInstrument|Win32.Build.0 = Release|Win32 - {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGInstrument|x64.ActiveCfg = Release|x64 - {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGInstrument|x64.Build.0 = Release|x64 - {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGUpdate|Win32.Build.0 = Release|Win32 - {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGUpdate|x64.ActiveCfg = Release|x64 - {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGUpdate|x64.Build.0 = Release|x64 - {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Release|Win32.ActiveCfg = Release|Win32 - {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Release|Win32.Build.0 = Release|Win32 - {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Release|x64.ActiveCfg = Release|x64 - {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Release|x64.Build.0 = Release|x64 - {10615B24-73BF-4EFA-93AA-236916321317}.Debug|Win32.ActiveCfg = Debug|Win32 - {10615B24-73BF-4EFA-93AA-236916321317}.Debug|Win32.Build.0 = Debug|Win32 - {10615B24-73BF-4EFA-93AA-236916321317}.Debug|x64.ActiveCfg = Debug|x64 - {10615B24-73BF-4EFA-93AA-236916321317}.Debug|x64.Build.0 = Debug|x64 - {10615B24-73BF-4EFA-93AA-236916321317}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {10615B24-73BF-4EFA-93AA-236916321317}.PGInstrument|Win32.Build.0 = Release|Win32 - {10615B24-73BF-4EFA-93AA-236916321317}.PGInstrument|x64.ActiveCfg = Release|x64 - {10615B24-73BF-4EFA-93AA-236916321317}.PGInstrument|x64.Build.0 = Release|x64 - {10615B24-73BF-4EFA-93AA-236916321317}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {10615B24-73BF-4EFA-93AA-236916321317}.PGUpdate|Win32.Build.0 = Release|Win32 - {10615B24-73BF-4EFA-93AA-236916321317}.PGUpdate|x64.ActiveCfg = Release|x64 - {10615B24-73BF-4EFA-93AA-236916321317}.PGUpdate|x64.Build.0 = Release|x64 - {10615B24-73BF-4EFA-93AA-236916321317}.Release|Win32.ActiveCfg = Release|Win32 - {10615B24-73BF-4EFA-93AA-236916321317}.Release|Win32.Build.0 = Release|Win32 - {10615B24-73BF-4EFA-93AA-236916321317}.Release|x64.ActiveCfg = Release|x64 - {10615B24-73BF-4EFA-93AA-236916321317}.Release|x64.Build.0 = Release|x64 - {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Debug|Win32.ActiveCfg = Debug|Win32 - {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Debug|Win32.Build.0 = Debug|Win32 - {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Debug|x64.ActiveCfg = Debug|x64 - {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Debug|x64.Build.0 = Debug|x64 - {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|Win32.ActiveCfg = Release|Win32 - {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|Win32.Build.0 = Release|Win32 - {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|x64.ActiveCfg = Release|x64 - {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|x64.Build.0 = Release|x64 - {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Debug|Win32.ActiveCfg = Debug|Win32 - {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Debug|Win32.Build.0 = Debug|Win32 - {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Debug|x64.ActiveCfg = Debug|x64 - {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Debug|x64.Build.0 = Debug|x64 - {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGInstrument|Win32.Build.0 = Release|Win32 - {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGInstrument|x64.ActiveCfg = Release|x64 - {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGInstrument|x64.Build.0 = Release|x64 - {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGUpdate|Win32.Build.0 = Release|Win32 - {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGUpdate|x64.ActiveCfg = Release|x64 - {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGUpdate|x64.Build.0 = Release|x64 - {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|Win32.ActiveCfg = Release|Win32 - {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|Win32.Build.0 = Release|Win32 - {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|x64.ActiveCfg = Release|x64 - {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|x64.Build.0 = Release|x64 - {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|Win32.ActiveCfg = Debug|Win32 - {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|Win32.Build.0 = Debug|Win32 - {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|x64.ActiveCfg = Debug|x64 - {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|x64.Build.0 = Debug|x64 - {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {384C224A-7474-476E-A01B-750EA7DE918C}.Release|Win32.ActiveCfg = Release|Win32 - {384C224A-7474-476E-A01B-750EA7DE918C}.Release|Win32.Build.0 = Release|Win32 - {384C224A-7474-476E-A01B-750EA7DE918C}.Release|x64.ActiveCfg = Release|x64 - {384C224A-7474-476E-A01B-750EA7DE918C}.Release|x64.Build.0 = Release|x64 - {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|Win32.ActiveCfg = Debug|Win32 - {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|Win32.Build.0 = Debug|Win32 - {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|x64.ActiveCfg = Debug|x64 - {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|x64.Build.0 = Debug|x64 - {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 - {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 - {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|x64.Build.0 = PGInstrument|x64 - {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 - {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 - {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|x64.Build.0 = PGUpdate|x64 - {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|Win32.ActiveCfg = Release|Win32 - {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|Win32.Build.0 = Release|Win32 - {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|x64.ActiveCfg = Release|x64 - {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25123.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{553EC33E-9816-4996-A660-5D6186A0B0B3}" + ProjectSection(SolutionItems) = preProject + ..\Modules\getbuildinfo.c = ..\Modules\getbuildinfo.c + readme.txt = readme.txt + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "python", "python.vcxproj", "{B11D750F-CD1F-4A96-85CE-E69A5C5259F9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pythoncore", "pythoncore.vcxproj", "{CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pythonw", "pythonw.vcxproj", "{F4229CC3-873C-49AE-9729-DD308ED4CD4A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winsound", "winsound.vcxproj", "{28B5D777-DDF2-4B6B-B34F-31D938813856}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_decimal", "_decimal.vcxproj", "{0E9791DB-593A-465F-98BC-681011311617}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ctypes", "_ctypes.vcxproj", "{0E9791DB-593A-465F-98BC-681011311618}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ctypes_test", "_ctypes_test.vcxproj", "{9EC7190A-249F-4180-A900-548FDCF3055F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_elementtree", "_elementtree.vcxproj", "{17E1E049-C309-4D79-843F-AE483C264AEA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_msi", "_msi.vcxproj", "{31FFC478-7B4A-43E8-9954-8D03E2187E9C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_socket", "_socket.vcxproj", "{86937F53-C189-40EF-8CE8-8759D8E7D480}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_sqlite3", "_sqlite3.vcxproj", "{13CECB97-4119-4316-9D42-8534019A5A44}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ssl", "_ssl.vcxproj", "{C6E20F84-3247-4AD6-B051-B073268F73BA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testcapi", "_testcapi.vcxproj", "{6901D91C-6E48-4BB7-9FEC-700C8131DF1D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testimportmultiple", "_testimportmultiple.vcxproj", "{36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_tkinter", "_tkinter.vcxproj", "{4946ECAC-2E69-4BF8-A90A-F5136F5094DF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_bz2", "_bz2.vcxproj", "{73FCD2BD-F133-46B7-8EC1-144CD82A59D5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "select", "select.vcxproj", "{18CAE28C-B454-46C1-87A0-493D91D97F03}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_lzma", "_lzma.vcxproj", "{F9D71780-F393-11E0-BE50-0800200C9A66}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unicodedata", "unicodedata.vcxproj", "{ECC7CEAC-A5E5-458E-BB9E-2413CC847881}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pyexpat", "pyexpat.vcxproj", "{D06B6426-4762-44CC-8BAD-D79052507F2F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bdist_wininst", "..\PC\bdist_wininst\bdist_wininst.vcxproj", "{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_hashlib", "_hashlib.vcxproj", "{447F05A8-F581-4CAC-A466-5AC7936E207E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sqlite3", "sqlite3.vcxproj", "{A1A295E5-463C-437F-81CA-1F32367685DA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_multiprocessing", "_multiprocessing.vcxproj", "{9E48B300-37D1-11DD-8C41-005056C00008}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "python3dll", "python3dll.vcxproj", "{885D4898-D08D-4091-9C40-C700CFE3FC5A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xxlimited", "xxlimited.vcxproj", "{F749B822-B489-4CA5-A3AD-CE078F5F338A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testbuffer", "_testbuffer.vcxproj", "{A2697BD3-28C1-4AEC-9106-8B748639FD16}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pylauncher", "pylauncher.vcxproj", "{7B2727B5-5A3F-40EE-A866-43A13CD31446}" + ProjectSection(ProjectDependencies) = postProject + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782} = {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pywlauncher", "pywlauncher.vcxproj", "{1D4B18D3-7C12-4ECB-9179-8531FF876CE6}" + ProjectSection(ProjectDependencies) = postProject + {7B2727B5-5A3F-40EE-A866-43A13CD31446} = {7B2727B5-5A3F-40EE-A866-43A13CD31446} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_freeze_importlib", "_freeze_importlib.vcxproj", "{19C0C13F-47CA-4432-AFF3-799A296A4DDC}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_overlapped", "_overlapped.vcxproj", "{EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testembed", "_testembed.vcxproj", "{6DAC66D9-E703-4624-BE03-49112AB5AA62}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testmultiphase", "_testmultiphase.vcxproj", "{16BFE6F0-22EF-40B5-B831-7E937119EF10}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tcl", "tcl.vcxproj", "{B5FD6F1D-129E-4BFF-9340-03606FAC7283}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tix", "tix.vcxproj", "{C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tk", "tk.vcxproj", "{7E85ECCF-A72C-4DA4-9E52-884508E80BA1}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libeay", "libeay.vcxproj", "{E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ssleay", "ssleay.vcxproj", "{10615B24-73BF-4EFA-93AA-236916321317}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pyshellext", "pyshellext.vcxproj", "{0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testconsole", "_testconsole.vcxproj", "{B244E787-C445-441C-BDF4-5A4F1A3A1E51}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_asyncio", "_asyncio.vcxproj", "{384C224A-7474-476E-A01B-750EA7DE918C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liblzma", "liblzma.vcxproj", "{12728250-16EC-4DC6-94D7-E21DD88947F8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + PGInstrument|Win32 = PGInstrument|Win32 + PGInstrument|x64 = PGInstrument|x64 + PGUpdate|Win32 = PGUpdate|Win32 + PGUpdate|x64 = PGUpdate|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|Win32.ActiveCfg = Debug|Win32 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|Win32.Build.0 = Debug|Win32 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|x64.ActiveCfg = Debug|x64 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|x64.Build.0 = Debug|x64 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|Win32.ActiveCfg = Release|Win32 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|Win32.Build.0 = Release|Win32 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|x64.ActiveCfg = Release|x64 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|x64.Build.0 = Release|x64 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|Win32.ActiveCfg = Debug|Win32 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|Win32.Build.0 = Debug|Win32 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|x64.ActiveCfg = Debug|x64 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Debug|x64.Build.0 = Debug|x64 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|Win32.ActiveCfg = Release|Win32 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|Win32.Build.0 = Release|Win32 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|x64.ActiveCfg = Release|x64 + {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}.Release|x64.Build.0 = Release|x64 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|Win32.ActiveCfg = Debug|Win32 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|Win32.Build.0 = Debug|Win32 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|x64.ActiveCfg = Debug|x64 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Debug|x64.Build.0 = Debug|x64 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|Win32.ActiveCfg = Release|Win32 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|Win32.Build.0 = Release|Win32 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|x64.ActiveCfg = Release|x64 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGInstrument|x64.Build.0 = Release|x64 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|Win32.ActiveCfg = Release|Win32 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|Win32.Build.0 = Release|Win32 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|x64.ActiveCfg = Release|x64 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.PGUpdate|x64.Build.0 = Release|x64 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|Win32.ActiveCfg = Release|Win32 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|Win32.Build.0 = Release|Win32 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|x64.ActiveCfg = Release|x64 + {F4229CC3-873C-49AE-9729-DD308ED4CD4A}.Release|x64.Build.0 = Release|x64 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|Win32.ActiveCfg = Debug|Win32 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|Win32.Build.0 = Debug|Win32 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|x64.ActiveCfg = Debug|x64 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.Debug|x64.Build.0 = Debug|x64 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|Win32.ActiveCfg = Release|Win32 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|Win32.Build.0 = Release|Win32 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|x64.ActiveCfg = Release|x64 + {28B5D777-DDF2-4B6B-B34F-31D938813856}.Release|x64.Build.0 = Release|x64 + {0E9791DB-593A-465F-98BC-681011311617}.Debug|Win32.ActiveCfg = Debug|Win32 + {0E9791DB-593A-465F-98BC-681011311617}.Debug|Win32.Build.0 = Debug|Win32 + {0E9791DB-593A-465F-98BC-681011311617}.Debug|x64.ActiveCfg = Debug|x64 + {0E9791DB-593A-465F-98BC-681011311617}.Debug|x64.Build.0 = Debug|x64 + {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {0E9791DB-593A-465F-98BC-681011311617}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {0E9791DB-593A-465F-98BC-681011311617}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {0E9791DB-593A-465F-98BC-681011311617}.Release|Win32.ActiveCfg = Release|Win32 + {0E9791DB-593A-465F-98BC-681011311617}.Release|Win32.Build.0 = Release|Win32 + {0E9791DB-593A-465F-98BC-681011311617}.Release|x64.ActiveCfg = Release|x64 + {0E9791DB-593A-465F-98BC-681011311617}.Release|x64.Build.0 = Release|x64 + {0E9791DB-593A-465F-98BC-681011311618}.Debug|Win32.ActiveCfg = Debug|Win32 + {0E9791DB-593A-465F-98BC-681011311618}.Debug|Win32.Build.0 = Debug|Win32 + {0E9791DB-593A-465F-98BC-681011311618}.Debug|x64.ActiveCfg = Debug|x64 + {0E9791DB-593A-465F-98BC-681011311618}.Debug|x64.Build.0 = Debug|x64 + {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {0E9791DB-593A-465F-98BC-681011311618}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {0E9791DB-593A-465F-98BC-681011311618}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {0E9791DB-593A-465F-98BC-681011311618}.Release|Win32.ActiveCfg = Release|Win32 + {0E9791DB-593A-465F-98BC-681011311618}.Release|Win32.Build.0 = Release|Win32 + {0E9791DB-593A-465F-98BC-681011311618}.Release|x64.ActiveCfg = Release|x64 + {0E9791DB-593A-465F-98BC-681011311618}.Release|x64.Build.0 = Release|x64 + {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|Win32.ActiveCfg = Debug|Win32 + {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|Win32.Build.0 = Debug|Win32 + {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|x64.ActiveCfg = Debug|x64 + {9EC7190A-249F-4180-A900-548FDCF3055F}.Debug|x64.Build.0 = Debug|x64 + {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|Win32.ActiveCfg = Release|Win32 + {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|Win32.Build.0 = Release|Win32 + {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|x64.ActiveCfg = Release|x64 + {9EC7190A-249F-4180-A900-548FDCF3055F}.PGInstrument|x64.Build.0 = Release|x64 + {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|Win32.ActiveCfg = Release|Win32 + {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|Win32.Build.0 = Release|Win32 + {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|x64.ActiveCfg = Release|x64 + {9EC7190A-249F-4180-A900-548FDCF3055F}.PGUpdate|x64.Build.0 = Release|x64 + {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|Win32.ActiveCfg = Release|Win32 + {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|Win32.Build.0 = Release|Win32 + {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|x64.ActiveCfg = Release|x64 + {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|x64.Build.0 = Release|x64 + {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|Win32.ActiveCfg = Debug|Win32 + {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|Win32.Build.0 = Debug|Win32 + {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|x64.ActiveCfg = Debug|x64 + {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|x64.Build.0 = Debug|x64 + {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|Win32.ActiveCfg = Release|Win32 + {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|Win32.Build.0 = Release|Win32 + {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|x64.ActiveCfg = Release|x64 + {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|x64.Build.0 = Release|x64 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|Win32.ActiveCfg = Debug|Win32 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|Win32.Build.0 = Debug|Win32 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|x64.ActiveCfg = Debug|x64 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|x64.Build.0 = Debug|x64 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|Win32.ActiveCfg = Release|Win32 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|Win32.Build.0 = Release|Win32 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|x64.ActiveCfg = Release|x64 + {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Release|x64.Build.0 = Release|x64 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|Win32.ActiveCfg = Debug|Win32 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|Win32.Build.0 = Debug|Win32 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|x64.ActiveCfg = Debug|x64 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.Debug|x64.Build.0 = Debug|x64 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|Win32.ActiveCfg = Release|Win32 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|Win32.Build.0 = Release|Win32 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|x64.ActiveCfg = Release|x64 + {86937F53-C189-40EF-8CE8-8759D8E7D480}.Release|x64.Build.0 = Release|x64 + {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|Win32.ActiveCfg = Debug|Win32 + {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|Win32.Build.0 = Debug|Win32 + {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|x64.ActiveCfg = Debug|x64 + {13CECB97-4119-4316-9D42-8534019A5A44}.Debug|x64.Build.0 = Debug|x64 + {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {13CECB97-4119-4316-9D42-8534019A5A44}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {13CECB97-4119-4316-9D42-8534019A5A44}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {13CECB97-4119-4316-9D42-8534019A5A44}.Release|Win32.ActiveCfg = Release|Win32 + {13CECB97-4119-4316-9D42-8534019A5A44}.Release|Win32.Build.0 = Release|Win32 + {13CECB97-4119-4316-9D42-8534019A5A44}.Release|x64.ActiveCfg = Release|x64 + {13CECB97-4119-4316-9D42-8534019A5A44}.Release|x64.Build.0 = Release|x64 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|Win32.ActiveCfg = Debug|Win32 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|Win32.Build.0 = Debug|Win32 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|x64.ActiveCfg = Debug|x64 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.Debug|x64.Build.0 = Debug|x64 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|Win32.ActiveCfg = Release|Win32 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|Win32.Build.0 = Release|Win32 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|x64.ActiveCfg = Release|x64 + {C6E20F84-3247-4AD6-B051-B073268F73BA}.Release|x64.Build.0 = Release|x64 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|Win32.ActiveCfg = Debug|Win32 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|Win32.Build.0 = Debug|Win32 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|x64.ActiveCfg = Debug|x64 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Debug|x64.Build.0 = Debug|x64 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|Win32.ActiveCfg = Release|Win32 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|Win32.Build.0 = Release|Win32 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|x64.ActiveCfg = Release|x64 + {6901D91C-6E48-4BB7-9FEC-700C8131DF1D}.Release|x64.Build.0 = Release|x64 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Debug|Win32.ActiveCfg = Debug|Win32 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Debug|Win32.Build.0 = Debug|Win32 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Debug|x64.ActiveCfg = Debug|x64 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Debug|x64.Build.0 = Debug|x64 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGInstrument|Win32.ActiveCfg = Release|Win32 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGInstrument|Win32.Build.0 = Release|Win32 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGInstrument|x64.ActiveCfg = Release|x64 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGInstrument|x64.Build.0 = Release|x64 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGUpdate|Win32.ActiveCfg = Release|Win32 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGUpdate|Win32.Build.0 = Release|Win32 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGUpdate|x64.ActiveCfg = Release|x64 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.PGUpdate|x64.Build.0 = Release|x64 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Release|Win32.ActiveCfg = Release|Win32 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Release|Win32.Build.0 = Release|Win32 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Release|x64.ActiveCfg = Release|x64 + {36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}.Release|x64.Build.0 = Release|x64 + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Debug|Win32.ActiveCfg = Debug|Win32 + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Debug|Win32.Build.0 = Debug|Win32 + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Debug|x64.ActiveCfg = Debug|x64 + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Debug|x64.Build.0 = Debug|x64 + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Release|Win32.ActiveCfg = Release|Win32 + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Release|Win32.Build.0 = Release|Win32 + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Release|x64.ActiveCfg = Release|x64 + {4946ECAC-2E69-4BF8-A90A-F5136F5094DF}.Release|x64.Build.0 = Release|x64 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|Win32.ActiveCfg = Debug|Win32 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|Win32.Build.0 = Debug|Win32 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|x64.ActiveCfg = Debug|x64 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Debug|x64.Build.0 = Debug|x64 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|Win32.ActiveCfg = Release|Win32 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|Win32.Build.0 = Release|Win32 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|x64.ActiveCfg = Release|x64 + {73FCD2BD-F133-46B7-8EC1-144CD82A59D5}.Release|x64.Build.0 = Release|x64 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|Win32.ActiveCfg = Debug|Win32 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|Win32.Build.0 = Debug|Win32 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|x64.ActiveCfg = Debug|x64 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.Debug|x64.Build.0 = Debug|x64 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|Win32.ActiveCfg = Release|Win32 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|Win32.Build.0 = Release|Win32 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|x64.ActiveCfg = Release|x64 + {18CAE28C-B454-46C1-87A0-493D91D97F03}.Release|x64.Build.0 = Release|x64 + {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32 + {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|Win32.Build.0 = Debug|Win32 + {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|x64.ActiveCfg = Debug|x64 + {F9D71780-F393-11E0-BE50-0800200C9A66}.Debug|x64.Build.0 = Debug|x64 + {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {F9D71780-F393-11E0-BE50-0800200C9A66}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {F9D71780-F393-11E0-BE50-0800200C9A66}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32 + {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|Win32.Build.0 = Release|Win32 + {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|x64.ActiveCfg = Release|x64 + {F9D71780-F393-11E0-BE50-0800200C9A66}.Release|x64.Build.0 = Release|x64 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|Win32.ActiveCfg = Debug|Win32 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|Win32.Build.0 = Debug|Win32 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|x64.ActiveCfg = Debug|x64 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Debug|x64.Build.0 = Debug|x64 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|Win32.ActiveCfg = Release|Win32 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|Win32.Build.0 = Release|Win32 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|x64.ActiveCfg = Release|x64 + {ECC7CEAC-A5E5-458E-BB9E-2413CC847881}.Release|x64.Build.0 = Release|x64 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|Win32.ActiveCfg = Debug|Win32 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|Win32.Build.0 = Debug|Win32 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|x64.ActiveCfg = Debug|x64 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.Debug|x64.Build.0 = Debug|x64 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|Win32.ActiveCfg = Release|Win32 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|Win32.Build.0 = Release|Win32 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|x64.ActiveCfg = Release|x64 + {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|x64.Build.0 = Release|x64 + {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|Win32.ActiveCfg = Debug|Win32 + {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|x64.ActiveCfg = Release|x64 + {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|Win32.ActiveCfg = Release|Win32 + {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|x64.ActiveCfg = Release|x64 + {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|Win32.ActiveCfg = Release|Win32 + {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|x64.ActiveCfg = Release|x64 + {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|Win32.ActiveCfg = Release|Win32 + {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|x64.ActiveCfg = Release|x64 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|Win32.ActiveCfg = Debug|Win32 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|Win32.Build.0 = Debug|Win32 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|x64.ActiveCfg = Debug|x64 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|x64.Build.0 = Debug|x64 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|Win32.ActiveCfg = Release|Win32 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|Win32.Build.0 = Release|Win32 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|x64.ActiveCfg = Release|x64 + {447F05A8-F581-4CAC-A466-5AC7936E207E}.Release|x64.Build.0 = Release|x64 + {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|Win32.ActiveCfg = Debug|Win32 + {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|Win32.Build.0 = Debug|Win32 + {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|x64.ActiveCfg = Debug|x64 + {A1A295E5-463C-437F-81CA-1F32367685DA}.Debug|x64.Build.0 = Debug|x64 + {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {A1A295E5-463C-437F-81CA-1F32367685DA}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {A1A295E5-463C-437F-81CA-1F32367685DA}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|Win32.ActiveCfg = Release|Win32 + {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|Win32.Build.0 = Release|Win32 + {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|x64.ActiveCfg = Release|x64 + {A1A295E5-463C-437F-81CA-1F32367685DA}.Release|x64.Build.0 = Release|x64 + {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|Win32.ActiveCfg = Debug|Win32 + {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|Win32.Build.0 = Debug|Win32 + {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|x64.ActiveCfg = Debug|x64 + {9E48B300-37D1-11DD-8C41-005056C00008}.Debug|x64.Build.0 = Debug|x64 + {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {9E48B300-37D1-11DD-8C41-005056C00008}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {9E48B300-37D1-11DD-8C41-005056C00008}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {9E48B300-37D1-11DD-8C41-005056C00008}.Release|Win32.ActiveCfg = Release|Win32 + {9E48B300-37D1-11DD-8C41-005056C00008}.Release|Win32.Build.0 = Release|Win32 + {9E48B300-37D1-11DD-8C41-005056C00008}.Release|x64.ActiveCfg = Release|x64 + {9E48B300-37D1-11DD-8C41-005056C00008}.Release|x64.Build.0 = Release|x64 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|Win32.ActiveCfg = Debug|Win32 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|Win32.Build.0 = Debug|Win32 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|x64.ActiveCfg = Debug|x64 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Debug|x64.Build.0 = Debug|x64 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|Win32.ActiveCfg = Debug|Win32 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|Win32.Build.0 = Debug|Win32 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|x64.ActiveCfg = Debug|x64 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGInstrument|x64.Build.0 = Debug|x64 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|Win32.ActiveCfg = Debug|Win32 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|Win32.Build.0 = Debug|Win32 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|x64.ActiveCfg = Debug|x64 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.PGUpdate|x64.Build.0 = Debug|x64 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|Win32.ActiveCfg = Release|Win32 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|Win32.Build.0 = Release|Win32 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|x64.ActiveCfg = Release|x64 + {885D4898-D08D-4091-9C40-C700CFE3FC5A}.Release|x64.Build.0 = Release|x64 + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|Win32.ActiveCfg = Release|Win32 + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Debug|x64.ActiveCfg = Release|x64 + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|x64.ActiveCfg = Release|x64 + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.PGUpdate|x64.Build.0 = Release|x64 + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|Win32.ActiveCfg = Release|Win32 + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|Win32.Build.0 = Release|Win32 + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|x64.ActiveCfg = Release|x64 + {F749B822-B489-4CA5-A3AD-CE078F5F338A}.Release|x64.Build.0 = Release|x64 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|Win32.ActiveCfg = Debug|Win32 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|Win32.Build.0 = Debug|Win32 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|x64.ActiveCfg = Debug|x64 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Debug|x64.Build.0 = Debug|x64 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|Win32.ActiveCfg = Release|Win32 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|Win32.Build.0 = Release|Win32 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|x64.ActiveCfg = Release|x64 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGInstrument|x64.Build.0 = Release|x64 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|Win32.ActiveCfg = Release|Win32 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|Win32.Build.0 = Release|Win32 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|x64.ActiveCfg = Release|x64 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.PGUpdate|x64.Build.0 = Release|x64 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|Win32.ActiveCfg = Release|Win32 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|Win32.Build.0 = Release|Win32 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|x64.ActiveCfg = Release|x64 + {A2697BD3-28C1-4AEC-9106-8B748639FD16}.Release|x64.Build.0 = Release|x64 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|Win32.ActiveCfg = Debug|Win32 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|Win32.Build.0 = Debug|Win32 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|x64.ActiveCfg = Debug|x64 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Debug|x64.Build.0 = Debug|x64 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|Win32.ActiveCfg = Release|Win32 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|Win32.Build.0 = Release|Win32 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|x64.ActiveCfg = Release|x64 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGInstrument|x64.Build.0 = Release|x64 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|Win32.ActiveCfg = Release|Win32 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|Win32.Build.0 = Release|Win32 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|x64.ActiveCfg = Release|x64 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.PGUpdate|x64.Build.0 = Release|x64 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|Win32.ActiveCfg = Release|Win32 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|Win32.Build.0 = Release|Win32 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|x64.ActiveCfg = Release|x64 + {7B2727B5-5A3F-40EE-A866-43A13CD31446}.Release|x64.Build.0 = Release|x64 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|Win32.ActiveCfg = Debug|Win32 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|Win32.Build.0 = Debug|Win32 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|x64.ActiveCfg = Debug|x64 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Debug|x64.Build.0 = Debug|x64 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|Win32.ActiveCfg = Release|Win32 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|Win32.Build.0 = Release|Win32 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|x64.ActiveCfg = Release|x64 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGInstrument|x64.Build.0 = Release|x64 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|Win32.ActiveCfg = Release|Win32 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|Win32.Build.0 = Release|Win32 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|x64.ActiveCfg = Release|x64 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.PGUpdate|x64.Build.0 = Release|x64 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|Win32.ActiveCfg = Release|Win32 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|Win32.Build.0 = Release|Win32 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|x64.ActiveCfg = Release|x64 + {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|x64.Build.0 = Release|x64 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|Win32.ActiveCfg = Debug|Win32 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|x64.ActiveCfg = Debug|x64 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|Win32.ActiveCfg = Release|Win32 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|x64.ActiveCfg = Release|Win32 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGUpdate|Win32.ActiveCfg = Release|Win32 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGUpdate|x64.ActiveCfg = Release|Win32 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|Win32.ActiveCfg = Release|Win32 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|Win32.Build.0 = Release|Win32 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|x64.ActiveCfg = Release|x64 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|x64.Build.0 = Release|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|Win32.ActiveCfg = Debug|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|Win32.Build.0 = Debug|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|x64.ActiveCfg = Debug|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Debug|x64.Build.0 = Debug|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|Win32.ActiveCfg = Release|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|Win32.Build.0 = Release|Win32 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|x64.ActiveCfg = Release|x64 + {EB6E69DD-04BF-4543-9B92-49FAABCEAC2E}.Release|x64.Build.0 = Release|x64 + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Debug|Win32.ActiveCfg = Debug|Win32 + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Debug|Win32.Build.0 = Debug|Win32 + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Debug|x64.ActiveCfg = Debug|x64 + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Debug|x64.Build.0 = Debug|x64 + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGInstrument|Win32.ActiveCfg = Release|Win32 + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGInstrument|x64.ActiveCfg = Release|x64 + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGUpdate|Win32.ActiveCfg = Release|Win32 + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGUpdate|Win32.Build.0 = Release|Win32 + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGUpdate|x64.ActiveCfg = Release|x64 + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.PGUpdate|x64.Build.0 = Release|x64 + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Release|Win32.ActiveCfg = Release|Win32 + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Release|Win32.Build.0 = Release|Win32 + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Release|x64.ActiveCfg = Release|x64 + {6DAC66D9-E703-4624-BE03-49112AB5AA62}.Release|x64.Build.0 = Release|x64 + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Debug|Win32.ActiveCfg = Debug|Win32 + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Debug|Win32.Build.0 = Debug|Win32 + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Debug|x64.ActiveCfg = Debug|x64 + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Debug|x64.Build.0 = Debug|x64 + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGInstrument|Win32.ActiveCfg = Release|Win32 + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGInstrument|x64.ActiveCfg = Release|x64 + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGUpdate|Win32.ActiveCfg = Release|Win32 + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGUpdate|Win32.Build.0 = Release|Win32 + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGUpdate|x64.ActiveCfg = Release|x64 + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.PGUpdate|x64.Build.0 = Release|x64 + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Release|Win32.ActiveCfg = Release|Win32 + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Release|Win32.Build.0 = Release|Win32 + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Release|x64.ActiveCfg = Release|x64 + {16BFE6F0-22EF-40B5-B831-7E937119EF10}.Release|x64.Build.0 = Release|x64 + {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.Debug|Win32.ActiveCfg = Debug|Win32 + {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.Debug|Win32.Build.0 = Debug|Win32 + {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.Debug|x64.ActiveCfg = Debug|x64 + {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.Debug|x64.Build.0 = Debug|x64 + {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.PGInstrument|Win32.ActiveCfg = Release|Win32 + {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.PGInstrument|Win32.Build.0 = Release|Win32 + {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.PGInstrument|x64.ActiveCfg = Release|x64 + {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.PGInstrument|x64.Build.0 = Release|x64 + {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.PGUpdate|Win32.ActiveCfg = Release|Win32 + {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.PGUpdate|Win32.Build.0 = Release|Win32 + {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.PGUpdate|x64.ActiveCfg = Release|x64 + {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.PGUpdate|x64.Build.0 = Release|x64 + {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.Release|Win32.ActiveCfg = Release|Win32 + {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.Release|Win32.Build.0 = Release|Win32 + {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.Release|x64.ActiveCfg = Release|x64 + {B5FD6F1D-129E-4BFF-9340-03606FAC7283}.Release|x64.Build.0 = Release|x64 + {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.Debug|Win32.ActiveCfg = Debug|Win32 + {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.Debug|Win32.Build.0 = Debug|Win32 + {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.Debug|x64.ActiveCfg = Debug|x64 + {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.Debug|x64.Build.0 = Debug|x64 + {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.PGInstrument|Win32.ActiveCfg = Release|Win32 + {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.PGInstrument|Win32.Build.0 = Release|Win32 + {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.PGInstrument|x64.ActiveCfg = Release|x64 + {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.PGInstrument|x64.Build.0 = Release|x64 + {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.PGUpdate|Win32.ActiveCfg = Release|Win32 + {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.PGUpdate|Win32.Build.0 = Release|Win32 + {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.PGUpdate|x64.ActiveCfg = Release|x64 + {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.PGUpdate|x64.Build.0 = Release|x64 + {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.Release|Win32.ActiveCfg = Release|Win32 + {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.Release|Win32.Build.0 = Release|Win32 + {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.Release|x64.ActiveCfg = Release|x64 + {C5A3E7FB-9695-4B2E-960B-1D9F43F1E555}.Release|x64.Build.0 = Release|x64 + {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.Debug|Win32.ActiveCfg = Debug|Win32 + {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.Debug|Win32.Build.0 = Debug|Win32 + {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.Debug|x64.ActiveCfg = Debug|x64 + {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.Debug|x64.Build.0 = Debug|x64 + {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.PGInstrument|Win32.ActiveCfg = Release|Win32 + {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.PGInstrument|Win32.Build.0 = Release|Win32 + {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.PGInstrument|x64.ActiveCfg = Release|x64 + {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.PGInstrument|x64.Build.0 = Release|x64 + {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.PGUpdate|Win32.ActiveCfg = Release|Win32 + {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.PGUpdate|Win32.Build.0 = Release|Win32 + {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.PGUpdate|x64.ActiveCfg = Release|x64 + {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.PGUpdate|x64.Build.0 = Release|x64 + {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.Release|Win32.ActiveCfg = Release|Win32 + {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.Release|Win32.Build.0 = Release|Win32 + {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.Release|x64.ActiveCfg = Release|x64 + {7E85ECCF-A72C-4DA4-9E52-884508E80BA1}.Release|x64.Build.0 = Release|x64 + {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Debug|Win32.ActiveCfg = Debug|Win32 + {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Debug|Win32.Build.0 = Debug|Win32 + {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Debug|x64.ActiveCfg = Debug|x64 + {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Debug|x64.Build.0 = Debug|x64 + {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGInstrument|Win32.ActiveCfg = Release|Win32 + {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGInstrument|Win32.Build.0 = Release|Win32 + {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGInstrument|x64.ActiveCfg = Release|x64 + {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGInstrument|x64.Build.0 = Release|x64 + {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGUpdate|Win32.ActiveCfg = Release|Win32 + {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGUpdate|Win32.Build.0 = Release|Win32 + {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGUpdate|x64.ActiveCfg = Release|x64 + {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.PGUpdate|x64.Build.0 = Release|x64 + {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Release|Win32.ActiveCfg = Release|Win32 + {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Release|Win32.Build.0 = Release|Win32 + {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Release|x64.ActiveCfg = Release|x64 + {E5B04CC0-EB4C-42AB-B4DC-18EF95F864B0}.Release|x64.Build.0 = Release|x64 + {10615B24-73BF-4EFA-93AA-236916321317}.Debug|Win32.ActiveCfg = Debug|Win32 + {10615B24-73BF-4EFA-93AA-236916321317}.Debug|Win32.Build.0 = Debug|Win32 + {10615B24-73BF-4EFA-93AA-236916321317}.Debug|x64.ActiveCfg = Debug|x64 + {10615B24-73BF-4EFA-93AA-236916321317}.Debug|x64.Build.0 = Debug|x64 + {10615B24-73BF-4EFA-93AA-236916321317}.PGInstrument|Win32.ActiveCfg = Release|Win32 + {10615B24-73BF-4EFA-93AA-236916321317}.PGInstrument|Win32.Build.0 = Release|Win32 + {10615B24-73BF-4EFA-93AA-236916321317}.PGInstrument|x64.ActiveCfg = Release|x64 + {10615B24-73BF-4EFA-93AA-236916321317}.PGInstrument|x64.Build.0 = Release|x64 + {10615B24-73BF-4EFA-93AA-236916321317}.PGUpdate|Win32.ActiveCfg = Release|Win32 + {10615B24-73BF-4EFA-93AA-236916321317}.PGUpdate|Win32.Build.0 = Release|Win32 + {10615B24-73BF-4EFA-93AA-236916321317}.PGUpdate|x64.ActiveCfg = Release|x64 + {10615B24-73BF-4EFA-93AA-236916321317}.PGUpdate|x64.Build.0 = Release|x64 + {10615B24-73BF-4EFA-93AA-236916321317}.Release|Win32.ActiveCfg = Release|Win32 + {10615B24-73BF-4EFA-93AA-236916321317}.Release|Win32.Build.0 = Release|Win32 + {10615B24-73BF-4EFA-93AA-236916321317}.Release|x64.ActiveCfg = Release|x64 + {10615B24-73BF-4EFA-93AA-236916321317}.Release|x64.Build.0 = Release|x64 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Debug|Win32.ActiveCfg = Debug|Win32 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Debug|Win32.Build.0 = Debug|Win32 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Debug|x64.ActiveCfg = Debug|x64 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Debug|x64.Build.0 = Debug|x64 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|Win32.ActiveCfg = Release|Win32 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|Win32.Build.0 = Release|Win32 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|x64.ActiveCfg = Release|x64 + {0F6EE4A4-C75F-4578-B4B3-2D64F4B9B782}.Release|x64.Build.0 = Release|x64 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Debug|Win32.ActiveCfg = Debug|Win32 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Debug|Win32.Build.0 = Debug|Win32 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Debug|x64.ActiveCfg = Debug|x64 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Debug|x64.Build.0 = Debug|x64 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGInstrument|Win32.ActiveCfg = Release|Win32 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGInstrument|Win32.Build.0 = Release|Win32 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGInstrument|x64.ActiveCfg = Release|x64 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGInstrument|x64.Build.0 = Release|x64 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGUpdate|Win32.ActiveCfg = Release|Win32 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGUpdate|Win32.Build.0 = Release|Win32 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGUpdate|x64.ActiveCfg = Release|x64 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.PGUpdate|x64.Build.0 = Release|x64 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|Win32.ActiveCfg = Release|Win32 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|Win32.Build.0 = Release|Win32 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|x64.ActiveCfg = Release|x64 + {B244E787-C445-441C-BDF4-5A4F1A3A1E51}.Release|x64.Build.0 = Release|x64 + {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|Win32.ActiveCfg = Debug|Win32 + {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|Win32.Build.0 = Debug|Win32 + {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|x64.ActiveCfg = Debug|x64 + {384C224A-7474-476E-A01B-750EA7DE918C}.Debug|x64.Build.0 = Debug|x64 + {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {384C224A-7474-476E-A01B-750EA7DE918C}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {384C224A-7474-476E-A01B-750EA7DE918C}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {384C224A-7474-476E-A01B-750EA7DE918C}.Release|Win32.ActiveCfg = Release|Win32 + {384C224A-7474-476E-A01B-750EA7DE918C}.Release|Win32.Build.0 = Release|Win32 + {384C224A-7474-476E-A01B-750EA7DE918C}.Release|x64.ActiveCfg = Release|x64 + {384C224A-7474-476E-A01B-750EA7DE918C}.Release|x64.Build.0 = Release|x64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|Win32.ActiveCfg = Debug|Win32 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|Win32.Build.0 = Debug|Win32 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|x64.ActiveCfg = Debug|x64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Debug|x64.Build.0 = Debug|x64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|Win32.ActiveCfg = Release|Win32 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|Win32.Build.0 = Release|Win32 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|x64.ActiveCfg = Release|x64 + {12728250-16EC-4DC6-94D7-E21DD88947F8}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/PCbuild/prepare_ssl.bat b/PCbuild/prepare_ssl.bat index 2f41ae847da5ae..6d9ac87a727076 100644 --- a/PCbuild/prepare_ssl.bat +++ b/PCbuild/prepare_ssl.bat @@ -1,12 +1,12 @@ -@echo off -if not defined HOST_PYTHON ( - if "%1" EQU "Debug" ( - shift - set HOST_PYTHON=python_d.exe - if not exist python36_d.dll exit 1 - ) ELSE ( - set HOST_PYTHON=python.exe - if not exist python36.dll exit 1 - ) -) -%HOST_PYTHON% "%~dp0prepare_ssl.py" %1 +@echo off +if not defined HOST_PYTHON ( + if "%1" EQU "Debug" ( + shift + set HOST_PYTHON=python_d.exe + if not exist python36_d.dll exit 1 + ) ELSE ( + set HOST_PYTHON=python.exe + if not exist python36.dll exit 1 + ) +) +%HOST_PYTHON% "%~dp0prepare_ssl.py" %1 diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index 8924b3fcfa2e80..7c87cbb1ae3a96 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -1,300 +1,300 @@ -Quick Start Guide ------------------ - -1. Install Microsoft Visual Studio 2015, any edition. -2. Install Subversion, and make sure 'svn.exe' is on your PATH. -3. Run "build.bat -e" to build Python in 32-bit Release configuration. -4. (Optional, but recommended) Run the test suite with "rt.bat -q". - - -Building Python using Microsoft Visual C++ ------------------------------------------- - -This directory is used to build CPython for Microsoft Windows NT version -6.0 or higher (Windows Vista, Windows Server 2008, or later) on 32 and 64 -bit platforms. Using this directory requires an installation of -Microsoft Visual C++ 2015 (MSVC 14.0) of any edition. The specific -requirements are as follows: - -Visual Studio Express 2015 for Desktop -Visual Studio Professional 2015 - Either edition is sufficient for building all configurations except - for Profile Guided Optimization. - The Python build solution pcbuild.sln makes use of Solution Folders, - which this edition does not support. Any time pcbuild.sln is opened - or reloaded by Visual Studio, a warning about Solution Folders will - be displayed, which can be safely dismissed with no impact on your - ability to build Python. - Required for building 64-bit Debug and Release configuration builds -Visual Studio Premium 2015 - Required for building Release configuration builds that make use of - Profile Guided Optimization (PGO), on either platform. - -All you need to do to build is open the solution "pcbuild.sln" in Visual -Studio, select the desired combination of configuration and platform, -then build with "Build Solution". You can also build from the command -line using the "build.bat" script in this directory; see below for -details. The solution is configured to build the projects in the correct -order. - -The solution currently supports two platforms. The Win32 platform is -used to build standard x86-compatible 32-bit binaries, output into the -win32 sub-directory. The x64 platform is used for building 64-bit AMD64 -(aka x86_64 or EM64T) binaries, output into the amd64 sub-directory. -The Itanium (IA-64) platform is no longer supported. - -Four configuration options are supported by the solution: -Debug - Used to build Python with extra debugging capabilities, equivalent - to using ./configure --with-pydebug on UNIX. All binaries built - using this configuration have "_d" added to their name: - python36_d.dll, python_d.exe, parser_d.pyd, and so on. Both the - build and rt (run test) batch files in this directory accept a -d - option for debug builds. If you are building Python to help with - development of CPython, you will most likely use this configuration. -PGInstrument, PGUpdate - Used to build Python in Release configuration using PGO, which - requires Premium Edition of Visual Studio. See the "Profile - Guided Optimization" section below for more information. Build - output from each of these configurations lands in its own - sub-directory of this directory. The official Python releases may - be built using these configurations. -Release - Used to build Python as it is meant to be used in production - settings, though without PGO. - - -Building Python using the build.bat script ----------------------------------------------- - -In this directory you can find build.bat, a script designed to make -building Python on Windows simpler. This script will use the env.bat -script to detect one of Visual Studio 2015, 2013, 2012, or 2010, any of -which may be used to build Python, though only Visual Studio 2015 is -officially supported. - -By default, build.bat will build Python in Release configuration for -the 32-bit Win32 platform. It accepts several arguments to change -this behavior, try `build.bat -h` to learn more. - - -C Runtime ---------- - -Visual Studio 2015 uses version 14 of the C runtime (MSVCRT14). The -executables no longer use the "Side by Side" assemblies used in previous -versions of the compiler. This simplifies distribution of applications. - -The run time libraries are available under the VC/Redist folder of your -Visual Studio distribution. For more info, see the Readme in the -VC/Redist folder. - - -Sub-Projects ------------- - -The CPython project is split up into several smaller sub-projects which -are managed by the pcbuild.sln solution file. Each sub-project is -represented by a .vcxproj and a .vcxproj.filters file starting with the -name of the sub-project. These sub-projects fall into a few general -categories: - -The following sub-projects represent the bare minimum required to build -a functioning CPython interpreter. If nothing else builds but these, -you'll have a very limited but usable python.exe: -pythoncore - .dll and .lib -python - .exe - -These sub-projects provide extra executables that are useful for running -CPython in different ways: -pythonw - pythonw.exe, a variant of python.exe that doesn't open a Command - Prompt window -pylauncher - py.exe, the Python Launcher for Windows, see - http://docs.python.org/3/using/windows.html#launcher -pywlauncher - pyw.exe, a variant of py.exe that doesn't open a Command Prompt - window -_testembed - _testembed.exe, a small program that embeds Python for testing - purposes, used by test_capi.py - -These are miscellaneous sub-projects that don't really fit the other -categories: -_freeze_importlib - _freeze_importlib.exe, used to regenerate Python\importlib.h after - changes have been made to Lib\importlib\_bootstrap.py -python3dll - python3.dll, the PEP 384 Stable ABI dll -xxlimited - builds an example module that makes use of the PEP 384 Stable ABI, - see Modules\xxlimited.c - -The following sub-projects are for individual modules of the standard -library which are implemented in C; each one builds a DLL (renamed to -.pyd) of the same name as the project: -_ctypes -_ctypes_test -_decimal -_elementtree -_hashlib -_msi -_multiprocessing -_overlapped -_socket -_testcapi -_testbuffer -_testimportmultiple -pyexpat -select -unicodedata -winsound - -The following Python-controlled sub-projects wrap external projects. -Note that these external libraries are not necessary for a working -interpreter, but they do implement several major features. See the -"Getting External Sources" section below for additional information -about getting the source for building these libraries. The sub-projects -are: -_bz2 - Python wrapper for version 1.0.6 of the libbzip2 compression library - Homepage: - http://www.bzip.org/ -_lzma - Python wrapper for the liblzma compression library, using pre-built - binaries of XZ Utils version 5.0.5 - Homepage: - http://tukaani.org/xz/ -_ssl - Python wrapper for version 1.0.2k of the OpenSSL secure sockets - library, which is built by ssl.vcxproj - Homepage: - http://www.openssl.org/ - - Building OpenSSL requires nasm.exe (the Netwide Assembler), version - 2.10 or newer from - http://www.nasm.us/ - to be somewhere on your PATH. More recent versions of OpenSSL may - need a later version of NASM. If OpenSSL's self tests don't pass, - you should first try to update NASM and do a full rebuild of - OpenSSL. If you use the PCbuild\get_externals.bat method - for getting sources, it also downloads a version of NASM which the - libeay/ssleay sub-projects use. - - The libeay/ssleay sub-projects expect your OpenSSL sources to have - already been configured and be ready to build. If you get your sources - from svn.python.org as suggested in the "Getting External Sources" - section below, the OpenSSL source will already be ready to go. If - you want to build a different version, you will need to run - - PCbuild\prepare_ssl.py path\to\openssl-source-dir - - That script will prepare your OpenSSL sources in the same way that - those available on svn.python.org have been prepared. Note that - Perl must be installed and available on your PATH to configure - OpenSSL. ActivePerl is recommended and is available from - http://www.activestate.com/activeperl/ - - The libeay and ssleay sub-projects will build the modules of OpenSSL - required by _ssl and _hashlib and may need to be manually updated when - upgrading to a newer version of OpenSSL or when adding new - functionality to _ssl or _hashlib. They will not clean up their output - with the normal Clean target; CleanAll should be used instead. -_sqlite3 - Wraps SQLite 3.14.2.0, which is itself built by sqlite3.vcxproj - Homepage: - http://www.sqlite.org/ -_tkinter - Wraps version 8.6.6 of the Tk windowing system. - Homepage: - http://www.tcl.tk/ - - Tkinter's dependencies are built by the tcl.vcxproj and tk.vcxproj - projects. The tix.vcxproj project also builds the Tix extended - widget set for use with Tkinter. - - Those three projects install their respective components in a - directory alongside the source directories called "tcltk" on - Win32 and "tcltk64" on x64. They also copy the Tcl and Tk DLLs - into the current output directory, which should ensure that Tkinter - is able to load Tcl/Tk without having to change your PATH. - - The tcl, tk, and tix sub-projects do not clean their builds with - the normal Clean target; if you need to rebuild, you should use the - CleanAll target or manually delete their builds. - - -Getting External Sources ------------------------- - -The last category of sub-projects listed above wrap external projects -Python doesn't control, and as such a little more work is required in -order to download the relevant source files for each project before they -can be built. However, a simple script is provided to make this as -painless as possible, called "get_externals.bat" and located in this -directory. This script extracts all the external sub-projects from - http://svn.python.org/projects/external -via Subversion (so you'll need svn.exe on your PATH) and places them -in ..\externals (relative to this directory). - -It is also possible to download sources from each project's homepage, -though you may have to change folder names or pass the names to MSBuild -as the values of certain properties in order for the build solution to -find them. This is an advanced topic and not necessarily fully -supported. - -The get_externals.bat script is called automatically by build.bat when -you pass the '-e' option to it. - - -Profile Guided Optimization ---------------------------- - -The solution has two configurations for PGO. The PGInstrument -configuration must be built first. The PGInstrument binaries are linked -against a profiling library and contain extra debug information. The -PGUpdate configuration takes the profiling data and generates optimized -binaries. - -The build_pgo.bat script automates the creation of optimized binaries. -It creates the PGI files, runs the unit test suite or PyBench with the -PGI python, and finally creates the optimized files. - -See - http://msdn.microsoft.com/en-us/library/e7k32f4k(VS.140).aspx -for more on this topic. - - -Static library --------------- - -The solution has no configuration for static libraries. However it is -easy to build a static library instead of a DLL. You simply have to set -the "Configuration Type" to "Static Library (.lib)" and alter the -preprocessor macro "Py_ENABLE_SHARED" to "Py_NO_ENABLE_SHARED". You may -also have to change the "Runtime Library" from "Multi-threaded DLL -(/MD)" to "Multi-threaded (/MT)". - - -Visual Studio properties ------------------------- - -The PCbuild solution makes use of Visual Studio property files (*.props) -to simplify each project. The properties can be viewed in the Property -Manager (View -> Other Windows -> Property Manager) but should be -carefully modified by hand. - -The property files used are: - * python (versions, directories and build names) - * pyproject (base settings for all projects) - * openssl (used by libeay and ssleay projects) - * tcltk (used by _tkinter, tcl, tk and tix projects) - -The pyproject property file defines all of the build settings for each -project, with some projects overriding certain specific values. The GUI -doesn't always reflect the correct settings and may confuse the user -with false information, especially for settings that automatically adapt -for diffirent configurations. +Quick Start Guide +----------------- + +1. Install Microsoft Visual Studio 2015, any edition. +2. Install Subversion, and make sure 'svn.exe' is on your PATH. +3. Run "build.bat -e" to build Python in 32-bit Release configuration. +4. (Optional, but recommended) Run the test suite with "rt.bat -q". + + +Building Python using Microsoft Visual C++ +------------------------------------------ + +This directory is used to build CPython for Microsoft Windows NT version +6.0 or higher (Windows Vista, Windows Server 2008, or later) on 32 and 64 +bit platforms. Using this directory requires an installation of +Microsoft Visual C++ 2015 (MSVC 14.0) of any edition. The specific +requirements are as follows: + +Visual Studio Express 2015 for Desktop +Visual Studio Professional 2015 + Either edition is sufficient for building all configurations except + for Profile Guided Optimization. + The Python build solution pcbuild.sln makes use of Solution Folders, + which this edition does not support. Any time pcbuild.sln is opened + or reloaded by Visual Studio, a warning about Solution Folders will + be displayed, which can be safely dismissed with no impact on your + ability to build Python. + Required for building 64-bit Debug and Release configuration builds +Visual Studio Premium 2015 + Required for building Release configuration builds that make use of + Profile Guided Optimization (PGO), on either platform. + +All you need to do to build is open the solution "pcbuild.sln" in Visual +Studio, select the desired combination of configuration and platform, +then build with "Build Solution". You can also build from the command +line using the "build.bat" script in this directory; see below for +details. The solution is configured to build the projects in the correct +order. + +The solution currently supports two platforms. The Win32 platform is +used to build standard x86-compatible 32-bit binaries, output into the +win32 sub-directory. The x64 platform is used for building 64-bit AMD64 +(aka x86_64 or EM64T) binaries, output into the amd64 sub-directory. +The Itanium (IA-64) platform is no longer supported. + +Four configuration options are supported by the solution: +Debug + Used to build Python with extra debugging capabilities, equivalent + to using ./configure --with-pydebug on UNIX. All binaries built + using this configuration have "_d" added to their name: + python36_d.dll, python_d.exe, parser_d.pyd, and so on. Both the + build and rt (run test) batch files in this directory accept a -d + option for debug builds. If you are building Python to help with + development of CPython, you will most likely use this configuration. +PGInstrument, PGUpdate + Used to build Python in Release configuration using PGO, which + requires Premium Edition of Visual Studio. See the "Profile + Guided Optimization" section below for more information. Build + output from each of these configurations lands in its own + sub-directory of this directory. The official Python releases may + be built using these configurations. +Release + Used to build Python as it is meant to be used in production + settings, though without PGO. + + +Building Python using the build.bat script +---------------------------------------------- + +In this directory you can find build.bat, a script designed to make +building Python on Windows simpler. This script will use the env.bat +script to detect one of Visual Studio 2015, 2013, 2012, or 2010, any of +which may be used to build Python, though only Visual Studio 2015 is +officially supported. + +By default, build.bat will build Python in Release configuration for +the 32-bit Win32 platform. It accepts several arguments to change +this behavior, try `build.bat -h` to learn more. + + +C Runtime +--------- + +Visual Studio 2015 uses version 14 of the C runtime (MSVCRT14). The +executables no longer use the "Side by Side" assemblies used in previous +versions of the compiler. This simplifies distribution of applications. + +The run time libraries are available under the VC/Redist folder of your +Visual Studio distribution. For more info, see the Readme in the +VC/Redist folder. + + +Sub-Projects +------------ + +The CPython project is split up into several smaller sub-projects which +are managed by the pcbuild.sln solution file. Each sub-project is +represented by a .vcxproj and a .vcxproj.filters file starting with the +name of the sub-project. These sub-projects fall into a few general +categories: + +The following sub-projects represent the bare minimum required to build +a functioning CPython interpreter. If nothing else builds but these, +you'll have a very limited but usable python.exe: +pythoncore + .dll and .lib +python + .exe + +These sub-projects provide extra executables that are useful for running +CPython in different ways: +pythonw + pythonw.exe, a variant of python.exe that doesn't open a Command + Prompt window +pylauncher + py.exe, the Python Launcher for Windows, see + http://docs.python.org/3/using/windows.html#launcher +pywlauncher + pyw.exe, a variant of py.exe that doesn't open a Command Prompt + window +_testembed + _testembed.exe, a small program that embeds Python for testing + purposes, used by test_capi.py + +These are miscellaneous sub-projects that don't really fit the other +categories: +_freeze_importlib + _freeze_importlib.exe, used to regenerate Python\importlib.h after + changes have been made to Lib\importlib\_bootstrap.py +python3dll + python3.dll, the PEP 384 Stable ABI dll +xxlimited + builds an example module that makes use of the PEP 384 Stable ABI, + see Modules\xxlimited.c + +The following sub-projects are for individual modules of the standard +library which are implemented in C; each one builds a DLL (renamed to +.pyd) of the same name as the project: +_ctypes +_ctypes_test +_decimal +_elementtree +_hashlib +_msi +_multiprocessing +_overlapped +_socket +_testcapi +_testbuffer +_testimportmultiple +pyexpat +select +unicodedata +winsound + +The following Python-controlled sub-projects wrap external projects. +Note that these external libraries are not necessary for a working +interpreter, but they do implement several major features. See the +"Getting External Sources" section below for additional information +about getting the source for building these libraries. The sub-projects +are: +_bz2 + Python wrapper for version 1.0.6 of the libbzip2 compression library + Homepage: + http://www.bzip.org/ +_lzma + Python wrapper for the liblzma compression library, using pre-built + binaries of XZ Utils version 5.0.5 + Homepage: + http://tukaani.org/xz/ +_ssl + Python wrapper for version 1.0.2k of the OpenSSL secure sockets + library, which is built by ssl.vcxproj + Homepage: + http://www.openssl.org/ + + Building OpenSSL requires nasm.exe (the Netwide Assembler), version + 2.10 or newer from + http://www.nasm.us/ + to be somewhere on your PATH. More recent versions of OpenSSL may + need a later version of NASM. If OpenSSL's self tests don't pass, + you should first try to update NASM and do a full rebuild of + OpenSSL. If you use the PCbuild\get_externals.bat method + for getting sources, it also downloads a version of NASM which the + libeay/ssleay sub-projects use. + + The libeay/ssleay sub-projects expect your OpenSSL sources to have + already been configured and be ready to build. If you get your sources + from svn.python.org as suggested in the "Getting External Sources" + section below, the OpenSSL source will already be ready to go. If + you want to build a different version, you will need to run + + PCbuild\prepare_ssl.py path\to\openssl-source-dir + + That script will prepare your OpenSSL sources in the same way that + those available on svn.python.org have been prepared. Note that + Perl must be installed and available on your PATH to configure + OpenSSL. ActivePerl is recommended and is available from + http://www.activestate.com/activeperl/ + + The libeay and ssleay sub-projects will build the modules of OpenSSL + required by _ssl and _hashlib and may need to be manually updated when + upgrading to a newer version of OpenSSL or when adding new + functionality to _ssl or _hashlib. They will not clean up their output + with the normal Clean target; CleanAll should be used instead. +_sqlite3 + Wraps SQLite 3.14.2.0, which is itself built by sqlite3.vcxproj + Homepage: + http://www.sqlite.org/ +_tkinter + Wraps version 8.6.6 of the Tk windowing system. + Homepage: + http://www.tcl.tk/ + + Tkinter's dependencies are built by the tcl.vcxproj and tk.vcxproj + projects. The tix.vcxproj project also builds the Tix extended + widget set for use with Tkinter. + + Those three projects install their respective components in a + directory alongside the source directories called "tcltk" on + Win32 and "tcltk64" on x64. They also copy the Tcl and Tk DLLs + into the current output directory, which should ensure that Tkinter + is able to load Tcl/Tk without having to change your PATH. + + The tcl, tk, and tix sub-projects do not clean their builds with + the normal Clean target; if you need to rebuild, you should use the + CleanAll target or manually delete their builds. + + +Getting External Sources +------------------------ + +The last category of sub-projects listed above wrap external projects +Python doesn't control, and as such a little more work is required in +order to download the relevant source files for each project before they +can be built. However, a simple script is provided to make this as +painless as possible, called "get_externals.bat" and located in this +directory. This script extracts all the external sub-projects from + http://svn.python.org/projects/external +via Subversion (so you'll need svn.exe on your PATH) and places them +in ..\externals (relative to this directory). + +It is also possible to download sources from each project's homepage, +though you may have to change folder names or pass the names to MSBuild +as the values of certain properties in order for the build solution to +find them. This is an advanced topic and not necessarily fully +supported. + +The get_externals.bat script is called automatically by build.bat when +you pass the '-e' option to it. + + +Profile Guided Optimization +--------------------------- + +The solution has two configurations for PGO. The PGInstrument +configuration must be built first. The PGInstrument binaries are linked +against a profiling library and contain extra debug information. The +PGUpdate configuration takes the profiling data and generates optimized +binaries. + +The build_pgo.bat script automates the creation of optimized binaries. +It creates the PGI files, runs the unit test suite or PyBench with the +PGI python, and finally creates the optimized files. + +See + http://msdn.microsoft.com/en-us/library/e7k32f4k(VS.140).aspx +for more on this topic. + + +Static library +-------------- + +The solution has no configuration for static libraries. However it is +easy to build a static library instead of a DLL. You simply have to set +the "Configuration Type" to "Static Library (.lib)" and alter the +preprocessor macro "Py_ENABLE_SHARED" to "Py_NO_ENABLE_SHARED". You may +also have to change the "Runtime Library" from "Multi-threaded DLL +(/MD)" to "Multi-threaded (/MT)". + + +Visual Studio properties +------------------------ + +The PCbuild solution makes use of Visual Studio property files (*.props) +to simplify each project. The properties can be viewed in the Property +Manager (View -> Other Windows -> Property Manager) but should be +carefully modified by hand. + +The property files used are: + * python (versions, directories and build names) + * pyproject (base settings for all projects) + * openssl (used by libeay and ssleay projects) + * tcltk (used by _tkinter, tcl, tk and tix projects) + +The pyproject property file defines all of the build settings for each +project, with some projects overriding certain specific values. The GUI +doesn't always reflect the correct settings and may confuse the user +with false information, especially for settings that automatically adapt +for diffirent configurations. diff --git a/PCbuild/rt.bat b/PCbuild/rt.bat index e73ac0457646e9..808102f826d370 100644 --- a/PCbuild/rt.bat +++ b/PCbuild/rt.bat @@ -1,63 +1,63 @@ -@echo off -rem Run Tests. Run the regression test suite. -rem Usage: rt [-d] [-O] [-q] [-x64] regrtest_args -rem -d Run Debug build (python_d.exe). Else release build. -rem -O Run python.exe or python_d.exe (see -d) with -O. -rem -q "quick" -- normally the tests are run twice, the first time -rem after deleting all the .pyc files reachable from Lib/. -rem -q runs the tests just once, and without deleting .pyc files. -rem -x64 Run the 64-bit build of python (or python_d if -d was specified) -rem from the 'amd64' dir instead of the 32-bit build in this dir. -rem All leading instances of these switches are shifted off, and -rem whatever remains (up to 9 arguments) is passed to regrtest.py. -rem For example, -rem rt -O -d -x test_thread -rem runs -rem python_d -O ../lib/test/regrtest.py -x test_thread -rem twice, and -rem rt -q -g test_binascii -rem runs -rem python_d ../lib/test/regrtest.py -g test_binascii -rem to generate the expected-output file for binascii quickly. -rem -rem Confusing: if you want to pass a comma-separated list, like -rem -u network,largefile -rem then you have to quote it on the rt line, like -rem rt -u "network,largefile" - -setlocal - -set pcbuild=%~dp0 -set prefix=%pcbuild%win32\ -set suffix= -set qmode= -set dashO= -set regrtestargs= - -:CheckOpts -if "%1"=="-O" (set dashO=-O) & shift & goto CheckOpts -if "%1"=="-q" (set qmode=yes) & shift & goto CheckOpts -if "%1"=="-d" (set suffix=_d) & shift & goto CheckOpts -if "%1"=="-x64" (set prefix=%pcbuild%amd64\) & shift & goto CheckOpts -if NOT "%1"=="" (set regrtestargs=%regrtestargs% %1) & shift & goto CheckOpts - -set exe=%prefix%python%suffix%.exe -set cmd="%exe%" %dashO% -Wd -E -bb -m test %regrtestargs% -if defined qmode goto Qmode - -echo Deleting .pyc files ... -"%exe%" "%pcbuild%rmpyc.py" - -echo Cleaning _pth files ... -if exist %prefix%*._pth del %prefix%*._pth - -echo on -%cmd% -@echo off - -echo About to run again without deleting .pyc first: -pause - -:Qmode -echo on -%cmd% +@echo off +rem Run Tests. Run the regression test suite. +rem Usage: rt [-d] [-O] [-q] [-x64] regrtest_args +rem -d Run Debug build (python_d.exe). Else release build. +rem -O Run python.exe or python_d.exe (see -d) with -O. +rem -q "quick" -- normally the tests are run twice, the first time +rem after deleting all the .pyc files reachable from Lib/. +rem -q runs the tests just once, and without deleting .pyc files. +rem -x64 Run the 64-bit build of python (or python_d if -d was specified) +rem from the 'amd64' dir instead of the 32-bit build in this dir. +rem All leading instances of these switches are shifted off, and +rem whatever remains (up to 9 arguments) is passed to regrtest.py. +rem For example, +rem rt -O -d -x test_thread +rem runs +rem python_d -O ../lib/test/regrtest.py -x test_thread +rem twice, and +rem rt -q -g test_binascii +rem runs +rem python_d ../lib/test/regrtest.py -g test_binascii +rem to generate the expected-output file for binascii quickly. +rem +rem Confusing: if you want to pass a comma-separated list, like +rem -u network,largefile +rem then you have to quote it on the rt line, like +rem rt -u "network,largefile" + +setlocal + +set pcbuild=%~dp0 +set prefix=%pcbuild%win32\ +set suffix= +set qmode= +set dashO= +set regrtestargs= + +:CheckOpts +if "%1"=="-O" (set dashO=-O) & shift & goto CheckOpts +if "%1"=="-q" (set qmode=yes) & shift & goto CheckOpts +if "%1"=="-d" (set suffix=_d) & shift & goto CheckOpts +if "%1"=="-x64" (set prefix=%pcbuild%amd64\) & shift & goto CheckOpts +if NOT "%1"=="" (set regrtestargs=%regrtestargs% %1) & shift & goto CheckOpts + +set exe=%prefix%python%suffix%.exe +set cmd="%exe%" %dashO% -Wd -E -bb -m test %regrtestargs% +if defined qmode goto Qmode + +echo Deleting .pyc files ... +"%exe%" "%pcbuild%rmpyc.py" + +echo Cleaning _pth files ... +if exist %prefix%*._pth del %prefix%*._pth + +echo on +%cmd% +@echo off + +echo About to run again without deleting .pyc first: +pause + +:Qmode +echo on +%cmd% diff --git a/Tools/buildbot/build.bat b/Tools/buildbot/build.bat index 5e840cc7eaca84..9af511a81dbd8e 100644 --- a/Tools/buildbot/build.bat +++ b/Tools/buildbot/build.bat @@ -1,17 +1,17 @@ -@rem Used by the buildbot "compile" step. - -@rem Clean up -call "%~dp0clean.bat" %* - -@rem If you need the buildbots to start fresh (such as when upgrading to -@rem a new version of an external library, especially Tcl/Tk): -@rem 1) uncomment the following line: - -@rem call "%~dp0..\..\PCbuild\get_externals.bat" --clean-only - -@rem 2) commit and push -@rem 3) wait for all Windows bots to start a build with that changeset -@rem 4) re-comment, commit and push again - -@rem Do the build -call "%~dp0..\..\PCbuild\build.bat" -e -d -k -v %* +@rem Used by the buildbot "compile" step. + +@rem Clean up +call "%~dp0clean.bat" %* + +@rem If you need the buildbots to start fresh (such as when upgrading to +@rem a new version of an external library, especially Tcl/Tk): +@rem 1) uncomment the following line: + +@rem call "%~dp0..\..\PCbuild\get_externals.bat" --clean-only + +@rem 2) commit and push +@rem 3) wait for all Windows bots to start a build with that changeset +@rem 4) re-comment, commit and push again + +@rem Do the build +call "%~dp0..\..\PCbuild\build.bat" -e -d -k -v %* diff --git a/Tools/buildbot/buildmsi.bat b/Tools/buildbot/buildmsi.bat index e3c2dbd73d00df..6804d794799509 100644 --- a/Tools/buildbot/buildmsi.bat +++ b/Tools/buildbot/buildmsi.bat @@ -1,9 +1,9 @@ -@rem Used by the buildbot "buildmsi" step. -setlocal - -pushd - -@rem build both snapshot MSIs -call "%~dp0..\msi\build.bat" -x86 -x64 - +@rem Used by the buildbot "buildmsi" step. +setlocal + +pushd + +@rem build both snapshot MSIs +call "%~dp0..\msi\build.bat" -x86 -x64 + popd \ No newline at end of file diff --git a/Tools/buildbot/clean.bat b/Tools/buildbot/clean.bat index 13e667991b6ee9..fe252a916b1c24 100644 --- a/Tools/buildbot/clean.bat +++ b/Tools/buildbot/clean.bat @@ -1,17 +1,17 @@ -@echo off -rem Used by the buildbot "clean" step. - -setlocal -set root=%~dp0..\.. -set pcbuild=%root%\PCbuild - -echo Deleting build -call "%pcbuild%\build.bat" -t Clean -k %* -call "%pcbuild%\build.bat" -t Clean -k -d %* - -echo Deleting .pyc/.pyo files ... -del /s "%root%\Lib\*.pyc" "%root%\Lib\*.pyo" - -echo Deleting test leftovers ... -rmdir /s /q "%root%\build" -del /s "%pcbuild%\python*.zip" +@echo off +rem Used by the buildbot "clean" step. + +setlocal +set root=%~dp0..\.. +set pcbuild=%root%\PCbuild + +echo Deleting build +call "%pcbuild%\build.bat" -t Clean -k %* +call "%pcbuild%\build.bat" -t Clean -k -d %* + +echo Deleting .pyc/.pyo files ... +del /s "%root%\Lib\*.pyc" "%root%\Lib\*.pyo" + +echo Deleting test leftovers ... +rmdir /s /q "%root%\build" +del /s "%pcbuild%\python*.zip" diff --git a/Tools/buildbot/test.bat b/Tools/buildbot/test.bat index a32d38b5ec8bf5..0b3a3091c1e46e 100644 --- a/Tools/buildbot/test.bat +++ b/Tools/buildbot/test.bat @@ -1,19 +1,19 @@ -@echo off -rem Used by the buildbot "test" step. -setlocal - -set here=%~dp0 -set rt_opts=-q -d -set regrtest_args=-j1 - -:CheckOpts -if "%1"=="-x64" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts -if "%1"=="-d" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts -if "%1"=="-O" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts -if "%1"=="-q" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts -if "%1"=="+d" (set rt_opts=%rt_opts:-d=%) & shift & goto CheckOpts -if "%1"=="+q" (set rt_opts=%rt_opts:-q=%) & shift & goto CheckOpts -if NOT "%1"=="" (set regrtest_args=%regrtest_args% %1) & shift & goto CheckOpts - -echo on -call "%here%..\..\PCbuild\rt.bat" %rt_opts% -uall -rwW --slowest --timeout=1200 %regrtest_args% +@echo off +rem Used by the buildbot "test" step. +setlocal + +set here=%~dp0 +set rt_opts=-q -d +set regrtest_args=-j1 + +:CheckOpts +if "%1"=="-x64" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts +if "%1"=="-d" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts +if "%1"=="-O" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts +if "%1"=="-q" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts +if "%1"=="+d" (set rt_opts=%rt_opts:-d=%) & shift & goto CheckOpts +if "%1"=="+q" (set rt_opts=%rt_opts:-q=%) & shift & goto CheckOpts +if NOT "%1"=="" (set regrtest_args=%regrtest_args% %1) & shift & goto CheckOpts + +echo on +call "%here%..\..\PCbuild\rt.bat" %rt_opts% -uall -rwW --slowest --timeout=1200 %regrtest_args% diff --git a/Tools/msi/build.bat b/Tools/msi/build.bat index 69f00c0bb43f84..59e0261c6d5236 100644 --- a/Tools/msi/build.bat +++ b/Tools/msi/build.bat @@ -1,79 +1,79 @@ -@echo off -setlocal -set D=%~dp0 -set PCBUILD=%D%..\..\PCBuild\ - -set BUILDX86= -set BUILDX64= -set BUILDDOC= -set BUILDTEST=--test-marker -set BUILDPACK= -set REBUILD= - -:CheckOpts -if "%~1" EQU "-h" goto Help -if "%~1" EQU "-x86" (set BUILDX86=1) && shift && goto CheckOpts -if "%~1" EQU "-x64" (set BUILDX64=1) && shift && goto CheckOpts -if "%~1" EQU "--doc" (set BUILDDOC=1) && shift && goto CheckOpts -if "%~1" EQU "--no-test-marker" (set BUILDTEST=) && shift && goto CheckOpts -if "%~1" EQU "--pack" (set BUILDPACK=1) && shift && goto CheckOpts -if "%~1" EQU "-r" (set REBUILD=-r) && shift && goto CheckOpts - -if not defined BUILDX86 if not defined BUILDX64 (set BUILDX86=1) && (set BUILDX64=1) - -call "%D%get_externals.bat" - -call "%PCBUILD%env.bat" x86 - -if defined BUILDX86 ( - call "%PCBUILD%build.bat" -d -e %REBUILD% %BUILDTEST% - if errorlevel 1 goto :eof - call "%PCBUILD%build.bat" -e %REBUILD% %BUILDTEST% - if errorlevel 1 goto :eof -) -if defined BUILDX64 ( - call "%PCBUILD%build.bat" -p x64 -d -e %REBUILD% %BUILDTEST% - if errorlevel 1 goto :eof - call "%PCBUILD%build.bat" -p x64 -e %REBUILD% %BUILDTEST% - if errorlevel 1 goto :eof -) - -if defined BUILDDOC ( - call "%PCBUILD%..\Doc\make.bat" htmlhelp - if errorlevel 1 goto :eof -) - -rem Build the launcher MSI separately -msbuild "%D%launcher\launcher.wixproj" /p:Platform=x86 - -set BUILD_CMD="%D%bundle\snapshot.wixproj" -if defined BUILDTEST ( - set BUILD_CMD=%BUILD_CMD% /p:UseTestMarker=true -) -if defined BUILDPACK ( - set BUILD_CMD=%BUILD_CMD% /p:Pack=true -) -if defined REBUILD ( - set BUILD_CMD=%BUILD_CMD% /t:Rebuild -) - -if defined BUILDX86 ( - msbuild %BUILD_CMD% - if errorlevel 1 goto :eof -) -if defined BUILDX64 ( - msbuild /p:Platform=x64 %BUILD_CMD% - if errorlevel 1 goto :eof -) - -exit /B 0 - -:Help -echo build.bat [-x86] [-x64] [--doc] [-h] [--no-test-marker] [--pack] [-r] -echo. -echo -x86 Build x86 installers -echo -x64 Build x64 installers -echo --doc Build CHM documentation -echo --no-test-marker Build without test markers -echo --pack Embed core MSIs into installer -echo -r Rebuild rather than incremental build +@echo off +setlocal +set D=%~dp0 +set PCBUILD=%D%..\..\PCBuild\ + +set BUILDX86= +set BUILDX64= +set BUILDDOC= +set BUILDTEST=--test-marker +set BUILDPACK= +set REBUILD= + +:CheckOpts +if "%~1" EQU "-h" goto Help +if "%~1" EQU "-x86" (set BUILDX86=1) && shift && goto CheckOpts +if "%~1" EQU "-x64" (set BUILDX64=1) && shift && goto CheckOpts +if "%~1" EQU "--doc" (set BUILDDOC=1) && shift && goto CheckOpts +if "%~1" EQU "--no-test-marker" (set BUILDTEST=) && shift && goto CheckOpts +if "%~1" EQU "--pack" (set BUILDPACK=1) && shift && goto CheckOpts +if "%~1" EQU "-r" (set REBUILD=-r) && shift && goto CheckOpts + +if not defined BUILDX86 if not defined BUILDX64 (set BUILDX86=1) && (set BUILDX64=1) + +call "%D%get_externals.bat" + +call "%PCBUILD%env.bat" x86 + +if defined BUILDX86 ( + call "%PCBUILD%build.bat" -d -e %REBUILD% %BUILDTEST% + if errorlevel 1 goto :eof + call "%PCBUILD%build.bat" -e %REBUILD% %BUILDTEST% + if errorlevel 1 goto :eof +) +if defined BUILDX64 ( + call "%PCBUILD%build.bat" -p x64 -d -e %REBUILD% %BUILDTEST% + if errorlevel 1 goto :eof + call "%PCBUILD%build.bat" -p x64 -e %REBUILD% %BUILDTEST% + if errorlevel 1 goto :eof +) + +if defined BUILDDOC ( + call "%PCBUILD%..\Doc\make.bat" htmlhelp + if errorlevel 1 goto :eof +) + +rem Build the launcher MSI separately +msbuild "%D%launcher\launcher.wixproj" /p:Platform=x86 + +set BUILD_CMD="%D%bundle\snapshot.wixproj" +if defined BUILDTEST ( + set BUILD_CMD=%BUILD_CMD% /p:UseTestMarker=true +) +if defined BUILDPACK ( + set BUILD_CMD=%BUILD_CMD% /p:Pack=true +) +if defined REBUILD ( + set BUILD_CMD=%BUILD_CMD% /t:Rebuild +) + +if defined BUILDX86 ( + msbuild %BUILD_CMD% + if errorlevel 1 goto :eof +) +if defined BUILDX64 ( + msbuild /p:Platform=x64 %BUILD_CMD% + if errorlevel 1 goto :eof +) + +exit /B 0 + +:Help +echo build.bat [-x86] [-x64] [--doc] [-h] [--no-test-marker] [--pack] [-r] +echo. +echo -x86 Build x86 installers +echo -x64 Build x64 installers +echo --doc Build CHM documentation +echo --no-test-marker Build without test markers +echo --pack Embed core MSIs into installer +echo -r Rebuild rather than incremental build diff --git a/Tools/msi/buildrelease.bat b/Tools/msi/buildrelease.bat index 81a3f86cab36b0..ed930c653c11ea 100644 --- a/Tools/msi/buildrelease.bat +++ b/Tools/msi/buildrelease.bat @@ -1,235 +1,235 @@ -@setlocal -@echo off - -rem This script is intended for building official releases of Python. -rem To use it to build alternative releases, you should clone this file -rem and modify the following three URIs. - -rem These two will ensure that your release can be installed -rem alongside an official Python release, by modifying the GUIDs used -rem for all components. -rem -rem The following substitutions will be applied to the release URI: -rem Variable Description Example -rem {arch} architecture amd64, win32 -set RELEASE_URI=http://www.python.org/{arch} - -rem This is the URL that will be used to download installation files. -rem The files available from the default URL *will* conflict with your -rem installer. Trust me, you don't want them, even if it seems like a -rem good idea. -rem -rem The following substitutions will be applied to the download URL: -rem Variable Description Example -rem {version} version number 3.5.0 -rem {arch} architecture amd64, win32 -rem {releasename} release name a1, b2, rc3 (or blank for final) -rem {msi} MSI filename core.msi -set DOWNLOAD_URL=https://www.python.org/ftp/python/{version}/{arch}{releasename}/{msi} - -set D=%~dp0 -set PCBUILD=%D%..\..\PCBuild\ -set EXTERNALS=%D%..\..\externals\windows-installer\ - -set BUILDX86= -set BUILDX64= -set TARGET=Rebuild -set TESTTARGETDIR= -set PGO=-m test -q --pgo -set BUILDNUGET=1 -set BUILDZIP=1 - - -:CheckOpts -if "%1" EQU "-h" goto Help -if "%1" EQU "-c" (set CERTNAME=%~2) && shift && shift && goto CheckOpts -if "%1" EQU "--certificate" (set CERTNAME=%~2) && shift && shift && goto CheckOpts -if "%1" EQU "-o" (set OUTDIR=%~2) && shift && shift && goto CheckOpts -if "%1" EQU "--out" (set OUTDIR=%~2) && shift && shift && goto CheckOpts -if "%1" EQU "-D" (set SKIPDOC=1) && shift && goto CheckOpts -if "%1" EQU "--skip-doc" (set SKIPDOC=1) && shift && goto CheckOpts -if "%1" EQU "-B" (set SKIPBUILD=1) && shift && goto CheckOpts -if "%1" EQU "--skip-build" (set SKIPBUILD=1) && shift && goto CheckOpts -if "%1" EQU "--download" (set DOWNLOAD_URL=%~2) && shift && shift && goto CheckOpts -if "%1" EQU "--test" (set TESTTARGETDIR=%~2) && shift && shift && goto CheckOpts -if "%1" EQU "-b" (set TARGET=Build) && shift && goto CheckOpts -if "%1" EQU "--build" (set TARGET=Build) && shift && goto CheckOpts -if "%1" EQU "-x86" (set BUILDX86=1) && shift && goto CheckOpts -if "%1" EQU "-x64" (set BUILDX64=1) && shift && goto CheckOpts -if "%1" EQU "--pgo" (set PGO=%~2) && shift && shift && goto CheckOpts -if "%1" EQU "--skip-pgo" (set PGO=) && shift && goto CheckOpts -if "%1" EQU "--skip-nuget" (set BUILDNUGET=) && shift && goto CheckOpts -if "%1" EQU "--skip-zip" (set BUILDZIP=) && shift && goto CheckOpts - -if "%1" NEQ "" echo Invalid option: "%1" && exit /B 1 - -if not defined BUILDX86 if not defined BUILDX64 (set BUILDX86=1) && (set BUILDX64=1) - -if not exist "%GIT%" where git > "%TEMP%\git.loc" 2> nul && set /P GIT= < "%TEMP%\git.loc" & del "%TEMP%\git.loc" -if not exist "%GIT%" echo Cannot find Git on PATH && exit /B 1 - -call "%D%get_externals.bat" - -:builddoc -if "%SKIPBUILD%" EQU "1" goto skipdoc -if "%SKIPDOC%" EQU "1" goto skipdoc - -if not defined PYTHON where py -q || echo Cannot find py on path and PYTHON is not set. && exit /B 1 -if not defined SPHINXBUILD where sphinx-build -q || echo Cannot find sphinx-build on path and SPHINXBUILD is not set. && exit /B 1 - -call "%D%..\..\doc\make.bat" htmlhelp -if errorlevel 1 goto :eof -:skipdoc - -where dlltool /q && goto skipdlltoolsearch -set _DLLTOOL_PATH= -where /R "%EXTERNALS%\" dlltool > "%TEMP%\dlltool.loc" 2> nul && set /P _DLLTOOL_PATH= < "%TEMP%\dlltool.loc" & del "%TEMP%\dlltool.loc" -if not exist "%_DLLTOOL_PATH%" echo Cannot find binutils on PATH or in external && exit /B 1 -for %%f in (%_DLLTOOL_PATH%) do set PATH=%PATH%;%%~dpf -set _DLLTOOL_PATH= -:skipdlltoolsearch - -if defined BUILDX86 ( - call :build x86 - if errorlevel 1 exit /B -) - -if defined BUILDX64 ( - call :build x64 "%PGO%" - if errorlevel 1 exit /B -) - -if defined TESTTARGETDIR ( - call "%D%testrelease.bat" -t "%TESTTARGETDIR%" -) - -exit /B 0 - -:build -@setlocal -@echo off - -if "%1" EQU "x86" ( - set PGO= - set BUILD=%PCBUILD%win32\ - set BUILD_PLAT=Win32 - set OUTDIR_PLAT=win32 - set OBJDIR_PLAT=x86 -) else ( - set BUILD=%PCBUILD%amd64\ - set PGO=%~2 - set BUILD_PLAT=x64 - set OUTDIR_PLAT=amd64 - set OBJDIR_PLAT=x64 -) - -if exist "%BUILD%en-us" ( - echo Deleting %BUILD%en-us - rmdir /q/s "%BUILD%en-us" - if errorlevel 1 exit /B -) - -if exist "%D%obj\Debug_%OBJDIR_PLAT%" ( - echo Deleting "%D%obj\Debug_%OBJDIR_PLAT%" - rmdir /q/s "%D%obj\Debug_%OBJDIR_PLAT%" - if errorlevel 1 exit /B -) - -if exist "%D%obj\Release_%OBJDIR_PLAT%" ( - echo Deleting "%D%obj\Release_%OBJDIR_PLAT%" - rmdir /q/s "%D%obj\Release_%OBJDIR_PLAT%" - if errorlevel 1 exit /B -) - -if not "%CERTNAME%" EQU "" ( - set CERTOPTS="/p:SigningCertificate=%CERTNAME%" -) else ( - set CERTOPTS= -) -if not "%PGO%" EQU "" ( - set PGOOPTS=--pgo-job "%PGO%" -) else ( - set PGOOPTS= -) -if not "%SKIPBUILD%" EQU "1" ( - @echo call "%PCBUILD%build.bat" -e -p %BUILD_PLAT% -t %TARGET% %PGOOPTS% %CERTOPTS% - @call "%PCBUILD%build.bat" -e -p %BUILD_PLAT% -t %TARGET% %PGOOPTS% %CERTOPTS% - @if errorlevel 1 exit /B - @rem build.bat turns echo back on, so we disable it again - @echo off - - @echo call "%PCBUILD%build.bat" -d -e -p %BUILD_PLAT% -t %TARGET% - @call "%PCBUILD%build.bat" -d -e -p %BUILD_PLAT% -t %TARGET% - @if errorlevel 1 exit /B - @rem build.bat turns echo back on, so we disable it again - @echo off -) - -call "%PCBUILD%env.bat" -if "%OUTDIR_PLAT%" EQU "win32" ( - msbuild "%D%launcher\launcher.wixproj" /p:Platform=x86 %CERTOPTS% /p:ReleaseUri=%RELEASE_URI% - if errorlevel 1 exit /B -) else if not exist "%PCBUILD%win32\en-us\launcher.msi" ( - msbuild "%D%launcher\launcher.wixproj" /p:Platform=x86 %CERTOPTS% /p:ReleaseUri=%RELEASE_URI% - if errorlevel 1 exit /B -) - -set BUILDOPTS=/p:Platform=%1 /p:BuildForRelease=true /p:DownloadUrl=%DOWNLOAD_URL% /p:DownloadUrlBase=%DOWNLOAD_URL_BASE% /p:ReleaseUri=%RELEASE_URI% -msbuild "%D%bundle\releaselocal.wixproj" /t:Rebuild %BUILDOPTS% %CERTOPTS% /p:RebuildAll=true -if errorlevel 1 exit /B -msbuild "%D%bundle\releaseweb.wixproj" /t:Rebuild %BUILDOPTS% %CERTOPTS% /p:RebuildAll=false -if errorlevel 1 exit /B - -if defined BUILDZIP ( - msbuild "%D%make_zip.proj" /t:Build %BUILDOPTS% %CERTOPTS% /p:OutputPath="%BUILD%en-us" - if errorlevel 1 exit /B -) - -if defined BUILDNUGET ( - msbuild "%D%..\nuget\make_pkg.proj" /t:Build /p:Configuration=Release /p:Platform=%1 /p:OutputPath="%BUILD%en-us" - if errorlevel 1 exit /B -) - -if not "%OUTDIR%" EQU "" ( - mkdir "%OUTDIR%\%OUTDIR_PLAT%" - mkdir "%OUTDIR%\%OUTDIR_PLAT%\binaries" - mkdir "%OUTDIR%\%OUTDIR_PLAT%\symbols" - robocopy "%BUILD%en-us" "%OUTDIR%\%OUTDIR_PLAT%" /XF "*.wixpdb" - robocopy "%BUILD%\" "%OUTDIR%\%OUTDIR_PLAT%\binaries" *.exe *.dll *.pyd /XF "_test*" /XF "*_d.*" /XF "_freeze*" /XF "tcl*" /XF "tk*" /XF "*_test.*" - robocopy "%BUILD%\" "%OUTDIR%\%OUTDIR_PLAT%\symbols" *.pdb /XF "_test*" /XF "*_d.*" /XF "_freeze*" /XF "tcl*" /XF "tk*" /XF "*_test.*" -) - -exit /B 0 - -:Help -echo buildrelease.bat [--out DIR] [-x86] [-x64] [--certificate CERTNAME] [--build] [--pgo COMMAND] -echo [--skip-build] [--skip-doc] [--skip-nuget] [--skip-zip] [--skip-pgo] -echo [--download DOWNLOAD URL] [--test TARGETDIR] -echo [-h] -echo. -echo --out (-o) Specify an additional output directory for installers -echo -x86 Build x86 installers -echo -x64 Build x64 installers -echo --build (-b) Incrementally build Python rather than rebuilding -echo --skip-build (-B) Do not build Python (just do the installers) -echo --skip-doc (-D) Do not build documentation -echo --pgo Specify PGO command for x64 installers -echo --skip-pgo Build x64 installers without using PGO -echo --skip-nuget Do not build Nuget packages -echo --skip-zip Do not build embeddable package -echo --download Specify the full download URL for MSIs -echo --test Specify the test directory to run the installer tests -echo -h Display this help information -echo. -echo If no architecture is specified, all architectures will be built. -echo If --test is not specified, the installer tests are not run. -echo. -echo For the --pgo option, any Python command line can be used, or 'default' to -echo use the default task (-m test --pgo). -echo. -echo The following substitutions will be applied to the download URL: -echo Variable Description Example -echo {version} version number 3.5.0 -echo {arch} architecture amd64, win32 -echo {releasename} release name a1, b2, rc3 (or blank for final) -echo {msi} MSI filename core.msi +@setlocal +@echo off + +rem This script is intended for building official releases of Python. +rem To use it to build alternative releases, you should clone this file +rem and modify the following three URIs. + +rem These two will ensure that your release can be installed +rem alongside an official Python release, by modifying the GUIDs used +rem for all components. +rem +rem The following substitutions will be applied to the release URI: +rem Variable Description Example +rem {arch} architecture amd64, win32 +set RELEASE_URI=http://www.python.org/{arch} + +rem This is the URL that will be used to download installation files. +rem The files available from the default URL *will* conflict with your +rem installer. Trust me, you don't want them, even if it seems like a +rem good idea. +rem +rem The following substitutions will be applied to the download URL: +rem Variable Description Example +rem {version} version number 3.5.0 +rem {arch} architecture amd64, win32 +rem {releasename} release name a1, b2, rc3 (or blank for final) +rem {msi} MSI filename core.msi +set DOWNLOAD_URL=https://www.python.org/ftp/python/{version}/{arch}{releasename}/{msi} + +set D=%~dp0 +set PCBUILD=%D%..\..\PCBuild\ +set EXTERNALS=%D%..\..\externals\windows-installer\ + +set BUILDX86= +set BUILDX64= +set TARGET=Rebuild +set TESTTARGETDIR= +set PGO=-m test -q --pgo +set BUILDNUGET=1 +set BUILDZIP=1 + + +:CheckOpts +if "%1" EQU "-h" goto Help +if "%1" EQU "-c" (set CERTNAME=%~2) && shift && shift && goto CheckOpts +if "%1" EQU "--certificate" (set CERTNAME=%~2) && shift && shift && goto CheckOpts +if "%1" EQU "-o" (set OUTDIR=%~2) && shift && shift && goto CheckOpts +if "%1" EQU "--out" (set OUTDIR=%~2) && shift && shift && goto CheckOpts +if "%1" EQU "-D" (set SKIPDOC=1) && shift && goto CheckOpts +if "%1" EQU "--skip-doc" (set SKIPDOC=1) && shift && goto CheckOpts +if "%1" EQU "-B" (set SKIPBUILD=1) && shift && goto CheckOpts +if "%1" EQU "--skip-build" (set SKIPBUILD=1) && shift && goto CheckOpts +if "%1" EQU "--download" (set DOWNLOAD_URL=%~2) && shift && shift && goto CheckOpts +if "%1" EQU "--test" (set TESTTARGETDIR=%~2) && shift && shift && goto CheckOpts +if "%1" EQU "-b" (set TARGET=Build) && shift && goto CheckOpts +if "%1" EQU "--build" (set TARGET=Build) && shift && goto CheckOpts +if "%1" EQU "-x86" (set BUILDX86=1) && shift && goto CheckOpts +if "%1" EQU "-x64" (set BUILDX64=1) && shift && goto CheckOpts +if "%1" EQU "--pgo" (set PGO=%~2) && shift && shift && goto CheckOpts +if "%1" EQU "--skip-pgo" (set PGO=) && shift && goto CheckOpts +if "%1" EQU "--skip-nuget" (set BUILDNUGET=) && shift && goto CheckOpts +if "%1" EQU "--skip-zip" (set BUILDZIP=) && shift && goto CheckOpts + +if "%1" NEQ "" echo Invalid option: "%1" && exit /B 1 + +if not defined BUILDX86 if not defined BUILDX64 (set BUILDX86=1) && (set BUILDX64=1) + +if not exist "%GIT%" where git > "%TEMP%\git.loc" 2> nul && set /P GIT= < "%TEMP%\git.loc" & del "%TEMP%\git.loc" +if not exist "%GIT%" echo Cannot find Git on PATH && exit /B 1 + +call "%D%get_externals.bat" + +:builddoc +if "%SKIPBUILD%" EQU "1" goto skipdoc +if "%SKIPDOC%" EQU "1" goto skipdoc + +if not defined PYTHON where py -q || echo Cannot find py on path and PYTHON is not set. && exit /B 1 +if not defined SPHINXBUILD where sphinx-build -q || echo Cannot find sphinx-build on path and SPHINXBUILD is not set. && exit /B 1 + +call "%D%..\..\doc\make.bat" htmlhelp +if errorlevel 1 goto :eof +:skipdoc + +where dlltool /q && goto skipdlltoolsearch +set _DLLTOOL_PATH= +where /R "%EXTERNALS%\" dlltool > "%TEMP%\dlltool.loc" 2> nul && set /P _DLLTOOL_PATH= < "%TEMP%\dlltool.loc" & del "%TEMP%\dlltool.loc" +if not exist "%_DLLTOOL_PATH%" echo Cannot find binutils on PATH or in external && exit /B 1 +for %%f in (%_DLLTOOL_PATH%) do set PATH=%PATH%;%%~dpf +set _DLLTOOL_PATH= +:skipdlltoolsearch + +if defined BUILDX86 ( + call :build x86 + if errorlevel 1 exit /B +) + +if defined BUILDX64 ( + call :build x64 "%PGO%" + if errorlevel 1 exit /B +) + +if defined TESTTARGETDIR ( + call "%D%testrelease.bat" -t "%TESTTARGETDIR%" +) + +exit /B 0 + +:build +@setlocal +@echo off + +if "%1" EQU "x86" ( + set PGO= + set BUILD=%PCBUILD%win32\ + set BUILD_PLAT=Win32 + set OUTDIR_PLAT=win32 + set OBJDIR_PLAT=x86 +) else ( + set BUILD=%PCBUILD%amd64\ + set PGO=%~2 + set BUILD_PLAT=x64 + set OUTDIR_PLAT=amd64 + set OBJDIR_PLAT=x64 +) + +if exist "%BUILD%en-us" ( + echo Deleting %BUILD%en-us + rmdir /q/s "%BUILD%en-us" + if errorlevel 1 exit /B +) + +if exist "%D%obj\Debug_%OBJDIR_PLAT%" ( + echo Deleting "%D%obj\Debug_%OBJDIR_PLAT%" + rmdir /q/s "%D%obj\Debug_%OBJDIR_PLAT%" + if errorlevel 1 exit /B +) + +if exist "%D%obj\Release_%OBJDIR_PLAT%" ( + echo Deleting "%D%obj\Release_%OBJDIR_PLAT%" + rmdir /q/s "%D%obj\Release_%OBJDIR_PLAT%" + if errorlevel 1 exit /B +) + +if not "%CERTNAME%" EQU "" ( + set CERTOPTS="/p:SigningCertificate=%CERTNAME%" +) else ( + set CERTOPTS= +) +if not "%PGO%" EQU "" ( + set PGOOPTS=--pgo-job "%PGO%" +) else ( + set PGOOPTS= +) +if not "%SKIPBUILD%" EQU "1" ( + @echo call "%PCBUILD%build.bat" -e -p %BUILD_PLAT% -t %TARGET% %PGOOPTS% %CERTOPTS% + @call "%PCBUILD%build.bat" -e -p %BUILD_PLAT% -t %TARGET% %PGOOPTS% %CERTOPTS% + @if errorlevel 1 exit /B + @rem build.bat turns echo back on, so we disable it again + @echo off + + @echo call "%PCBUILD%build.bat" -d -e -p %BUILD_PLAT% -t %TARGET% + @call "%PCBUILD%build.bat" -d -e -p %BUILD_PLAT% -t %TARGET% + @if errorlevel 1 exit /B + @rem build.bat turns echo back on, so we disable it again + @echo off +) + +call "%PCBUILD%env.bat" +if "%OUTDIR_PLAT%" EQU "win32" ( + msbuild "%D%launcher\launcher.wixproj" /p:Platform=x86 %CERTOPTS% /p:ReleaseUri=%RELEASE_URI% + if errorlevel 1 exit /B +) else if not exist "%PCBUILD%win32\en-us\launcher.msi" ( + msbuild "%D%launcher\launcher.wixproj" /p:Platform=x86 %CERTOPTS% /p:ReleaseUri=%RELEASE_URI% + if errorlevel 1 exit /B +) + +set BUILDOPTS=/p:Platform=%1 /p:BuildForRelease=true /p:DownloadUrl=%DOWNLOAD_URL% /p:DownloadUrlBase=%DOWNLOAD_URL_BASE% /p:ReleaseUri=%RELEASE_URI% +msbuild "%D%bundle\releaselocal.wixproj" /t:Rebuild %BUILDOPTS% %CERTOPTS% /p:RebuildAll=true +if errorlevel 1 exit /B +msbuild "%D%bundle\releaseweb.wixproj" /t:Rebuild %BUILDOPTS% %CERTOPTS% /p:RebuildAll=false +if errorlevel 1 exit /B + +if defined BUILDZIP ( + msbuild "%D%make_zip.proj" /t:Build %BUILDOPTS% %CERTOPTS% /p:OutputPath="%BUILD%en-us" + if errorlevel 1 exit /B +) + +if defined BUILDNUGET ( + msbuild "%D%..\nuget\make_pkg.proj" /t:Build /p:Configuration=Release /p:Platform=%1 /p:OutputPath="%BUILD%en-us" + if errorlevel 1 exit /B +) + +if not "%OUTDIR%" EQU "" ( + mkdir "%OUTDIR%\%OUTDIR_PLAT%" + mkdir "%OUTDIR%\%OUTDIR_PLAT%\binaries" + mkdir "%OUTDIR%\%OUTDIR_PLAT%\symbols" + robocopy "%BUILD%en-us" "%OUTDIR%\%OUTDIR_PLAT%" /XF "*.wixpdb" + robocopy "%BUILD%\" "%OUTDIR%\%OUTDIR_PLAT%\binaries" *.exe *.dll *.pyd /XF "_test*" /XF "*_d.*" /XF "_freeze*" /XF "tcl*" /XF "tk*" /XF "*_test.*" + robocopy "%BUILD%\" "%OUTDIR%\%OUTDIR_PLAT%\symbols" *.pdb /XF "_test*" /XF "*_d.*" /XF "_freeze*" /XF "tcl*" /XF "tk*" /XF "*_test.*" +) + +exit /B 0 + +:Help +echo buildrelease.bat [--out DIR] [-x86] [-x64] [--certificate CERTNAME] [--build] [--pgo COMMAND] +echo [--skip-build] [--skip-doc] [--skip-nuget] [--skip-zip] [--skip-pgo] +echo [--download DOWNLOAD URL] [--test TARGETDIR] +echo [-h] +echo. +echo --out (-o) Specify an additional output directory for installers +echo -x86 Build x86 installers +echo -x64 Build x64 installers +echo --build (-b) Incrementally build Python rather than rebuilding +echo --skip-build (-B) Do not build Python (just do the installers) +echo --skip-doc (-D) Do not build documentation +echo --pgo Specify PGO command for x64 installers +echo --skip-pgo Build x64 installers without using PGO +echo --skip-nuget Do not build Nuget packages +echo --skip-zip Do not build embeddable package +echo --download Specify the full download URL for MSIs +echo --test Specify the test directory to run the installer tests +echo -h Display this help information +echo. +echo If no architecture is specified, all architectures will be built. +echo If --test is not specified, the installer tests are not run. +echo. +echo For the --pgo option, any Python command line can be used, or 'default' to +echo use the default task (-m test --pgo). +echo. +echo The following substitutions will be applied to the download URL: +echo Variable Description Example +echo {version} version number 3.5.0 +echo {arch} architecture amd64, win32 +echo {releasename} release name a1, b2, rc3 (or blank for final) +echo {msi} MSI filename core.msi diff --git a/Tools/msi/get_externals.bat b/Tools/msi/get_externals.bat index 4ead75e757233e..e1d74de6ac78f5 100644 --- a/Tools/msi/get_externals.bat +++ b/Tools/msi/get_externals.bat @@ -1,27 +1,27 @@ -@echo off -setlocal -rem Simple script to fetch source for external tools - -where /Q svn -if ERRORLEVEL 1 ( - echo.svn.exe must be on your PATH to get external tools. - echo.Try TortoiseSVN (http://tortoisesvn.net/^) and be sure to check the - echo.command line tools option. - popd - exit /b 1 -) - -if not exist "%~dp0..\..\externals" mkdir "%~dp0..\..\externals" -pushd "%~dp0..\..\externals" - -if "%SVNROOT%"=="" set SVNROOT=http://svn.python.org/projects/external/ - -if not exist "windows-installer\.svn" ( - echo.Checking out installer dependencies to %CD%\windows-installer - svn co %SVNROOT%windows-installer -) else ( - echo.Updating installer dependencies in %CD%\windows-installer - svn up windows-installer -) - -popd +@echo off +setlocal +rem Simple script to fetch source for external tools + +where /Q svn +if ERRORLEVEL 1 ( + echo.svn.exe must be on your PATH to get external tools. + echo.Try TortoiseSVN (http://tortoisesvn.net/^) and be sure to check the + echo.command line tools option. + popd + exit /b 1 +) + +if not exist "%~dp0..\..\externals" mkdir "%~dp0..\..\externals" +pushd "%~dp0..\..\externals" + +if "%SVNROOT%"=="" set SVNROOT=http://svn.python.org/projects/external/ + +if not exist "windows-installer\.svn" ( + echo.Checking out installer dependencies to %CD%\windows-installer + svn co %SVNROOT%windows-installer +) else ( + echo.Updating installer dependencies in %CD%\windows-installer + svn up windows-installer +) + +popd diff --git a/Tools/msi/testrelease.bat b/Tools/msi/testrelease.bat index a989575ed6f032..96fdf5eb86e480 100644 --- a/Tools/msi/testrelease.bat +++ b/Tools/msi/testrelease.bat @@ -1,117 +1,117 @@ -@setlocal enableextensions -@echo off - -set D=%~dp0 -set PCBUILD=%D%..\..\PCBuild\ - -set TARGETDIR=%TEMP% -set TESTX86= -set TESTX64= -set TESTALLUSER= -set TESTPERUSER= - -:CheckOpts -if "%1" EQU "-h" goto Help -if "%1" EQU "-x86" (set TESTX86=1) && shift && goto CheckOpts -if "%1" EQU "-x64" (set TESTX64=1) && shift && goto CheckOpts -if "%1" EQU "-t" (set TARGETDIR=%~2) && shift && shift && goto CheckOpts -if "%1" EQU "--target" (set TARGETDIR=%~2) && shift && shift && goto CheckOpts -if "%1" EQU "-a" (set TESTALLUSER=1) && shift && goto CheckOpts -if "%1" EQU "--alluser" (set TESTALLUSER=1) && shift && goto CheckOpts -if "%1" EQU "-p" (set TESTPERUSER=1) && shift && goto CheckOpts -if "%1" EQU "--peruser" (set TESTPERUSER=1) && shift && goto CheckOpts - -if not defined TESTX86 if not defined TESTX64 (set TESTX86=1) && (set TESTX64=1) -if not defined TESTALLUSER if not defined TESTPERUSER (set TESTALLUSER=1) && (set TESTPERUSER=1) - - -if defined TESTX86 ( - for %%f in ("%PCBUILD%win32\en-us\*.exe") do ( - if defined TESTALLUSER call :test "%%~ff" "%TARGETDIR%\%%~nf-alluser" "InstallAllUsers=1 CompileAll=1" - if errorlevel 1 exit /B - if defined TESTPERUSER call :test "%%~ff" "%TARGETDIR%\%%~nf-peruser" "InstallAllUsers=0 CompileAll=0" - if errorlevel 1 exit /B - ) -) - -if defined TESTX64 ( - for %%f in ("%PCBUILD%amd64\en-us\*.exe") do ( - if defined TESTALLUSER call :test "%%~ff" "%TARGETDIR%\%%~nf-alluser" "InstallAllUsers=1 CompileAll=1" - if errorlevel 1 exit /B - if defined TESTPERUSER call :test "%%~ff" "%TARGETDIR%\%%~nf-peruser" "InstallAllUsers=0 CompileAll=0" - if errorlevel 1 exit /B - ) -) - -exit /B 0 - -:test -@setlocal -@echo on - -@if not exist "%~1" exit /B 1 - -@set EXE=%~1 -@if not "%EXE:embed=%"=="%EXE%" exit /B 0 - -@set EXITCODE=0 -@echo Installing %1 into %2 -"%~1" /passive /log "%~2\install\log.txt" TargetDir="%~2\Python" Include_debug=1 Include_symbols=1 %~3 - -@if not errorlevel 1 ( - @echo Printing version - "%~2\Python\python.exe" -c "import sys; print(sys.version)" > "%~2\version.txt" 2>&1 -) - -@if not errorlevel 1 ( - @echo Capturing Start Menu - @dir /s/b "%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs" | findstr /ic:"python" > "%~2\startmenu.txt" 2>&1 - @dir /s/b "%APPDATA%\Microsoft\Windows\Start Menu\Programs" | findstr /ic:"python" >> "%~2\startmenu.txt" 2>&1 - - @echo Capturing registry - @for /F "usebackq" %%f in (`reg query HKCR /s /f python /k`) do @( - echo %%f >> "%~2\hkcr.txt" - reg query "%%f" /s >> "%~2\hkcr.txt" 2>&1 - ) - @reg query HKCU\Software\Python /s > "%~2\hkcu.txt" 2>&1 - @reg query HKLM\Software\Python /reg:32 /s > "%~2\hklm.txt" 2>&1 - @reg query HKLM\Software\Python /reg:64 /s >> "%~2\hklm.txt" 2>&1 - cmd /k exit 0 -) - -@if not errorlevel 1 ( - @echo Installing package - "%~2\Python\python.exe" -m pip install "azure<0.10" > "%~2\pip.txt" 2>&1 - @if not errorlevel 1 ( - "%~2\Python\python.exe" -m pip uninstall -y azure python-dateutil six >> "%~2\pip.txt" 2>&1 - ) -) -@if not errorlevel 1 ( - @echo Testing Tcl/tk - @set TCL_LIBRARY=%~2\Python\tcl\tcl8.6 - "%~2\Python\python.exe" -m test -uall -v test_ttk_guionly test_tk test_idle > "%~2\tcltk.txt" 2>&1 - @set TCL_LIBRARY= -) - -@set EXITCODE=%ERRORLEVEL% - -@echo Result was %EXITCODE% -@echo Removing %1 -"%~1" /passive /uninstall /log "%~2\uninstall\log.txt" - -@echo off -exit /B %EXITCODE% - -:Help -echo testrelease.bat [--target TARGET] [-x86] [-x64] [--alluser] [--peruser] [-h] -echo. -echo --target (-t) Specify the target directory for installs and logs -echo -x86 Run tests for x86 installers -echo -x64 Run tests for x64 installers -echo --alluser (-a) Run tests for all-user installs (requires Administrator) -echo --peruser (-p) Run tests for per-user installs -echo -h Display this help information -echo. -echo If no test architecture is specified, all architectures will be tested. -echo If no install type is selected, all install types will be tested. -echo. +@setlocal enableextensions +@echo off + +set D=%~dp0 +set PCBUILD=%D%..\..\PCBuild\ + +set TARGETDIR=%TEMP% +set TESTX86= +set TESTX64= +set TESTALLUSER= +set TESTPERUSER= + +:CheckOpts +if "%1" EQU "-h" goto Help +if "%1" EQU "-x86" (set TESTX86=1) && shift && goto CheckOpts +if "%1" EQU "-x64" (set TESTX64=1) && shift && goto CheckOpts +if "%1" EQU "-t" (set TARGETDIR=%~2) && shift && shift && goto CheckOpts +if "%1" EQU "--target" (set TARGETDIR=%~2) && shift && shift && goto CheckOpts +if "%1" EQU "-a" (set TESTALLUSER=1) && shift && goto CheckOpts +if "%1" EQU "--alluser" (set TESTALLUSER=1) && shift && goto CheckOpts +if "%1" EQU "-p" (set TESTPERUSER=1) && shift && goto CheckOpts +if "%1" EQU "--peruser" (set TESTPERUSER=1) && shift && goto CheckOpts + +if not defined TESTX86 if not defined TESTX64 (set TESTX86=1) && (set TESTX64=1) +if not defined TESTALLUSER if not defined TESTPERUSER (set TESTALLUSER=1) && (set TESTPERUSER=1) + + +if defined TESTX86 ( + for %%f in ("%PCBUILD%win32\en-us\*.exe") do ( + if defined TESTALLUSER call :test "%%~ff" "%TARGETDIR%\%%~nf-alluser" "InstallAllUsers=1 CompileAll=1" + if errorlevel 1 exit /B + if defined TESTPERUSER call :test "%%~ff" "%TARGETDIR%\%%~nf-peruser" "InstallAllUsers=0 CompileAll=0" + if errorlevel 1 exit /B + ) +) + +if defined TESTX64 ( + for %%f in ("%PCBUILD%amd64\en-us\*.exe") do ( + if defined TESTALLUSER call :test "%%~ff" "%TARGETDIR%\%%~nf-alluser" "InstallAllUsers=1 CompileAll=1" + if errorlevel 1 exit /B + if defined TESTPERUSER call :test "%%~ff" "%TARGETDIR%\%%~nf-peruser" "InstallAllUsers=0 CompileAll=0" + if errorlevel 1 exit /B + ) +) + +exit /B 0 + +:test +@setlocal +@echo on + +@if not exist "%~1" exit /B 1 + +@set EXE=%~1 +@if not "%EXE:embed=%"=="%EXE%" exit /B 0 + +@set EXITCODE=0 +@echo Installing %1 into %2 +"%~1" /passive /log "%~2\install\log.txt" TargetDir="%~2\Python" Include_debug=1 Include_symbols=1 %~3 + +@if not errorlevel 1 ( + @echo Printing version + "%~2\Python\python.exe" -c "import sys; print(sys.version)" > "%~2\version.txt" 2>&1 +) + +@if not errorlevel 1 ( + @echo Capturing Start Menu + @dir /s/b "%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs" | findstr /ic:"python" > "%~2\startmenu.txt" 2>&1 + @dir /s/b "%APPDATA%\Microsoft\Windows\Start Menu\Programs" | findstr /ic:"python" >> "%~2\startmenu.txt" 2>&1 + + @echo Capturing registry + @for /F "usebackq" %%f in (`reg query HKCR /s /f python /k`) do @( + echo %%f >> "%~2\hkcr.txt" + reg query "%%f" /s >> "%~2\hkcr.txt" 2>&1 + ) + @reg query HKCU\Software\Python /s > "%~2\hkcu.txt" 2>&1 + @reg query HKLM\Software\Python /reg:32 /s > "%~2\hklm.txt" 2>&1 + @reg query HKLM\Software\Python /reg:64 /s >> "%~2\hklm.txt" 2>&1 + cmd /k exit 0 +) + +@if not errorlevel 1 ( + @echo Installing package + "%~2\Python\python.exe" -m pip install "azure<0.10" > "%~2\pip.txt" 2>&1 + @if not errorlevel 1 ( + "%~2\Python\python.exe" -m pip uninstall -y azure python-dateutil six >> "%~2\pip.txt" 2>&1 + ) +) +@if not errorlevel 1 ( + @echo Testing Tcl/tk + @set TCL_LIBRARY=%~2\Python\tcl\tcl8.6 + "%~2\Python\python.exe" -m test -uall -v test_ttk_guionly test_tk test_idle > "%~2\tcltk.txt" 2>&1 + @set TCL_LIBRARY= +) + +@set EXITCODE=%ERRORLEVEL% + +@echo Result was %EXITCODE% +@echo Removing %1 +"%~1" /passive /uninstall /log "%~2\uninstall\log.txt" + +@echo off +exit /B %EXITCODE% + +:Help +echo testrelease.bat [--target TARGET] [-x86] [-x64] [--alluser] [--peruser] [-h] +echo. +echo --target (-t) Specify the target directory for installs and logs +echo -x86 Run tests for x86 installers +echo -x64 Run tests for x64 installers +echo --alluser (-a) Run tests for all-user installs (requires Administrator) +echo --peruser (-p) Run tests for per-user installs +echo -h Display this help information +echo. +echo If no test architecture is specified, all architectures will be tested. +echo If no install type is selected, all install types will be tested. +echo. diff --git a/Tools/msi/uploadrelease.bat b/Tools/msi/uploadrelease.bat index 670836be8c1c8b..0873d55589f0db 100644 --- a/Tools/msi/uploadrelease.bat +++ b/Tools/msi/uploadrelease.bat @@ -1,76 +1,76 @@ -@setlocal -@echo off - -set D=%~dp0 -set PCBUILD=%D%..\..\PCBuild\ - -set HOST= -set USER= -set TARGET= -set DRYRUN=false -set NOGPG= -set PURGE_OPTION=/p:Purge=true -set NOTEST= - -:CheckOpts -if "%1" EQU "-h" goto Help -if "%1" EQU "-o" (set HOST=%~2) && shift && shift && goto CheckOpts -if "%1" EQU "--host" (set HOST=%~2) && shift && shift && goto CheckOpts -if "%1" EQU "-u" (set USER=%~2) && shift && shift && goto CheckOpts -if "%1" EQU "--user" (set USER=%~2) && shift && shift && goto CheckOpts -if "%1" EQU "-t" (set TARGET=%~2) && shift && shift && goto CheckOpts -if "%1" EQU "--target" (set TARGET=%~2) && shift && shift && goto CheckOpts -if "%1" EQU "--dry-run" (set DRYRUN=true) && shift && goto CheckOpts -if "%1" EQU "--skip-gpg" (set NOGPG=true) && shift && goto CheckOpts -if "%1" EQU "--skip-purge" (set PURGE_OPTION=) && shift && godo CheckOpts -if "%1" EQU "--skip-test" (set NOTEST=true) && shift && godo CheckOpts -if "%1" EQU "-T" (set NOTEST=true) && shift && godo CheckOpts -if "%1" NEQ "" echo Unexpected argument "%1" & exit /B 1 - -if not defined PLINK where plink > "%TEMP%\plink.loc" 2> nul && set /P PLINK= < "%TEMP%\plink.loc" & del "%TEMP%\plink.loc" -if not defined PLINK where /R "%ProgramFiles(x86)%\PuTTY" plink > "%TEMP%\plink.loc" 2> nul && set /P PLINK= < "%TEMP%\plink.loc" & del "%TEMP%\plink.loc" -if not defined PLINK where /R "%ProgramFiles(x86)%" plink > "%TEMP%\plink.loc" 2> nul && set /P PLINK= < "%TEMP%\plink.loc" & del "%TEMP%\plink.loc" -if not defined PLINK echo Cannot locate plink.exe & exit /B 1 -echo Found plink.exe at %PLINK% - -if not defined PSCP where pscp > "%TEMP%\pscp.loc" 2> nul && set /P pscp= < "%TEMP%\pscp.loc" & del "%TEMP%\pscp.loc" -if not defined PSCP where /R "%ProgramFiles(x86)%\PuTTY" pscp > "%TEMP%\pscp.loc" 2> nul && set /P pscp= < "%TEMP%\pscp.loc" & del "%TEMP%\pscp.loc" -if not defined PSCP where /R "%ProgramFiles(x86)%" pscp > "%TEMP%\pscp.loc" 2> nul && set /P pscp= < "%TEMP%\pscp.loc" & del "%TEMP%\pscp.loc" -if not defined PSCP echo Cannot locate pscp.exe & exit /B 1 -echo Found pscp.exe at %PSCP% - -if defined NOGPG ( - set GPG= - echo Skipping GPG signature generation because of --skip-gpg -) else ( - if not defined GPG where gpg2 > "%TEMP%\gpg.loc" 2> nul && set /P GPG= < "%TEMP%\gpg.loc" & del "%TEMP%\gpg.loc" - if not defined GPG where /R "%PCBUILD%..\externals\windows-installer" gpg2 > "%TEMP%\gpg.loc" 2> nul && set /P GPG= < "%TEMP%\gpg.loc" & del "%TEMP%\gpg.loc" - if not defined GPG echo Cannot locate gpg2.exe. Signatures will not be uploaded & pause - echo Found gpg2.exe at %GPG% -) - -call "%PCBUILD%env.bat" > nul 2> nul -pushd "%D%" -msbuild /v:m /nologo uploadrelease.proj /t:Upload /p:Platform=x86 %PURGE_OPTION% -msbuild /v:m /nologo uploadrelease.proj /t:Upload /p:Platform=x64 /p:IncludeDoc=false %PURGE_OPTION% -if not defined NOTEST ( - msbuild /v:m /nologo uploadrelease.proj /t:Test /p:Platform=x86 - msbuild /v:m /nologo uploadrelease.proj /t:Test /p:Platform=x64 -) -msbuild /v:m /nologo uploadrelease.proj /t:ShowHashes /p:Platform=x86 -msbuild /v:m /nologo uploadrelease.proj /t:ShowHashes /p:Platform=x64 /p:IncludeDoc=false -popd -exit /B 0 - -:Help -echo uploadrelease.bat --host HOST --user USERNAME [--target TARGET] [--dry-run] [-h] -echo. -echo --host (-o) Specify the upload host (required) -echo --user (-u) Specify the user on the host (required) -echo --target (-t) Specify the target directory on the host -echo --dry-run Display commands and filenames without executing them -echo --skip-gpg Does not generate GPG signatures before uploading -echo --skip-purge Does not perform CDN purge after uploading -echo --skip-test (-T) Does not perform post-upload tests -echo -h Display this help information -echo. +@setlocal +@echo off + +set D=%~dp0 +set PCBUILD=%D%..\..\PCBuild\ + +set HOST= +set USER= +set TARGET= +set DRYRUN=false +set NOGPG= +set PURGE_OPTION=/p:Purge=true +set NOTEST= + +:CheckOpts +if "%1" EQU "-h" goto Help +if "%1" EQU "-o" (set HOST=%~2) && shift && shift && goto CheckOpts +if "%1" EQU "--host" (set HOST=%~2) && shift && shift && goto CheckOpts +if "%1" EQU "-u" (set USER=%~2) && shift && shift && goto CheckOpts +if "%1" EQU "--user" (set USER=%~2) && shift && shift && goto CheckOpts +if "%1" EQU "-t" (set TARGET=%~2) && shift && shift && goto CheckOpts +if "%1" EQU "--target" (set TARGET=%~2) && shift && shift && goto CheckOpts +if "%1" EQU "--dry-run" (set DRYRUN=true) && shift && goto CheckOpts +if "%1" EQU "--skip-gpg" (set NOGPG=true) && shift && goto CheckOpts +if "%1" EQU "--skip-purge" (set PURGE_OPTION=) && shift && godo CheckOpts +if "%1" EQU "--skip-test" (set NOTEST=true) && shift && godo CheckOpts +if "%1" EQU "-T" (set NOTEST=true) && shift && godo CheckOpts +if "%1" NEQ "" echo Unexpected argument "%1" & exit /B 1 + +if not defined PLINK where plink > "%TEMP%\plink.loc" 2> nul && set /P PLINK= < "%TEMP%\plink.loc" & del "%TEMP%\plink.loc" +if not defined PLINK where /R "%ProgramFiles(x86)%\PuTTY" plink > "%TEMP%\plink.loc" 2> nul && set /P PLINK= < "%TEMP%\plink.loc" & del "%TEMP%\plink.loc" +if not defined PLINK where /R "%ProgramFiles(x86)%" plink > "%TEMP%\plink.loc" 2> nul && set /P PLINK= < "%TEMP%\plink.loc" & del "%TEMP%\plink.loc" +if not defined PLINK echo Cannot locate plink.exe & exit /B 1 +echo Found plink.exe at %PLINK% + +if not defined PSCP where pscp > "%TEMP%\pscp.loc" 2> nul && set /P pscp= < "%TEMP%\pscp.loc" & del "%TEMP%\pscp.loc" +if not defined PSCP where /R "%ProgramFiles(x86)%\PuTTY" pscp > "%TEMP%\pscp.loc" 2> nul && set /P pscp= < "%TEMP%\pscp.loc" & del "%TEMP%\pscp.loc" +if not defined PSCP where /R "%ProgramFiles(x86)%" pscp > "%TEMP%\pscp.loc" 2> nul && set /P pscp= < "%TEMP%\pscp.loc" & del "%TEMP%\pscp.loc" +if not defined PSCP echo Cannot locate pscp.exe & exit /B 1 +echo Found pscp.exe at %PSCP% + +if defined NOGPG ( + set GPG= + echo Skipping GPG signature generation because of --skip-gpg +) else ( + if not defined GPG where gpg2 > "%TEMP%\gpg.loc" 2> nul && set /P GPG= < "%TEMP%\gpg.loc" & del "%TEMP%\gpg.loc" + if not defined GPG where /R "%PCBUILD%..\externals\windows-installer" gpg2 > "%TEMP%\gpg.loc" 2> nul && set /P GPG= < "%TEMP%\gpg.loc" & del "%TEMP%\gpg.loc" + if not defined GPG echo Cannot locate gpg2.exe. Signatures will not be uploaded & pause + echo Found gpg2.exe at %GPG% +) + +call "%PCBUILD%env.bat" > nul 2> nul +pushd "%D%" +msbuild /v:m /nologo uploadrelease.proj /t:Upload /p:Platform=x86 %PURGE_OPTION% +msbuild /v:m /nologo uploadrelease.proj /t:Upload /p:Platform=x64 /p:IncludeDoc=false %PURGE_OPTION% +if not defined NOTEST ( + msbuild /v:m /nologo uploadrelease.proj /t:Test /p:Platform=x86 + msbuild /v:m /nologo uploadrelease.proj /t:Test /p:Platform=x64 +) +msbuild /v:m /nologo uploadrelease.proj /t:ShowHashes /p:Platform=x86 +msbuild /v:m /nologo uploadrelease.proj /t:ShowHashes /p:Platform=x64 /p:IncludeDoc=false +popd +exit /B 0 + +:Help +echo uploadrelease.bat --host HOST --user USERNAME [--target TARGET] [--dry-run] [-h] +echo. +echo --host (-o) Specify the upload host (required) +echo --user (-u) Specify the user on the host (required) +echo --target (-t) Specify the target directory on the host +echo --dry-run Display commands and filenames without executing them +echo --skip-gpg Does not generate GPG signatures before uploading +echo --skip-purge Does not perform CDN purge after uploading +echo --skip-test (-T) Does not perform post-upload tests +echo -h Display this help information +echo. diff --git a/Tools/nuget/build.bat b/Tools/nuget/build.bat index 120b38cb38ce61..5068c17244456e 100644 --- a/Tools/nuget/build.bat +++ b/Tools/nuget/build.bat @@ -1,55 +1,55 @@ -@echo off -setlocal -set D=%~dp0 -set PCBUILD=%D%..\..\PCBuild\ - -set BUILDX86= -set BUILDX64= -set REBUILD= -set OUTPUT= -set PACKAGES= - -:CheckOpts -if "%~1" EQU "-h" goto Help -if "%~1" EQU "-x86" (set BUILDX86=1) && shift && goto CheckOpts -if "%~1" EQU "-x64" (set BUILDX64=1) && shift && goto CheckOpts -if "%~1" EQU "-r" (set REBUILD=-r) && shift && goto CheckOpts -if "%~1" EQU "-o" (set OUTPUT="/p:OutputPath=%~2") && shift && shift && goto CheckOpts -if "%~1" EQU "--out" (set OUTPUT="/p:OutputPath=%~2") && shift && shift && goto CheckOpts -if "%~1" EQU "-p" (set PACKAGES=%PACKAGES% %~2) && shift && shift && goto CheckOpts - -if not defined BUILDX86 if not defined BUILDX64 (set BUILDX86=1) && (set BUILDX64=1) - -call "%D%..\msi\get_externals.bat" -call "%PCBUILD%env.bat" x86 - -if defined PACKAGES set PACKAGES="/p:Packages=%PACKAGES%" - -if defined BUILDX86 ( - if defined REBUILD ( call "%PCBUILD%build.bat" -e -r - ) else if not exist "%PCBUILD%win32\python.exe" call "%PCBUILD%build.bat" -e - if errorlevel 1 goto :eof - - msbuild "%D%make_pkg.proj" /p:Configuration=Release /p:Platform=x86 %OUTPUT% %PACKAGES% - if errorlevel 1 goto :eof -) - -if defined BUILDX64 ( - if defined REBUILD ( call "%PCBUILD%build.bat" -p x64 -e -r - ) else if not exist "%PCBUILD%amd64\python.exe" call "%PCBUILD%build.bat" -p x64 -e - if errorlevel 1 goto :eof - - msbuild "%D%make_pkg.proj" /p:Configuration=Release /p:Platform=x64 %OUTPUT% %PACKAGES% - if errorlevel 1 goto :eof -) - -exit /B 0 - -:Help -echo build.bat [-x86] [-x64] [--out DIR] [-r] [-h] -echo. -echo -x86 Build x86 installers -echo -x64 Build x64 installers -echo -r Rebuild rather than incremental build -echo --out [DIR] Override output directory -echo -h Show usage +@echo off +setlocal +set D=%~dp0 +set PCBUILD=%D%..\..\PCBuild\ + +set BUILDX86= +set BUILDX64= +set REBUILD= +set OUTPUT= +set PACKAGES= + +:CheckOpts +if "%~1" EQU "-h" goto Help +if "%~1" EQU "-x86" (set BUILDX86=1) && shift && goto CheckOpts +if "%~1" EQU "-x64" (set BUILDX64=1) && shift && goto CheckOpts +if "%~1" EQU "-r" (set REBUILD=-r) && shift && goto CheckOpts +if "%~1" EQU "-o" (set OUTPUT="/p:OutputPath=%~2") && shift && shift && goto CheckOpts +if "%~1" EQU "--out" (set OUTPUT="/p:OutputPath=%~2") && shift && shift && goto CheckOpts +if "%~1" EQU "-p" (set PACKAGES=%PACKAGES% %~2) && shift && shift && goto CheckOpts + +if not defined BUILDX86 if not defined BUILDX64 (set BUILDX86=1) && (set BUILDX64=1) + +call "%D%..\msi\get_externals.bat" +call "%PCBUILD%env.bat" x86 + +if defined PACKAGES set PACKAGES="/p:Packages=%PACKAGES%" + +if defined BUILDX86 ( + if defined REBUILD ( call "%PCBUILD%build.bat" -e -r + ) else if not exist "%PCBUILD%win32\python.exe" call "%PCBUILD%build.bat" -e + if errorlevel 1 goto :eof + + msbuild "%D%make_pkg.proj" /p:Configuration=Release /p:Platform=x86 %OUTPUT% %PACKAGES% + if errorlevel 1 goto :eof +) + +if defined BUILDX64 ( + if defined REBUILD ( call "%PCBUILD%build.bat" -p x64 -e -r + ) else if not exist "%PCBUILD%amd64\python.exe" call "%PCBUILD%build.bat" -p x64 -e + if errorlevel 1 goto :eof + + msbuild "%D%make_pkg.proj" /p:Configuration=Release /p:Platform=x64 %OUTPUT% %PACKAGES% + if errorlevel 1 goto :eof +) + +exit /B 0 + +:Help +echo build.bat [-x86] [-x64] [--out DIR] [-r] [-h] +echo. +echo -x86 Build x86 installers +echo -x64 Build x64 installers +echo -r Rebuild rather than incremental build +echo --out [DIR] Override output directory +echo -h Show usage diff --git a/Tools/unicode/genwincodecs.bat b/Tools/unicode/genwincodecs.bat index ad45c6c4438014..43cab0d6f8e71a 100644 --- a/Tools/unicode/genwincodecs.bat +++ b/Tools/unicode/genwincodecs.bat @@ -1,7 +1,7 @@ -@rem Recreate some python charmap codecs from the Windows function -@rem MultiByteToWideChar. - -@cd /d %~dp0 -@mkdir build -@rem Arabic DOS code page -c:\python30\python genwincodec.py 720 > build/cp720.py +@rem Recreate some python charmap codecs from the Windows function +@rem MultiByteToWideChar. + +@cd /d %~dp0 +@mkdir build +@rem Arabic DOS code page +c:\python30\python genwincodec.py 720 > build/cp720.py From 8d15b19be667e30f8d36aefb680859bdf23866cf Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 10 Jun 2017 14:41:00 -0700 Subject: [PATCH 0399/2287] bpo-28556: Updates to typing module (GH-2076) (GH-2087) This PR contains two updates to typing module: - Support ContextManager on all versions (original PR by Jelle Zijlstra). - Add generic AsyncContextManager.. (cherry picked from commit 29fda8db16e0edab92841277fa223f844f5a92cc) --- Lib/test/test_typing.py | 39 ++++++++++++++++++++++++-- Lib/typing.py | 61 +++++++++++++++++++++++++++++++++++++++-- Misc/NEWS | 4 +++ 3 files changed, 99 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index b3cabda394497e..6d0b2659db22b7 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -1552,6 +1552,12 @@ def __anext__(self) -> T_a: return data else: raise StopAsyncIteration + +class ACM: + async def __aenter__(self) -> int: + return 42 + async def __aexit__(self, etype, eval, tb): + return None """ if ASYNCIO: @@ -1562,12 +1568,13 @@ def __anext__(self) -> T_a: else: # fake names for the sake of static analysis asyncio = None - AwaitableWrapper = AsyncIteratorWrapper = object + AwaitableWrapper = AsyncIteratorWrapper = ACM = object PY36 = sys.version_info[:2] >= (3, 6) PY36_TESTS = """ from test import ann_module, ann_module2, ann_module3 +from typing import AsyncContextManager class A: y: float @@ -1604,6 +1611,16 @@ def __str__(self): return f'{self.x} -> {self.y}' def __add__(self, other): return 0 + +async def g_with(am: AsyncContextManager[int]): + x: int + async with am as x: + return x + +try: + g_with(ACM()).send(None) +except StopIteration as e: + assert e.args[0] == 42 """ if PY36: @@ -2156,8 +2173,6 @@ class B: ... class OtherABCTests(BaseTestCase): - @skipUnless(hasattr(typing, 'ContextManager'), - 'requires typing.ContextManager') def test_contextmanager(self): @contextlib.contextmanager def manager(): @@ -2167,6 +2182,24 @@ def manager(): self.assertIsInstance(cm, typing.ContextManager) self.assertNotIsInstance(42, typing.ContextManager) + @skipUnless(ASYNCIO, 'Python 3.5 required') + def test_async_contextmanager(self): + class NotACM: + pass + self.assertIsInstance(ACM(), typing.AsyncContextManager) + self.assertNotIsInstance(NotACM(), typing.AsyncContextManager) + @contextlib.contextmanager + def manager(): + yield 42 + + cm = manager() + self.assertNotIsInstance(cm, typing.AsyncContextManager) + self.assertEqual(typing.AsyncContextManager[int].__args__, (int,)) + with self.assertRaises(TypeError): + isinstance(42, typing.AsyncContextManager[int]) + with self.assertRaises(TypeError): + typing.AsyncContextManager[int, str] + class TypeTests(BaseTestCase): diff --git a/Lib/typing.py b/Lib/typing.py index 645bc6f8ae0edd..c487afcb5b42f8 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -10,6 +10,8 @@ import collections.abc as collections_abc except ImportError: import collections as collections_abc # Fallback for PY3.2. +if sys.version_info[:2] >= (3, 6): + import _collections_abc # Needed for private function _check_methods # noqa try: from types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType except ImportError: @@ -37,6 +39,7 @@ # for 'Generic' and ABCs below. 'ByteString', 'Container', + 'ContextManager', 'Hashable', 'ItemsView', 'Iterable', @@ -57,8 +60,8 @@ # AsyncIterable, # Coroutine, # Collection, - # ContextManager, # AsyncGenerator, + # AsyncContextManager # Structural checks, a.k.a. protocols. 'Reversible', @@ -1949,7 +1952,61 @@ class ValuesView(MappingView[VT_co], extra=collections_abc.ValuesView): if hasattr(contextlib, 'AbstractContextManager'): class ContextManager(Generic[T_co], extra=contextlib.AbstractContextManager): __slots__ = () - __all__.append('ContextManager') +else: + class ContextManager(Generic[T_co]): + __slots__ = () + + def __enter__(self): + return self + + @abc.abstractmethod + def __exit__(self, exc_type, exc_value, traceback): + return None + + @classmethod + def __subclasshook__(cls, C): + if cls is ContextManager: + # In Python 3.6+, it is possible to set a method to None to + # explicitly indicate that the class does not implement an ABC + # (https://bugs.python.org/issue25958), but we do not support + # that pattern here because this fallback class is only used + # in Python 3.5 and earlier. + if (any("__enter__" in B.__dict__ for B in C.__mro__) and + any("__exit__" in B.__dict__ for B in C.__mro__)): + return True + return NotImplemented + + +if hasattr(contextlib, 'AbstractAsyncContextManager'): + class AsyncContextManager(Generic[T_co], + extra=contextlib.AbstractAsyncContextManager): + __slots__ = () + + __all__.append('AsyncContextManager') +elif sys.version_info[:2] >= (3, 5): + exec(""" +class AsyncContextManager(Generic[T_co]): + __slots__ = () + + async def __aenter__(self): + return self + + @abc.abstractmethod + async def __aexit__(self, exc_type, exc_value, traceback): + return None + + @classmethod + def __subclasshook__(cls, C): + if cls is AsyncContextManager: + if sys.version_info[:2] >= (3, 6): + return _collections_abc._check_methods(C, "__aenter__", "__aexit__") + if (any("__aenter__" in B.__dict__ for B in C.__mro__) and + any("__aexit__" in B.__dict__ for B in C.__mro__)): + return True + return NotImplemented + +__all__.append('AsyncContextManager') +""") class Dict(dict, MutableMapping[KT, VT], extra=dict): diff --git a/Misc/NEWS b/Misc/NEWS index 9d4f5d432a1ec4..b7fa701610bc80 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,10 @@ Core and Builtins Library ------- +- bpo-28556: Updates to typing module: Add generic AsyncContextManager, add + support for ContextManager on all versions. Original PRs by Jelle Zijlstra + and Ivan Levkivskyi + - bpo-29406: asyncio SSL contexts leak sockets after calling close with certain servers. Patch by Nikolay Kim From 82e606785e797be6067b1e485d8b63b58fa7ad19 Mon Sep 17 00:00:00 2001 From: terryjreedy Date: Sat, 10 Jun 2017 23:15:08 -0400 Subject: [PATCH 0400/2287] [3.6] Add IDLE news items (GH-2090) (#2096) (cherry-pick from c94c41c) --- Misc/NEWS | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Misc/NEWS b/Misc/NEWS index b7fa701610bc80..d31ae7ee9b6ffe 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -199,6 +199,17 @@ Library exception) to exception(s) raised in the dispatched methods. Patch by Petr Motejlek. +IDLE +---- + +- bpo-30290: Help-about: use pep8 names and add tests. + Increase coverage to 100%. + Patches by Louie Lu, Cheryl Sabella, and Terry Jan Reedy. + +- bpo-30303: Add _utest option to textview; add new tests. + Increase coverage to 100%. + Patches by Louie Lu and Terry Jan Reedy. + C API ----- @@ -492,6 +503,14 @@ Library now when the grp module cannot be imported, as for example on Android platforms. +IDLE +---- + +- Issue #29071: IDLE colors f-string prefixes (but not invalid ur prefixes). + +- Issue #28572: Add 10% to coverage of IDLE's test_configdialog. + Update and augment description of the configuration system. + Windows ------- From 556cddba770fc9f85f133e52993dc618caa347c0 Mon Sep 17 00:00:00 2001 From: terryjreedy Date: Sat, 10 Jun 2017 23:48:00 -0400 Subject: [PATCH 0401/2287] [3.6] Update idlelib NEWS for 3.6 (GH-2089) (#2097) (cherry-picked from 503bc63) --- Lib/idlelib/NEWS.txt | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index a3fc5012fb3014..ee2cbacbea646f 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -1,6 +1,29 @@ -What's New in IDLE 3.6.0? -=========================== -*Release date: 2016-12-16?* +What's New in IDLE 3.6.2 +Released on 2017-06-23? +======================== + +bpo-30290: Help-about: use pep8 names and add tests. +Increase coverage to 100%. +Patches by Louie Lu, Cheryl Sabella, and Terry Jan Reedy. + +bpo-30303: Add _utest option to textview; add new tests. +Increase coverage to 100%. +Patches by Louie Lu and Terry Jan Reedy. + + +What's New in IDLE 3.6.1 +Released on 2017-03-21 +======================== + +Issue #29071: IDLE colors f-string prefixes (but not invalid ur prefixes). + +Issue #28572: Add 10% to coverage of IDLE's test_configdialog. +Update and augment description of the configuration system. + + +What's New in IDLE 3.6.0 +Released on 2016-12-23 +======================== - Issue #15308: Add 'interrupt execution' (^C) to Shell menu. Patch by Roger Serwy, updated by Bayard Randel. From c0ef607c52e58e94693fbedb27f2813bc3fed8fa Mon Sep 17 00:00:00 2001 From: terryjreedy Date: Sun, 11 Jun 2017 00:34:20 -0400 Subject: [PATCH 0402/2287] [3.6] bpo-30166: backport pyshell changes (GH 1293) (#2098) (cherry-pick IDLE pyshell change from 7e4db2f) --- Lib/idlelib/pyshell.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index dd6c997abc587b..5b0e5b267642ab 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -18,12 +18,10 @@ raise SystemExit(1) from code import InteractiveInterpreter -import getopt -import io import linecache import os import os.path -from platform import python_version, system +from platform import python_version import re import socket import subprocess @@ -32,14 +30,12 @@ import tokenize import warnings -from idlelib import testing # bool value from idlelib.colorizer import ColorDelegator from idlelib.config import idleConf from idlelib import debugger from idlelib import debugger_r from idlelib.editor import EditorWindow, fixwordbreaks from idlelib.filelist import FileList -from idlelib import macosx from idlelib.outwin import OutputWindow from idlelib import rpc from idlelib.run import idle_formatwarning, PseudoInputFile, PseudoOutputFile @@ -1372,6 +1368,11 @@ def fix_x11_paste(root): """ def main(): + import getopt + from platform import system + from idlelib import testing # bool value + from idlelib import macosx + global flist, root, use_subprocess capture_warnings(True) From ccccf3156f8f5cfb820c7deac05beba9f51ec51c Mon Sep 17 00:00:00 2001 From: terryjreedy Date: Sun, 11 Jun 2017 04:16:55 -0400 Subject: [PATCH 0403/2287] bpo-30495: IDLE: Modernize textview.py with docstrings and PEP8 names (#1839) (#2102) Patch by Cheryl Sabella. (cherry picked from commit 0aa0a06e8b719533aefd175a5716f1698f474052) --- Lib/idlelib/idle_test/test_help_about.py | 11 ++-- Lib/idlelib/idle_test/test_textview.py | 20 +++---- Lib/idlelib/textview.py | 73 +++++++++++++++--------- 3 files changed, 62 insertions(+), 42 deletions(-) diff --git a/Lib/idlelib/idle_test/test_help_about.py b/Lib/idlelib/idle_test/test_help_about.py index b98405df52a0c7..15d1b6b42c797a 100644 --- a/Lib/idlelib/idle_test/test_help_about.py +++ b/Lib/idlelib/idle_test/test_help_about.py @@ -45,10 +45,10 @@ def test_printer_buttons(self): button.invoke() self.assertEqual( printer._Printer__lines[0], - dialog._current_textview.textView.get('1.0', '1.end')) + dialog._current_textview.text.get('1.0', '1.end')) self.assertEqual( printer._Printer__lines[1], - dialog._current_textview.textView.get('2.0', '2.end')) + dialog._current_textview.text.get('2.0', '2.end')) dialog._current_textview.destroy() def test_file_buttons(self): @@ -64,10 +64,11 @@ def test_file_buttons(self): with open(fn) as f: self.assertEqual( f.readline().strip(), - dialog._current_textview.textView.get('1.0', '1.end')) + dialog._current_textview.text.get('1.0', '1.end')) f.readline() - self.assertEqual(f.readline().strip(), - dialog._current_textview.textView.get('3.0', '3.end')) + self.assertEqual( + f.readline().strip(), + dialog._current_textview.text.get('3.0', '3.end')) dialog._current_textview.destroy() diff --git a/Lib/idlelib/idle_test/test_textview.py b/Lib/idlelib/idle_test/test_textview.py index 57b886aba11f31..7a2f7e460f2c7e 100644 --- a/Lib/idlelib/idle_test/test_textview.py +++ b/Lib/idlelib/idle_test/test_textview.py @@ -41,7 +41,7 @@ class TV(tv.TextViewer): # Used in TextViewTest. # Call wrapper class with mock wait_window. class TextViewTest(unittest.TestCase): - + def setUp(self): TV.transient.__init__() TV.grab_set.__init__() @@ -52,19 +52,19 @@ def test_init_modal(self): self.assertTrue(TV.transient.called) self.assertTrue(TV.grab_set.called) self.assertTrue(TV.wait_window.called) - view.Ok() + view.ok() def test_init_nonmodal(self): view = TV(root, 'Title', 'test text', modal=False) self.assertFalse(TV.transient.called) self.assertFalse(TV.grab_set.called) self.assertFalse(TV.wait_window.called) - view.Ok() + view.ok() def test_ok(self): view = TV(root, 'Title', 'test text', modal=False) view.destroy = Func() - view.Ok() + view.ok() self.assertTrue(view.destroy.called) del view.destroy # Unmask real function. view.destroy() @@ -86,13 +86,13 @@ def tearDownClass(cls): def test_view_text(self): view = tv.view_text(root, 'Title', 'test text', modal=False) self.assertIsInstance(view, tv.TextViewer) - view.Ok() + view.ok() def test_view_file(self): view = tv.view_file(root, 'Title', __file__, modal=False) self.assertIsInstance(view, tv.TextViewer) - self.assertIn('Test', view.textView.get('1.0', '1.end')) - view.Ok() + self.assertIn('Test', view.text.get('1.0', '1.end')) + view.ok() def test_bad_file(self): # Mock showerror will be used; view_file will return None. @@ -131,7 +131,7 @@ def _command(): self.assertEqual(self.called, True) self.assertEqual(self.view.title(), 'TITLE_TEXT') - self.assertEqual(self.view.textView.get('1.0', '1.end'), 'COMMAND') + self.assertEqual(self.view.text.get('1.0', '1.end'), 'COMMAND') def test_view_file_bind_with_button(self): def _command(): @@ -144,10 +144,10 @@ def _command(): self.assertEqual(self.called, True) self.assertEqual(self.view.title(), 'TITLE_FILE') with open(__file__) as f: - self.assertEqual(self.view.textView.get('1.0', '1.end'), + self.assertEqual(self.view.text.get('1.0', '1.end'), f.readline().strip()) f.readline() - self.assertEqual(self.view.textView.get('3.0', '3.end'), + self.assertEqual(self.view.text.get('3.0', '3.end'), f.readline().strip()) diff --git a/Lib/idlelib/textview.py b/Lib/idlelib/textview.py index dc1a7bfc9eff38..ab653a91413252 100644 --- a/Lib/idlelib/textview.py +++ b/Lib/idlelib/textview.py @@ -1,7 +1,9 @@ """Simple text browser for IDLE """ -from tkinter import * +from tkinter import Toplevel, Frame, Button, Text +from tkinter import DISABLED, SUNKEN, VERTICAL, WORD +from tkinter import RIGHT, LEFT, TOP, BOTTOM, BOTH, X, Y from tkinter.ttk import Scrollbar from tkinter.messagebox import showerror @@ -16,6 +18,9 @@ def __init__(self, parent, title, text, modal=True, If modal is left True, users cannot interact with other windows until the textview window is closed. + parent - parent of this dialog + title - string which is title of popup dialog + text - text to display in dialog _htest - bool; change box location when running htest. _utest - bool; don't wait_window when running unittest. """ @@ -29,16 +34,16 @@ def __init__(self, parent, title, text, modal=True, self.bg = '#ffffff' self.fg = '#000000' - self.CreateWidgets() + self.create_widgets() self.title(title) - self.protocol("WM_DELETE_WINDOW", self.Ok) + self.protocol("WM_DELETE_WINDOW", self.ok) self.parent = parent - self.textView.focus_set() + self.text.focus_set() # Bind keys for closing this dialog. - self.bind('',self.Ok) - self.bind('',self.Ok) - self.textView.insert(0.0, text) - self.textView.config(state=DISABLED) + self.bind('', self.ok) + self.bind('', self.ok) + self.text.insert(0.0, text) + self.text.config(state=DISABLED) if modal: self.transient(parent) @@ -46,34 +51,48 @@ def __init__(self, parent, title, text, modal=True, if not _utest: self.wait_window() - def CreateWidgets(self): + def create_widgets(self): "Create Frame with Text (with vertical Scrollbar) and Button." - frameText = Frame(self, relief=SUNKEN, height=700) - frameButtons = Frame(self) - self.buttonOk = Button(frameButtons, text='Close', - command=self.Ok, takefocus=FALSE) - self.scrollbarView = Scrollbar(frameText, orient=VERTICAL, - takefocus=FALSE) - self.textView = Text(frameText, wrap=WORD, highlightthickness=0, + frame = Frame(self, relief=SUNKEN, height=700) + frame_buttons = Frame(self) + self.button_ok = Button(frame_buttons, text='Close', + command=self.ok, takefocus=False) + self.scrollbar = Scrollbar(frame, orient=VERTICAL, takefocus=False) + self.text = Text(frame, wrap=WORD, highlightthickness=0, fg=self.fg, bg=self.bg) - self.scrollbarView.config(command=self.textView.yview) - self.textView.config(yscrollcommand=self.scrollbarView.set) - self.buttonOk.pack() - self.scrollbarView.pack(side=RIGHT,fill=Y) - self.textView.pack(side=LEFT,expand=TRUE,fill=BOTH) - frameButtons.pack(side=BOTTOM,fill=X) - frameText.pack(side=TOP,expand=TRUE,fill=BOTH) - - def Ok(self, event=None): + self.scrollbar.config(command=self.text.yview) + self.text.config(yscrollcommand=self.scrollbar.set) + + self.button_ok.pack() + self.scrollbar.pack(side=RIGHT, fill=Y) + self.text.pack(side=LEFT, expand=True, fill=BOTH) + frame_buttons.pack(side=BOTTOM, fill=X) + frame.pack(side=TOP, expand=True, fill=BOTH) + + def ok(self, event=None): + """Dismiss text viewer dialog.""" self.destroy() def view_text(parent, title, text, modal=True, _utest=False): - "Display text in a TextViewer." + """Create TextViewer for given text. + + parent - parent of this dialog + title - string which is the title of popup dialog + text - text to display in this dialog + modal - controls if users can interact with other windows while this + dialog is displayed + _utest - bool; controls wait_window on unittest + """ return TextViewer(parent, title, text, modal, _utest=_utest) + def view_file(parent, title, filename, encoding=None, modal=True, _utest=False): - "Display file in a TextViever or show error message." + """Create TextViewer for text in filename. + + Return error message if file cannot be read. Otherwise calls view_text + with contents of the file. + """ try: with open(filename, 'r', encoding=encoding) as file: contents = file.read() From d755d19ac4f50be2b11a6efb0f0396290c8d8263 Mon Sep 17 00:00:00 2001 From: terryjreedy Date: Sun, 11 Jun 2017 04:45:35 -0400 Subject: [PATCH 0404/2287] [3.6] Remove unused imports (#2104) Part of patch by Serhiy Strochaka, 2016-12-16 (no bpo issue) (cherry-pick of 70d28a184c42d107cc8c69a95aa52a4469e7929c) --- Lib/idlelib/idle_test/test_macosx.py | 1 - Lib/idlelib/idle_test/test_tree.py | 1 - Lib/idlelib/macosx.py | 1 - Lib/idlelib/stackviewer.py | 1 - 4 files changed, 4 deletions(-) diff --git a/Lib/idlelib/idle_test/test_macosx.py b/Lib/idlelib/idle_test/test_macosx.py index fae75d8a497320..775697b278d30d 100644 --- a/Lib/idlelib/idle_test/test_macosx.py +++ b/Lib/idlelib/idle_test/test_macosx.py @@ -4,7 +4,6 @@ ''' from idlelib import macosx from test.support import requires -import sys import tkinter as tk import unittest import unittest.mock as mock diff --git a/Lib/idlelib/idle_test/test_tree.py b/Lib/idlelib/idle_test/test_tree.py index 09ba9641af552b..bb597d87ffd104 100644 --- a/Lib/idlelib/idle_test/test_tree.py +++ b/Lib/idlelib/idle_test/test_tree.py @@ -5,7 +5,6 @@ from idlelib import tree from test.support import requires requires('gui') -import os import unittest from tkinter import Tk diff --git a/Lib/idlelib/macosx.py b/Lib/idlelib/macosx.py index c225dd9e1a115d..d4566cd815a2dd 100644 --- a/Lib/idlelib/macosx.py +++ b/Lib/idlelib/macosx.py @@ -2,7 +2,6 @@ A number of functions that enhance IDLE on Mac OSX. """ from sys import platform # Used in _init_tk_type, changed by test. -import warnings import tkinter diff --git a/Lib/idlelib/stackviewer.py b/Lib/idlelib/stackviewer.py index 0698def5d4c7f2..400fa632a098cf 100644 --- a/Lib/idlelib/stackviewer.py +++ b/Lib/idlelib/stackviewer.py @@ -1,6 +1,5 @@ import linecache import os -import re import sys import tkinter as tk From c6696feb09a8cf13e13e42ed9cc0b8c2e8795800 Mon Sep 17 00:00:00 2001 From: terryjreedy Date: Sun, 11 Jun 2017 05:53:46 -0400 Subject: [PATCH 0405/2287] [3.6] bpo-29919 Remove unused imports from idlelib [GH-137] (#2105) Part of patch by Victor Stinner. (cherry-pick from d6debb24e06152a827769b0cac24c47deccdeac1) --- Lib/idlelib/config.py | 2 +- Lib/idlelib/editor.py | 1 - Lib/idlelib/idle_test/test_config.py | 2 -- Lib/idlelib/idle_test/test_config_key.py | 2 +- Lib/idlelib/idle_test/test_editor.py | 2 -- Lib/idlelib/idle_test/test_searchbase.py | 2 +- Lib/idlelib/query.py | 2 +- 7 files changed, 4 insertions(+), 9 deletions(-) diff --git a/Lib/idlelib/config.py b/Lib/idlelib/config.py index 358bee4803b0c1..6a9fc61c2b59d7 100644 --- a/Lib/idlelib/config.py +++ b/Lib/idlelib/config.py @@ -29,7 +29,7 @@ import os import sys -from tkinter.font import Font, nametofont +from tkinter.font import Font class InvalidConfigType(Exception): pass class InvalidConfigSet(Exception): pass diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index ae475cb9f9a6a5..ab4f1a37c168c1 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -26,7 +26,6 @@ from idlelib import query from idlelib import replace from idlelib import search -from idlelib import textview from idlelib import windows # The default tab setting for a Text widget, in average-width characters. diff --git a/Lib/idlelib/idle_test/test_config.py b/Lib/idlelib/idle_test/test_config.py index a3fa1a341a1642..e678cc6f332670 100644 --- a/Lib/idlelib/idle_test/test_config.py +++ b/Lib/idlelib/idle_test/test_config.py @@ -3,9 +3,7 @@ Much is tested by opening config dialog live or in test_configdialog. Coverage: 27% ''' -from sys import modules from test.support import captured_stderr -from tkinter import Tk import unittest from idlelib import config diff --git a/Lib/idlelib/idle_test/test_config_key.py b/Lib/idlelib/idle_test/test_config_key.py index ee3f2c835c98b7..8a24c9632b7224 100644 --- a/Lib/idlelib/idle_test/test_config_key.py +++ b/Lib/idlelib/idle_test/test_config_key.py @@ -6,7 +6,7 @@ from test.support import requires requires('gui') import unittest -from tkinter import Tk, Text +from tkinter import Tk class GetKeysTest(unittest.TestCase): diff --git a/Lib/idlelib/idle_test/test_editor.py b/Lib/idlelib/idle_test/test_editor.py index e9d29d45b82345..64a2a88b7e3765 100644 --- a/Lib/idlelib/idle_test/test_editor.py +++ b/Lib/idlelib/idle_test/test_editor.py @@ -1,7 +1,5 @@ import unittest -from tkinter import Tk, Text from idlelib.editor import EditorWindow -from test.support import requires class Editor_func_test(unittest.TestCase): def test_filename_to_unicode(self): diff --git a/Lib/idlelib/idle_test/test_searchbase.py b/Lib/idlelib/idle_test/test_searchbase.py index d769fa2fc2f0de..27b02fbe54602c 100644 --- a/Lib/idlelib/idle_test/test_searchbase.py +++ b/Lib/idlelib/idle_test/test_searchbase.py @@ -5,7 +5,7 @@ ''' import unittest from test.support import requires -from tkinter import Tk, Toplevel, Frame ##, BooleanVar, StringVar +from tkinter import Tk, Frame ##, BooleanVar, StringVar from idlelib import searchengine as se from idlelib import searchbase as sdb from idlelib.idle_test.mock_idle import Func diff --git a/Lib/idlelib/query.py b/Lib/idlelib/query.py index 3b1f1e25be7f86..593506383c41ab 100644 --- a/Lib/idlelib/query.py +++ b/Lib/idlelib/query.py @@ -24,7 +24,7 @@ import os from sys import executable, platform # Platform is set for one test. -from tkinter import Toplevel, StringVar, W, E, N, S +from tkinter import Toplevel, StringVar, W, E, S from tkinter.ttk import Frame, Button, Entry, Label from tkinter import filedialog from tkinter.font import Font From a13225e209cfa5f7b458dbcbac19dc4df26feb95 Mon Sep 17 00:00:00 2001 From: terryjreedy Date: Sun, 11 Jun 2017 06:12:31 -0400 Subject: [PATCH 0406/2287] [3.6]bpo-30144: change idlelib abc import [GH-1263] (#2106) Part of patch by Serhiy Storchaka. (cherry-pick from 2e576f5) --- Lib/idlelib/pyparse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/idlelib/pyparse.py b/Lib/idlelib/pyparse.py index 6739dfd1a07a6b..536b2d7f5fef73 100644 --- a/Lib/idlelib/pyparse.py +++ b/Lib/idlelib/pyparse.py @@ -1,4 +1,4 @@ -from collections import Mapping +from collections.abc import Mapping import re import sys From 59422a29ee3a95866c4f7e037bdfffd5768afddd Mon Sep 17 00:00:00 2001 From: terryjreedy Date: Sun, 11 Jun 2017 06:26:25 -0400 Subject: [PATCH 0407/2287] [3.6]bpo-30022: idlelib.run IOError -> OSError [GH-1051] (#2107) Part of patch by Serhiy Storchaka. (cherry-pick from 55fe1ae9708d81b902b6fe8f6590e2a24b1bd4b0) --- Lib/idlelib/run.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index afa9744a346c92..12c339f1058b72 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -52,7 +52,7 @@ def idle_showwarning_subproc( try: file.write(idle_formatwarning( message, category, filename, lineno, line)) - except IOError: + except OSError: pass # the file (probably stderr) is invalid - this warning gets lost. _warnings_showwarning = None From 176f2ebdad93f20876c08efabd364a0e6c86de14 Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Sun, 11 Jun 2017 14:00:14 +0000 Subject: [PATCH 0408/2287] bpo-30508: Don't log exceptions if Task/Future "cancel()" method was called. (#2109) --- Lib/asyncio/futures.py | 1 + Lib/asyncio/tasks.py | 1 + Lib/test/test_asyncio/test_futures.py | 8 ++++++++ Lib/test/test_asyncio/test_tasks.py | 19 +++++++++++++++++++ Misc/NEWS | 3 +++ Modules/_asynciomodule.c | 18 +++++++++++++++++- 6 files changed, 49 insertions(+), 1 deletion(-) diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py index d11d289307eaf3..cff9590e4ead5f 100644 --- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -191,6 +191,7 @@ def cancel(self): change the future's state to cancelled, schedule the callbacks and return True. """ + self._log_traceback = False if self._state != _PENDING: return False self._state = _CANCELLED diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index d7867d128a8afe..9fe2a2fabf076a 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -148,6 +148,7 @@ def cancel(self): terminates with a CancelledError exception (even if cancel() was not called). """ + self._log_traceback = False if self.done(): return False if self._fut_waiter is not None: diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py index 99336f86ab824e..5d4b2d2aa0efc0 100644 --- a/Lib/test/test_asyncio/test_futures.py +++ b/Lib/test/test_asyncio/test_futures.py @@ -318,6 +318,14 @@ def test_tb_logger_abandoned(self, m_log): del fut self.assertFalse(m_log.error.called) + @mock.patch('asyncio.base_events.logger') + def test_tb_logger_not_called_after_cancel(self, m_log): + fut = self._new_future(loop=self.loop) + fut.set_exception(Exception()) + fut.cancel() + del fut + self.assertFalse(m_log.error.called) + @mock.patch('asyncio.base_events.logger') def test_tb_logger_result_unretrieved(self, m_log): fut = self._new_future(loop=self.loop) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 5462c80ad3013a..195a1ed40770dd 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -1865,6 +1865,25 @@ def kill_me(loop): }) mock_handler.reset_mock() + @mock.patch('asyncio.base_events.logger') + def test_tb_logger_not_called_after_cancel(self, m_log): + loop = asyncio.new_event_loop() + self.set_event_loop(loop) + + @asyncio.coroutine + def coro(): + raise TypeError + + @asyncio.coroutine + def runner(): + task = self.new_task(loop, coro()) + yield from asyncio.sleep(0.05, loop=loop) + task.cancel() + task = None + + loop.run_until_complete(runner()) + self.assertFalse(m_log.error.called) + @mock.patch('asyncio.coroutines.logger') def test_coroutine_never_yielded(self, m_log): with set_coroutine_debug(True): diff --git a/Misc/NEWS b/Misc/NEWS index d31ae7ee9b6ffe..5f44a790f7f9f2 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,9 @@ Core and Builtins Library ------- +- bpo-30508: Don't log exceptions if Task/Future "cancel()" method was + called. + - bpo-28556: Updates to typing module: Add generic AsyncContextManager, add support for ContextManager on all versions. Original PRs by Jelle Zijlstra and Ivan Levkivskyi diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 75327fa3014be9..492b98359713df 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -305,6 +305,8 @@ future_add_done_callback(FutureObj *fut, PyObject *arg) static PyObject * future_cancel(FutureObj *fut) { + fut->fut_log_tb = 0; + if (fut->fut_state != STATE_PENDING) { Py_RETURN_FALSE; } @@ -638,6 +640,17 @@ FutureObj_get_log_traceback(FutureObj *fut) } } +static int +FutureObj_set_log_traceback(FutureObj *fut, PyObject *val) +{ + int is_true = PyObject_IsTrue(val); + if (is_true < 0) { + return -1; + } + fut->fut_log_tb = is_true; + return 0; +} + static PyObject * FutureObj_get_loop(FutureObj *fut) { @@ -882,7 +895,8 @@ static PyMethodDef FutureType_methods[] = { {"_callbacks", (getter)FutureObj_get_callbacks, NULL, NULL}, \ {"_result", (getter)FutureObj_get_result, NULL, NULL}, \ {"_exception", (getter)FutureObj_get_exception, NULL, NULL}, \ - {"_log_traceback", (getter)FutureObj_get_log_traceback, NULL, NULL}, \ + {"_log_traceback", (getter)FutureObj_get_log_traceback, \ + (setter)FutureObj_set_log_traceback, NULL}, \ {"_source_traceback", (getter)FutureObj_get_source_traceback, NULL, NULL}, static PyGetSetDef FutureType_getsetlist[] = { @@ -1568,6 +1582,8 @@ static PyObject * _asyncio_Task_cancel_impl(TaskObj *self) /*[clinic end generated code: output=6bfc0479da9d5757 input=13f9bf496695cb52]*/ { + self->task_log_tb = 0; + if (self->task_state != STATE_PENDING) { Py_RETURN_FALSE; } From 83d30bd667924549bacf1428ac3e475cdf9792ae Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Sun, 11 Jun 2017 16:46:45 +0200 Subject: [PATCH 0409/2287] Revert "[3.6] bpo-29406: asyncio SSL contexts leak sockets after calling close with certain servers (GH-409) (#2062)" (#2112) This reverts commit 6e14fd2a14cef6ea0709ad234ab41198c2195591. --- Lib/asyncio/sslproto.py | 24 +----------------- Lib/test/test_asyncio/test_sslproto.py | 34 -------------------------- Misc/NEWS | 4 --- 3 files changed, 1 insertion(+), 61 deletions(-) diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index 3b1eb993dfc7a8..7948c4c3b4efe6 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -7,7 +7,6 @@ from . import base_events from . import compat -from . import futures from . import protocols from . import transports from .log import logger @@ -413,7 +412,7 @@ class SSLProtocol(protocols.Protocol): def __init__(self, loop, app_protocol, sslcontext, waiter, server_side=False, server_hostname=None, - call_connection_made=True, shutdown_timeout=5.0): + call_connection_made=True): if ssl is None: raise RuntimeError('stdlib ssl module not available') @@ -444,8 +443,6 @@ def __init__(self, loop, app_protocol, sslcontext, waiter, self._session_established = False self._in_handshake = False self._in_shutdown = False - self._shutdown_timeout = shutdown_timeout - self._shutdown_timeout_handle = None # transport, ex: SelectorSocketTransport self._transport = None self._call_connection_made = call_connection_made @@ -560,15 +557,6 @@ def _start_shutdown(self): self._in_shutdown = True self._write_appdata(b'') - if self._shutdown_timeout is not None: - self._shutdown_timeout_handle = self._loop.call_later( - self._shutdown_timeout, self._on_shutdown_timeout) - - def _on_shutdown_timeout(self): - if self._transport is not None: - self._fatal_error( - futures.TimeoutError(), 'Can not complete shitdown operation') - def _write_appdata(self, data): self._write_backlog.append((data, 0)) self._write_buffer_size += len(data) @@ -696,22 +684,12 @@ def _fatal_error(self, exc, message='Fatal error on transport'): }) if self._transport: self._transport._force_close(exc) - self._transport = None - - if self._shutdown_timeout_handle is not None: - self._shutdown_timeout_handle.cancel() - self._shutdown_timeout_handle = None def _finalize(self): self._sslpipe = None if self._transport is not None: self._transport.close() - self._transport = None - - if self._shutdown_timeout_handle is not None: - self._shutdown_timeout_handle.cancel() - self._shutdown_timeout_handle = None def _abort(self): try: diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index 6bcaa9edb4306d..bcd236ea2632ed 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -96,40 +96,6 @@ def test_connection_lost(self): test_utils.run_briefly(self.loop) self.assertIsInstance(waiter.exception(), ConnectionAbortedError) - def test_close_abort(self): - # From issue #bpo-29406 - # abort connection if server does not complete shutdown procedure - ssl_proto = self.ssl_protocol() - transport = self.connection_made(ssl_proto) - ssl_proto._on_handshake_complete(None) - ssl_proto._start_shutdown() - self.assertIsNotNone(ssl_proto._shutdown_timeout_handle) - - exc_handler = mock.Mock() - self.loop.set_exception_handler(exc_handler) - ssl_proto._shutdown_timeout_handle._run() - - exc_handler.assert_called_with( - self.loop, {'message': 'Can not complete shitdown operation', - 'exception': mock.ANY, - 'transport': transport, - 'protocol': ssl_proto} - ) - self.assertIsNone(ssl_proto._shutdown_timeout_handle) - - def test_close(self): - # From issue #bpo-29406 - # abort connection if server does not complete shutdown procedure - ssl_proto = self.ssl_protocol() - transport = self.connection_made(ssl_proto) - ssl_proto._on_handshake_complete(None) - ssl_proto._start_shutdown() - self.assertIsNotNone(ssl_proto._shutdown_timeout_handle) - - ssl_proto._finalize() - self.assertIsNone(ssl_proto._transport) - self.assertIsNone(ssl_proto._shutdown_timeout_handle) - def test_close_during_handshake(self): # bpo-29743 Closing transport during handshake process leaks socket waiter = asyncio.Future(loop=self.loop) diff --git a/Misc/NEWS b/Misc/NEWS index 5f44a790f7f9f2..be2ec4f9547b2c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -56,10 +56,6 @@ Library support for ContextManager on all versions. Original PRs by Jelle Zijlstra and Ivan Levkivskyi -- bpo-29406: asyncio SSL contexts leak sockets after calling close with - certain servers. - Patch by Nikolay Kim - - bpo-29870: Fix ssl sockets leaks when connection is aborted in asyncio/ssl implementation. Patch by Michaël Sghaïer. From f57e34b6725810576a45f015f96de35b723b915f Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Sun, 11 Jun 2017 11:30:57 -0500 Subject: [PATCH 0410/2287] [3.6] Use Travis to make sure all generated files are up to date (GH-2080) (GH-2092) (cherry picked from commit 0afbabe245) Also fixes some line endings missed in GH-840 backport. --- .travis.yml | 9 + Doc/make.bat | 260 ++++++++++++------------- Lib/ctypes/macholib/fetch_macholib.bat | 2 +- Lib/idlelib/idle.bat | 8 +- 4 files changed, 144 insertions(+), 135 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2b4556fc6fc462..6e3620b2379e65 100644 --- a/.travis.yml +++ b/.travis.yml @@ -70,6 +70,7 @@ matrix: # Travis provides only 2 cores, so don't overdo the parallelism and waste memory. before_script: - | + set -e if ! git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '(\.rst$)|(^Doc)|(^Misc)' then echo "Only docs were updated, stopping build process." @@ -77,6 +78,14 @@ before_script: fi ./configure --with-pydebug make -j4 + make -j4 regen-all clinic + changes=`git status --porcelain` + if ! test -z "$changes" + then + echo "Generated files not up to date" + echo "$changes" + exit 1 + fi script: # `-r -w` implicitly provided through `make buildbottest`. diff --git a/Doc/make.bat b/Doc/make.bat index b1a3738f309d3b..d9c0ad0adecfe6 100644 --- a/Doc/make.bat +++ b/Doc/make.bat @@ -1,130 +1,130 @@ -@echo off -setlocal - -pushd %~dp0 - -set this=%~n0 - -if "%SPHINXBUILD%" EQU "" set SPHINXBUILD=sphinx-build -if "%PYTHON%" EQU "" set PYTHON=py - -if "%1" NEQ "htmlhelp" goto :skiphhcsearch -if exist "%HTMLHELP%" goto :skiphhcsearch - -rem Search for HHC in likely places -set HTMLHELP= -where hhc /q && set HTMLHELP=hhc && goto :skiphhcsearch -where /R ..\externals hhc > "%TEMP%\hhc.loc" 2> nul && set /P HTMLHELP= < "%TEMP%\hhc.loc" & del "%TEMP%\hhc.loc" -if not exist "%HTMLHELP%" where /R "%ProgramFiles(x86)%" hhc > "%TEMP%\hhc.loc" 2> nul && set /P HTMLHELP= < "%TEMP%\hhc.loc" & del "%TEMP%\hhc.loc" -if not exist "%HTMLHELP%" where /R "%ProgramFiles%" hhc > "%TEMP%\hhc.loc" 2> nul && set /P HTMLHELP= < "%TEMP%\hhc.loc" & del "%TEMP%\hhc.loc" -if not exist "%HTMLHELP%" ( - echo. - echo.The HTML Help Workshop was not found. Set the HTMLHELP variable - echo.to the path to hhc.exe or download and install it from - echo.http://msdn.microsoft.com/en-us/library/ms669985 - exit /B 1 -) -:skiphhcsearch - -if "%DISTVERSION%" EQU "" for /f "usebackq" %%v in (`%PYTHON% tools/extensions/patchlevel.py`) do set DISTVERSION=%%v - -if "%BUILDDIR%" EQU "" set BUILDDIR=build - -rem Targets that don't require sphinx-build -if "%1" EQU "" goto help -if "%1" EQU "help" goto help -if "%1" EQU "check" goto check -if "%1" EQU "serve" goto serve -if "%1" == "clean" ( - rmdir /q /s %BUILDDIR% - goto end -) - -%SPHINXBUILD% >nul 2> nul -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - popd - exit /B 1 -) - -rem Targets that do require sphinx-build and have their own label -if "%1" EQU "htmlview" goto htmlview - -rem Everything else -goto build - -:help -echo.usage: %this% BUILDER [filename ...] -echo. -echo.Call %this% with the desired Sphinx builder as the first argument, e.g. -echo.``%this% html`` or ``%this% doctest``. Interesting targets that are -echo.always available include: -echo. -echo. Provided by Sphinx: -echo. html, htmlhelp, latex, text -echo. suspicious, linkcheck, changes, doctest -echo. Provided by this script: -echo. clean, check, serve, htmlview -echo. -echo.All arguments past the first one are passed through to sphinx-build as -echo.filenames to build or are ignored. See README.rst in this directory or -echo.the documentation for your version of Sphinx for more exhaustive lists -echo.of available targets and descriptions of each. -echo. -echo.This script assumes that the SPHINXBUILD environment variable contains -echo.a legitimate command for calling sphinx-build, or that sphinx-build is -echo.on your PATH if SPHINXBUILD is not set. Options for sphinx-build can -echo.be passed by setting the SPHINXOPTS environment variable. -goto end - -:build -if NOT "%PAPER%" == "" ( - set SPHINXOPTS=-D latex_elements.papersize=%PAPER% %SPHINXOPTS% -) -cmd /C %SPHINXBUILD% %SPHINXOPTS% -b%1 -dbuild\doctrees . %BUILDDIR%\%* - -if "%1" EQU "htmlhelp" ( - cmd /C "%HTMLHELP%" build\htmlhelp\python%DISTVERSION:.=%.hhp - rem hhc.exe seems to always exit with code 1, reset to 0 for less than 2 - if not errorlevel 2 cmd /C exit /b 0 -) - -echo. -if errorlevel 1 ( - echo.Build failed (exit code %ERRORLEVEL%^), check for error messages - echo.above. Any output will be found in %BUILDDIR%\%1 -) else ( - echo.Build succeeded. All output should be in %BUILDDIR%\%1 -) -goto end - -:htmlview -if NOT "%2" EQU "" ( - echo.Can't specify filenames to build with htmlview target, ignoring. -) -cmd /C %this% html - -if EXIST %BUILDDIR%\html\index.html ( - echo.Opening %BUILDDIR%\html\index.html in the default web browser... - start %BUILDDIR%\html\index.html -) - -goto end - -:check -cmd /C %PYTHON% tools\rstlint.py -i tools -goto end - -:serve -cmd /C %PYTHON% ..\Tools\scripts\serve.py %BUILDDIR%\html -goto end - -:end -popd +@echo off +setlocal + +pushd %~dp0 + +set this=%~n0 + +if "%SPHINXBUILD%" EQU "" set SPHINXBUILD=sphinx-build +if "%PYTHON%" EQU "" set PYTHON=py + +if "%1" NEQ "htmlhelp" goto :skiphhcsearch +if exist "%HTMLHELP%" goto :skiphhcsearch + +rem Search for HHC in likely places +set HTMLHELP= +where hhc /q && set HTMLHELP=hhc && goto :skiphhcsearch +where /R ..\externals hhc > "%TEMP%\hhc.loc" 2> nul && set /P HTMLHELP= < "%TEMP%\hhc.loc" & del "%TEMP%\hhc.loc" +if not exist "%HTMLHELP%" where /R "%ProgramFiles(x86)%" hhc > "%TEMP%\hhc.loc" 2> nul && set /P HTMLHELP= < "%TEMP%\hhc.loc" & del "%TEMP%\hhc.loc" +if not exist "%HTMLHELP%" where /R "%ProgramFiles%" hhc > "%TEMP%\hhc.loc" 2> nul && set /P HTMLHELP= < "%TEMP%\hhc.loc" & del "%TEMP%\hhc.loc" +if not exist "%HTMLHELP%" ( + echo. + echo.The HTML Help Workshop was not found. Set the HTMLHELP variable + echo.to the path to hhc.exe or download and install it from + echo.http://msdn.microsoft.com/en-us/library/ms669985 + exit /B 1 +) +:skiphhcsearch + +if "%DISTVERSION%" EQU "" for /f "usebackq" %%v in (`%PYTHON% tools/extensions/patchlevel.py`) do set DISTVERSION=%%v + +if "%BUILDDIR%" EQU "" set BUILDDIR=build + +rem Targets that don't require sphinx-build +if "%1" EQU "" goto help +if "%1" EQU "help" goto help +if "%1" EQU "check" goto check +if "%1" EQU "serve" goto serve +if "%1" == "clean" ( + rmdir /q /s %BUILDDIR% + goto end +) + +%SPHINXBUILD% >nul 2> nul +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + popd + exit /B 1 +) + +rem Targets that do require sphinx-build and have their own label +if "%1" EQU "htmlview" goto htmlview + +rem Everything else +goto build + +:help +echo.usage: %this% BUILDER [filename ...] +echo. +echo.Call %this% with the desired Sphinx builder as the first argument, e.g. +echo.``%this% html`` or ``%this% doctest``. Interesting targets that are +echo.always available include: +echo. +echo. Provided by Sphinx: +echo. html, htmlhelp, latex, text +echo. suspicious, linkcheck, changes, doctest +echo. Provided by this script: +echo. clean, check, serve, htmlview +echo. +echo.All arguments past the first one are passed through to sphinx-build as +echo.filenames to build or are ignored. See README.rst in this directory or +echo.the documentation for your version of Sphinx for more exhaustive lists +echo.of available targets and descriptions of each. +echo. +echo.This script assumes that the SPHINXBUILD environment variable contains +echo.a legitimate command for calling sphinx-build, or that sphinx-build is +echo.on your PATH if SPHINXBUILD is not set. Options for sphinx-build can +echo.be passed by setting the SPHINXOPTS environment variable. +goto end + +:build +if NOT "%PAPER%" == "" ( + set SPHINXOPTS=-D latex_elements.papersize=%PAPER% %SPHINXOPTS% +) +cmd /C %SPHINXBUILD% %SPHINXOPTS% -b%1 -dbuild\doctrees . %BUILDDIR%\%* + +if "%1" EQU "htmlhelp" ( + cmd /C "%HTMLHELP%" build\htmlhelp\python%DISTVERSION:.=%.hhp + rem hhc.exe seems to always exit with code 1, reset to 0 for less than 2 + if not errorlevel 2 cmd /C exit /b 0 +) + +echo. +if errorlevel 1 ( + echo.Build failed (exit code %ERRORLEVEL%^), check for error messages + echo.above. Any output will be found in %BUILDDIR%\%1 +) else ( + echo.Build succeeded. All output should be in %BUILDDIR%\%1 +) +goto end + +:htmlview +if NOT "%2" EQU "" ( + echo.Can't specify filenames to build with htmlview target, ignoring. +) +cmd /C %this% html + +if EXIST %BUILDDIR%\html\index.html ( + echo.Opening %BUILDDIR%\html\index.html in the default web browser... + start %BUILDDIR%\html\index.html +) + +goto end + +:check +cmd /C %PYTHON% tools\rstlint.py -i tools +goto end + +:serve +cmd /C %PYTHON% ..\Tools\scripts\serve.py %BUILDDIR%\html +goto end + +:end +popd diff --git a/Lib/ctypes/macholib/fetch_macholib.bat b/Lib/ctypes/macholib/fetch_macholib.bat index f474d5cd0a26f7..f9e1c0dc96c318 100644 --- a/Lib/ctypes/macholib/fetch_macholib.bat +++ b/Lib/ctypes/macholib/fetch_macholib.bat @@ -1 +1 @@ -svn export --force http://svn.red-bean.com/bob/macholib/trunk/macholib/ . +svn export --force http://svn.red-bean.com/bob/macholib/trunk/macholib/ . diff --git a/Lib/idlelib/idle.bat b/Lib/idlelib/idle.bat index 3d619a37eed366..e77b96e9b5149b 100755 --- a/Lib/idlelib/idle.bat +++ b/Lib/idlelib/idle.bat @@ -1,4 +1,4 @@ -@echo off -rem Start IDLE using the appropriate Python interpreter -set CURRDIR=%~dp0 -start "IDLE" "%CURRDIR%..\..\pythonw.exe" "%CURRDIR%idle.pyw" %1 %2 %3 %4 %5 %6 %7 %8 %9 +@echo off +rem Start IDLE using the appropriate Python interpreter +set CURRDIR=%~dp0 +start "IDLE" "%CURRDIR%..\..\pythonw.exe" "%CURRDIR%idle.pyw" %1 %2 %3 %4 %5 %6 %7 %8 %9 From a895f91a46c65a6076e8c6a28af0df1a07ed60a2 Mon Sep 17 00:00:00 2001 From: terryjreedy Date: Sun, 11 Jun 2017 13:50:51 -0400 Subject: [PATCH 0411/2287] [3.6]bpo-29995: Adjust IDLE test for 3.7 re.escape change [GH-1007] (#2114) --- Lib/idlelib/idle_test/test_replace.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/idlelib/idle_test/test_replace.py b/Lib/idlelib/idle_test/test_replace.py index 9913ed2b7c81e1..2ecbd34168c54e 100644 --- a/Lib/idlelib/idle_test/test_replace.py +++ b/Lib/idlelib/idle_test/test_replace.py @@ -221,8 +221,8 @@ def test_replace_regex(self): self.assertIn('Invalid Replace Expression', showerror.message) # test access method - self.engine.setcookedpat("\'") - equal(pv.get(), "\\'") + self.engine.setcookedpat("?") + equal(pv.get(), "\\?") def test_replace_backwards(self): equal = self.assertEqual From 57d8de80313c536d409d6a104ae577af8ffc57fb Mon Sep 17 00:00:00 2001 From: terryjreedy Date: Sun, 11 Jun 2017 14:29:38 -0400 Subject: [PATCH 0412/2287] [3.6]bpo-20185: Adjust IDLE test to 3.7 Clinic change [GH-542] (#2116) Synchronize 3.6/3.7 test_calltips to the extent possible. Part of patch by Serhiy Storchaka. (cherry-pick from fdd42c4) --- Lib/idlelib/idle_test/test_calltips.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/idlelib/idle_test/test_calltips.py b/Lib/idlelib/idle_test/test_calltips.py index 0b11602ca9e414..97e15fe10e0ff4 100644 --- a/Lib/idlelib/idle_test/test_calltips.py +++ b/Lib/idlelib/idle_test/test_calltips.py @@ -58,7 +58,7 @@ def gtest(obj, out): 'Create and return a new object. See help(type) for accurate signature.') gtest(list.__init__, 'Initialize self. See help(type(self)) for accurate signature.') - append_doc = "L.append(object) -> None -- append object to end" + append_doc = "L.append(object) -> None -- append object to end" #see3.7 gtest(list.append, append_doc) gtest([].append, append_doc) gtest(List.append, append_doc) @@ -81,9 +81,9 @@ def f(): pass def test_multiline_docstring(self): # Test fewer lines than max. - self.assertEqual(signature(list), - "list() -> new empty list\n" - "list(iterable) -> new list initialized from iterable's items") + self.assertEqual(signature(range), + "range(stop) -> range object\n" + "range(start, stop[, step]) -> range object") # Test max lines self.assertEqual(signature(bytes), '''\ From 2737291134d398da9e5b932b0309a6d9d343cb5a Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Sun, 11 Jun 2017 11:53:14 -0700 Subject: [PATCH 0413/2287] backport ssl doc fixes (#2117) * clarify recv() and send() on SSLObject (#2100) SSLObject has recv() and send(), but they don't do any network io. * remove extra word (#2101) --- Doc/library/ssl.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index 16756e1d73e767..6c30a74a0991aa 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -2107,8 +2107,8 @@ provided. When compared to :class:`SSLSocket`, this object lacks the following features: - - Any form of network IO incluging methods such as ``recv()`` and - ``send()``. + - Any form of network IO; ``recv()`` and ``send()`` read and write only to + the underlying :class:`MemoryBIO` buffers. - There is no *do_handshake_on_connect* machinery. You must always manually call :meth:`~SSLSocket.do_handshake` to start the handshake. From 47c9decb5feabb51416deffd2098ee31d73f1f5f Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 11 Jun 2017 18:59:05 -0700 Subject: [PATCH 0414/2287] bpo-30621: Update Input Output Tutorial Example(GH-2074) (GH-2118) import json before using json module (cherry picked from commit 1dbce04d0e3e93b715eb0d8024da396361759d16) --- Doc/tutorial/inputoutput.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/Doc/tutorial/inputoutput.rst b/Doc/tutorial/inputoutput.rst index bad0302b037861..92f439c31c920b 100644 --- a/Doc/tutorial/inputoutput.rst +++ b/Doc/tutorial/inputoutput.rst @@ -412,6 +412,7 @@ sent over a network connection to some distant machine. If you have an object ``x``, you can view its JSON string representation with a simple line of code:: + >>> import json >>> json.dumps([1, 'simple', 'list']) '[1, "simple", "list"]' From d89dc844d288ee2e403272f3e4552eed6911cafd Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 12 Jun 2017 09:02:13 +0300 Subject: [PATCH 0415/2287] [3.6] bpo-28994: Fixed errors handling in atexit._run_exitfuncs(). (GH-2034) (#2121) The traceback no longer displayed for SystemExit raised in a callback registered by atexit.. (cherry picked from commit 3fd54d4a7e604067e2bc0f8cfd58bdbdc09fa7f4) --- Lib/test/test_atexit.py | 10 ++++++++++ Misc/NEWS | 3 +++ Modules/atexitmodule.c | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py index c761076c4a0225..1d0b018aafaf93 100644 --- a/Lib/test/test_atexit.py +++ b/Lib/test/test_atexit.py @@ -23,6 +23,9 @@ def raise1(): def raise2(): raise SystemError +def exit(): + raise SystemExit + class GeneralTest(unittest.TestCase): @@ -76,6 +79,13 @@ def test_raise_unnormalized(self): self.assertRaises(ZeroDivisionError, atexit._run_exitfuncs) self.assertIn("ZeroDivisionError", self.stream.getvalue()) + def test_exit(self): + # be sure a SystemExit is handled properly + atexit.register(exit) + + self.assertRaises(SystemExit, atexit._run_exitfuncs) + self.assertEqual(self.stream.getvalue(), '') + def test_print_tracebacks(self): # Issue #18776: the tracebacks should be printed when errors occur. def f(): diff --git a/Misc/NEWS b/Misc/NEWS index be2ec4f9547b2c..e56c5a300feb3d 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,9 @@ Core and Builtins Library ------- +- bpo-28994: The traceback no longer displayed for SystemExit raised in + a callback registered by atexit. + - bpo-30508: Don't log exceptions if Task/Future "cancel()" method was called. diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c index 3cdf2d7e56348a..35ebf08ecd3c66 100644 --- a/Modules/atexitmodule.c +++ b/Modules/atexitmodule.c @@ -97,7 +97,7 @@ atexit_callfuncs(void) Py_XDECREF(exc_tb); } PyErr_Fetch(&exc_type, &exc_value, &exc_tb); - if (!PyErr_ExceptionMatches(PyExc_SystemExit)) { + if (!PyErr_GivenExceptionMatches(exc_type, PyExc_SystemExit)) { PySys_WriteStderr("Error in atexit._run_exitfuncs:\n"); PyErr_NormalizeException(&exc_type, &exc_value, &exc_tb); PyErr_Display(exc_type, exc_value, exc_tb); From e1b690370fd8f93bef1e69eeea2695f95a7cfff5 Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Mon, 12 Jun 2017 22:28:12 +1000 Subject: [PATCH 0416/2287] bpo-23404: `make regen-all` What's New entry (#2128) While the build changes won't affect most users, they may affect redistributors and folks building their own Python binaries from source. --- Doc/whatsnew/3.6.rst | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index a701cafa610788..1e71bc3b10a2f8 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -2306,3 +2306,39 @@ There have been several major changes to the :term:`bytecode` in Python 3.6. * The new :opcode:`SETUP_ANNOTATIONS` and :opcode:`STORE_ANNOTATION` opcodes have been added to support the new :term:`variable annotation` syntax. (Contributed by Ivan Levkivskyi in :issue:`27985`.) + + +Notable changes in Python 3.6.2 +=============================== + +New ``make regen-all`` build target +----------------------------------- + +To simplify cross-compilation, and to ensure that CPython can reliably be +compiled without requiring an existing version of Python to already be +available, the autotools-based build system no longer attempts to implicitly +recompile generated files based on file modification times. + +Instead, a new ``make regen-all`` command has been added to force regeneration +of these files when desired (e.g. after an initial version of Python has +already been built based on the pregenerated versions). + +More selective regeneration targets are also defined - see +:source:`Makefile.pre.in` for details. + +(Contributed by Victor Stinner in :issue:`23404`.) + +.. versionadded:: 3.6.2 + + +Removal of ``make touch`` build target +-------------------------------------- + +The ``make touch`` build target previously used to request implicit regeneration +of generated files by updating their modification times has been removed. + +It has been replaced by the new ``make regen-all`` target. + +(Contributed by Victor Stinner in :issue:`23404`.) + +.. versionchanged:: 3.6.2 From 8399a177de8bfa860a66e96665488c17199cb9d2 Mon Sep 17 00:00:00 2001 From: Antoine Pietri Date: Mon, 12 Jun 2017 18:23:24 +0200 Subject: [PATCH 0417/2287] [3.6] bpo-30177: add NEWS entry (#2134) --- Misc/NEWS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Misc/NEWS b/Misc/NEWS index e56c5a300feb3d..a9507311110b44 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -201,6 +201,9 @@ Library exception) to exception(s) raised in the dispatched methods. Patch by Petr Motejlek. +- bpo-30177: path.resolve(strict=False) no longer cuts the path after the first + element not present in the filesystem. Patch by Antoine Pietri. + IDLE ---- From f59cac4b6458e5c47e24a39ba46fb178c3766577 Mon Sep 17 00:00:00 2001 From: Marco Buttu Date: Mon, 12 Jun 2017 21:41:42 +0200 Subject: [PATCH 0418/2287] bpo-30217: add the operators ~ and | to the index (GH-1502) (GH-2136) (cherry picked from commit dc980dfbcfce4695ccde056c3983160ba97b5a36) --- Doc/library/stdtypes.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index ca3404aa21e555..083fe5367af9d8 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -394,10 +394,12 @@ Bitwise Operations on Integer Types pair: bitwise; operations pair: shifting; operations pair: masking; operations + operator: | operator: ^ operator: & operator: << operator: >> + operator: ~ Bitwise operations only make sense for integers. Negative numbers are treated as their 2's complement value (this assumes that there are enough bits so that From 2997fec01ee7300c6d5940e6c55e4ccf9f56f1b5 Mon Sep 17 00:00:00 2001 From: Dino Viehland Date: Mon, 12 Jun 2017 18:46:35 -0700 Subject: [PATCH 0419/2287] [3.6] bpo-30604: Move co_extra_freefuncs to interpreter state to avoid crashes in threads (#2015) * Move co_extra_freefuncs to interpreter state to avoid crashes in multi-threaded scenarios involving deletion of code objects * Don't require that extra be zero initialized * Build test list instead of defining empty test class * Ensure extra is always assigned on success * Keep the old fields in the thread state object, just don't use them Add new linked list of code extra objects on a per-interpreter basis so that interpreter state size isn't changed * Rename __PyCodeExtraState_Get and add comment about it going away in 3.7 Fix sort order of import's in test_code.py * Remove an extraneous space * Remove docstrings for comments * Touch up formatting * Fix casing of coextra local * Fix casing of another variable * Prefix PyCodeExtraState with __ to match C API for getting it * Update NEWS file for bpo-30604 --- Include/pystate.h | 16 ++++++- Lib/test/test_code.py | 103 ++++++++++++++++++++++++++++++++++++++++-- Misc/NEWS | 4 +- Objects/codeobject.c | 28 +++++++----- Python/ceval.c | 8 ++-- Python/pystate.c | 44 +++++++++++++++++- 6 files changed, 180 insertions(+), 23 deletions(-) diff --git a/Include/pystate.h b/Include/pystate.h index afc3c0c6d1d5ac..6ca463f7e15a8f 100644 --- a/Include/pystate.h +++ b/Include/pystate.h @@ -51,6 +51,16 @@ typedef struct _is { } PyInterpreterState; #endif +typedef struct _co_extra_state { + struct _co_extra_state *next; + PyInterpreterState* interp; + + Py_ssize_t co_extra_user_count; + freefunc co_extra_freefuncs[MAX_CO_EXTRA_USERS]; +} __PyCodeExtraState; + +/* This is temporary for backwards compat in 3.6 and will be removed in 3.7 */ +__PyCodeExtraState* __PyCodeExtraState_Get(); /* State unique per thread */ @@ -142,8 +152,10 @@ typedef struct _ts { PyObject *coroutine_wrapper; int in_coroutine_wrapper; - Py_ssize_t co_extra_user_count; - freefunc co_extra_freefuncs[MAX_CO_EXTRA_USERS]; + /* Now used from PyInterpreterState, kept here for ABI + compatibility with PyThreadState */ + Py_ssize_t _preserve_36_ABI_1; + freefunc _preserve_36_ABI_2[MAX_CO_EXTRA_USERS]; PyObject *async_gen_firstiter; PyObject *async_gen_finalizer; diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index 7975ea0ef5e17d..9f9df9dba6b3d6 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -103,9 +103,11 @@ """ import sys +import threading import unittest import weakref -from test.support import run_doctest, run_unittest, cpython_only +from test.support import (run_doctest, run_unittest, cpython_only, + check_impl_detail) def consts(t): @@ -212,11 +214,106 @@ def callback(code): self.assertTrue(self.called) +if check_impl_detail(cpython=True): + import ctypes + py = ctypes.pythonapi + freefunc = ctypes.CFUNCTYPE(None,ctypes.c_voidp) + + RequestCodeExtraIndex = py._PyEval_RequestCodeExtraIndex + RequestCodeExtraIndex.argtypes = (freefunc,) + RequestCodeExtraIndex.restype = ctypes.c_ssize_t + + SetExtra = py._PyCode_SetExtra + SetExtra.argtypes = (ctypes.py_object, ctypes.c_ssize_t, ctypes.c_voidp) + SetExtra.restype = ctypes.c_int + + GetExtra = py._PyCode_GetExtra + GetExtra.argtypes = (ctypes.py_object, ctypes.c_ssize_t, + ctypes.POINTER(ctypes.c_voidp)) + GetExtra.restype = ctypes.c_int + + LAST_FREED = None + def myfree(ptr): + global LAST_FREED + LAST_FREED = ptr + + FREE_FUNC = freefunc(myfree) + FREE_INDEX = RequestCodeExtraIndex(FREE_FUNC) + + class CoExtra(unittest.TestCase): + def get_func(self): + # Defining a function causes the containing function to have a + # reference to the code object. We need the code objects to go + # away, so we eval a lambda. + return eval('lambda:42') + + def test_get_non_code(self): + f = self.get_func() + + self.assertRaises(SystemError, SetExtra, 42, FREE_INDEX, + ctypes.c_voidp(100)) + self.assertRaises(SystemError, GetExtra, 42, FREE_INDEX, + ctypes.c_voidp(100)) + + def test_bad_index(self): + f = self.get_func() + self.assertRaises(SystemError, SetExtra, f.__code__, + FREE_INDEX+100, ctypes.c_voidp(100)) + self.assertEqual(GetExtra(f.__code__, FREE_INDEX+100, + ctypes.c_voidp(100)), 0) + + def test_free_called(self): + # Verify that the provided free function gets invoked + # when the code object is cleaned up. + f = self.get_func() + + SetExtra(f.__code__, FREE_INDEX, ctypes.c_voidp(100)) + del f + self.assertEqual(LAST_FREED, 100) + + def test_get_set(self): + # Test basic get/set round tripping. + f = self.get_func() + + extra = ctypes.c_voidp() + + SetExtra(f.__code__, FREE_INDEX, ctypes.c_voidp(200)) + # reset should free... + SetExtra(f.__code__, FREE_INDEX, ctypes.c_voidp(300)) + self.assertEqual(LAST_FREED, 200) + + extra = ctypes.c_voidp() + GetExtra(f.__code__, FREE_INDEX, extra) + self.assertEqual(extra.value, 300) + del f + + def test_free_different_thread(self): + # Freeing a code object on a different thread then + # where the co_extra was set should be safe. + f = self.get_func() + class ThreadTest(threading.Thread): + def __init__(self, f, test): + super().__init__() + self.f = f + self.test = test + def run(self): + del self.f + self.test.assertEqual(LAST_FREED, 500) + + SetExtra(f.__code__, FREE_INDEX, ctypes.c_voidp(500)) + tt = ThreadTest(f, self) + del f + tt.start() + tt.join() + self.assertEqual(LAST_FREED, 500) + def test_main(verbose=None): from test import test_code run_doctest(test_code, verbose) - run_unittest(CodeTest, CodeConstsTest, CodeWeakRefTest) - + tests = [CodeTest, CodeConstsTest, CodeWeakRefTest] + if check_impl_detail(cpython=True): + tests.append(CoExtra) + run_unittest(*tests) if __name__ == "__main__": test_main() diff --git a/Misc/NEWS b/Misc/NEWS index a9507311110b44..f7441600837025 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1,4 +1,4 @@ -+++++++++++ ++++++++++++ Python News +++++++++++ @@ -10,6 +10,8 @@ What's New in Python 3.6.2 release candidate 1? Core and Builtins ----------------- +- bpo-30604: Move co_extra_freefuncs to not be per-thread to avoid crashes + - bpo-29104: Fixed parsing backslashes in f-strings. - bpo-27945: Fixed various segfaults with dict when input collections are diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 22c4f856cd83e6..d38f185ba3b8e4 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -411,11 +411,11 @@ static void code_dealloc(PyCodeObject *co) { if (co->co_extra != NULL) { - PyThreadState *tstate = PyThreadState_Get(); + __PyCodeExtraState *state = __PyCodeExtraState_Get(); _PyCodeObjectExtra *co_extra = co->co_extra; for (Py_ssize_t i = 0; i < co_extra->ce_size; i++) { - freefunc free_extra = tstate->co_extra_freefuncs[i]; + freefunc free_extra = state->co_extra_freefuncs[i]; if (free_extra != NULL) { free_extra(co_extra->ce_extras[i]); @@ -825,8 +825,6 @@ _PyCode_CheckLineNumber(PyCodeObject* co, int lasti, PyAddrPair *bounds) int _PyCode_GetExtra(PyObject *code, Py_ssize_t index, void **extra) { - assert(*extra == NULL); - if (!PyCode_Check(code)) { PyErr_BadInternalCall(); return -1; @@ -837,6 +835,7 @@ _PyCode_GetExtra(PyObject *code, Py_ssize_t index, void **extra) if (co_extra == NULL || co_extra->ce_size <= index) { + *extra = NULL; return 0; } @@ -848,10 +847,10 @@ _PyCode_GetExtra(PyObject *code, Py_ssize_t index, void **extra) int _PyCode_SetExtra(PyObject *code, Py_ssize_t index, void *extra) { - PyThreadState *tstate = PyThreadState_Get(); + __PyCodeExtraState *state = __PyCodeExtraState_Get(); if (!PyCode_Check(code) || index < 0 || - index >= tstate->co_extra_user_count) { + index >= state->co_extra_user_count) { PyErr_BadInternalCall(); return -1; } @@ -866,13 +865,13 @@ _PyCode_SetExtra(PyObject *code, Py_ssize_t index, void *extra) } co_extra->ce_extras = PyMem_Malloc( - tstate->co_extra_user_count * sizeof(void*)); + state->co_extra_user_count * sizeof(void*)); if (co_extra->ce_extras == NULL) { PyMem_Free(co_extra); return -1; } - co_extra->ce_size = tstate->co_extra_user_count; + co_extra->ce_size = state->co_extra_user_count; for (Py_ssize_t i = 0; i < co_extra->ce_size; i++) { co_extra->ce_extras[i] = NULL; @@ -882,20 +881,27 @@ _PyCode_SetExtra(PyObject *code, Py_ssize_t index, void *extra) } else if (co_extra->ce_size <= index) { void** ce_extras = PyMem_Realloc( - co_extra->ce_extras, tstate->co_extra_user_count * sizeof(void*)); + co_extra->ce_extras, state->co_extra_user_count * sizeof(void*)); if (ce_extras == NULL) { return -1; } for (Py_ssize_t i = co_extra->ce_size; - i < tstate->co_extra_user_count; + i < state->co_extra_user_count; i++) { ce_extras[i] = NULL; } co_extra->ce_extras = ce_extras; - co_extra->ce_size = tstate->co_extra_user_count; + co_extra->ce_size = state->co_extra_user_count; + } + + if (co_extra->ce_extras[index] != NULL) { + freefunc free = state->co_extra_freefuncs[index]; + if (free != NULL) { + free(co_extra->ce_extras[index]); + } } co_extra->ce_extras[index] = extra; diff --git a/Python/ceval.c b/Python/ceval.c index eba892c1ce3b3c..ea79f5f2b57f8f 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5453,14 +5453,14 @@ _Py_GetDXProfile(PyObject *self, PyObject *args) Py_ssize_t _PyEval_RequestCodeExtraIndex(freefunc free) { - PyThreadState *tstate = PyThreadState_Get(); + __PyCodeExtraState *state = __PyCodeExtraState_Get(); Py_ssize_t new_index; - if (tstate->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) { + if (state->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) { return -1; } - new_index = tstate->co_extra_user_count++; - tstate->co_extra_freefuncs[new_index] = free; + new_index = state->co_extra_user_count++; + state->co_extra_freefuncs[new_index] = free; return new_index; } diff --git a/Python/pystate.c b/Python/pystate.c index ccb0092c42b3a4..92d08c41091878 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -55,6 +55,7 @@ static int autoTLSkey = -1; #endif static PyInterpreterState *interp_head = NULL; +static __PyCodeExtraState *coextra_head = NULL; /* Assuming the current thread holds the GIL, this is the PyThreadState for the current thread. */ @@ -73,6 +74,12 @@ PyInterpreterState_New(void) PyMem_RawMalloc(sizeof(PyInterpreterState)); if (interp != NULL) { + __PyCodeExtraState* coextra = PyMem_RawMalloc(sizeof(__PyCodeExtraState)); + if (coextra == NULL) { + PyMem_RawFree(interp); + return NULL; + } + HEAD_INIT(); #ifdef WITH_THREAD if (head_mutex == NULL) @@ -92,6 +99,8 @@ PyInterpreterState_New(void) interp->importlib = NULL; interp->import_func = NULL; interp->eval_frame = _PyEval_EvalFrameDefault; + coextra->co_extra_user_count = 0; + coextra->interp = interp; #ifdef HAVE_DLOPEN #if HAVE_DECL_RTLD_NOW interp->dlopenflags = RTLD_NOW; @@ -103,6 +112,8 @@ PyInterpreterState_New(void) HEAD_LOCK(); interp->next = interp_head; interp_head = interp; + coextra->next = coextra_head; + coextra_head = coextra; HEAD_UNLOCK(); } @@ -147,9 +158,10 @@ void PyInterpreterState_Delete(PyInterpreterState *interp) { PyInterpreterState **p; + __PyCodeExtraState **pextra; zapthreads(interp); HEAD_LOCK(); - for (p = &interp_head; ; p = &(*p)->next) { + for (p = &interp_head; /* N/A */; p = &(*p)->next) { if (*p == NULL) Py_FatalError( "PyInterpreterState_Delete: invalid interp"); @@ -159,6 +171,18 @@ PyInterpreterState_Delete(PyInterpreterState *interp) if (interp->tstate_head != NULL) Py_FatalError("PyInterpreterState_Delete: remaining threads"); *p = interp->next; + + for (pextra = &coextra_head; ; pextra = &(*pextra)->next) { + if (*pextra == NULL) + Py_FatalError( + "PyInterpreterState_Delete: invalid extra"); + __PyCodeExtraState* extra = *pextra; + if (extra->interp == interp) { + *pextra = extra->next; + PyMem_RawFree(extra); + break; + } + } HEAD_UNLOCK(); PyMem_RawFree(interp); #ifdef WITH_THREAD @@ -224,7 +248,6 @@ new_threadstate(PyInterpreterState *interp, int init) tstate->coroutine_wrapper = NULL; tstate->in_coroutine_wrapper = 0; - tstate->co_extra_user_count = 0; tstate->async_gen_firstiter = NULL; tstate->async_gen_finalizer = NULL; @@ -548,6 +571,23 @@ PyThreadState_Swap(PyThreadState *newts) return oldts; } +__PyCodeExtraState* +__PyCodeExtraState_Get() { + PyInterpreterState* interp = PyThreadState_Get()->interp; + + HEAD_LOCK(); + for (__PyCodeExtraState* cur = coextra_head; cur != NULL; cur = cur->next) { + if (cur->interp == interp) { + HEAD_UNLOCK(); + return cur; + } + } + HEAD_UNLOCK(); + + Py_FatalError("__PyCodeExtraState_Get: no code state for interpreter"); + return NULL; +} + /* An extension mechanism to store arbitrary additional per-thread state. PyThreadState_GetDict() returns a dictionary that can be used to hold such state; the caller should pick a unique key and store its state there. If From 81c05ccc10d044584dff3a69ee531094ed76ee2c Mon Sep 17 00:00:00 2001 From: Mariatta Date: Mon, 12 Jun 2017 22:40:18 -0700 Subject: [PATCH 0420/2287] bpo-6519: Improve Python Input Output Tutorial (GH-2143) (GH-2145) Move up the discussion about 'with' keyword, so it appears earlier in the document. (cherry picked from commit bd4e9e0ca96dabf33605d9b1fd1e0562ece8ae18) --- Doc/tutorial/inputoutput.rst | 50 +++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/Doc/tutorial/inputoutput.rst b/Doc/tutorial/inputoutput.rst index 92f439c31c920b..74d7bad42a12be 100644 --- a/Doc/tutorial/inputoutput.rst +++ b/Doc/tutorial/inputoutput.rst @@ -262,6 +262,35 @@ to file data is fine for text files, but will corrupt binary data like that in :file:`JPEG` or :file:`EXE` files. Be very careful to use binary mode when reading and writing such files. +It is good practice to use the :keyword:`with` keyword when dealing +with file objects. The advantage is that the file is properly closed +after its suite finishes, even if an exception is raised at some +point. Using :keyword:`with` is also much shorter than writing +equivalent :keyword:`try`\ -\ :keyword:`finally` blocks:: + + >>> with open('workfile') as f: + ... read_data = f.read() + >>> f.closed + True + +If you're not using the :keyword:`with` keyword, then you should call +``f.close()`` to close the file and immediately free up any system +resources used by it. If you don't explicitly close a file, Python's +garbage collector will eventually destroy the object and close the +open file for you, but the file may stay open for a while. Another +risk is that different Python implementations will do this clean-up at +different times. + +After a file object is closed, either by a :keyword:`with` statement +or by calling ``f.close()``, attempts to use the file object will +automatically fail. :: + + >>> f.close() + >>> f.read() + Traceback (most recent call last): + File "", line 1, in + ValueError: I/O operation on closed file + .. _tut-filemethods: @@ -354,27 +383,6 @@ to the very file end with ``seek(0, 2)``) and the only valid *offset* values are those returned from the ``f.tell()``, or zero. Any other *offset* value produces undefined behaviour. - -When you're done with a file, call ``f.close()`` to close it and free up any -system resources taken up by the open file. After calling ``f.close()``, -attempts to use the file object will automatically fail. :: - - >>> f.close() - >>> f.read() - Traceback (most recent call last): - File "", line 1, in - ValueError: I/O operation on closed file - -It is good practice to use the :keyword:`with` keyword when dealing with file -objects. This has the advantage that the file is properly closed after its -suite finishes, even if an exception is raised on the way. It is also much -shorter than writing equivalent :keyword:`try`\ -\ :keyword:`finally` blocks:: - - >>> with open('workfile', 'r') as f: - ... read_data = f.read() - >>> f.closed - True - File objects have some additional methods, such as :meth:`~file.isatty` and :meth:`~file.truncate` which are less frequently used; consult the Library Reference for a complete guide to file objects. From d0d63dc1e8a2e71c4cd6497e5ea503c702d0fe3b Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Tue, 13 Jun 2017 10:23:13 +0200 Subject: [PATCH 0421/2287] [3.6] Mention how to disable signal fd wakeup (GH-2140) (#2149) (cherry picked from commit d79c1d4a9406384f10a37f26a7515ce79f9fdd78) --- Doc/library/signal.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst index 039b666475a247..46d71def08abd6 100644 --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -306,8 +306,10 @@ The :mod:`signal` module defines the following functions: a library to wakeup a poll or select call, allowing the signal to be fully processed. - The old wakeup fd is returned. *fd* must be non-blocking. It is up to the - library to remove any bytes before calling poll or select again. + The old wakeup fd is returned (or -1 if file descriptor wakeup was not + enabled). If *fd* is -1, file descriptor wakeup is disabled. + If not -1, *fd* must be non-blocking. It is up to the library to remove + any bytes from *fd* before calling poll or select again. Use for example ``struct.unpack('%uB' % len(data), data)`` to decode the signal numbers list. From 932946ca14168e556293d2508c8eebb23a56a2b2 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 13 Jun 2017 10:39:30 +0200 Subject: [PATCH 0422/2287] bpo-30604: Fix __PyCodeExtraState_Get() prototype (#2152) Replace __PyCodeExtraState_Get() with __PyCodeExtraState_Get(void) to fix the following GCC warning: ./Include/pystate.h:63:1: warning: function declaration isn't a prototype [-Wstrict-prototypes] __PyCodeExtraState* __PyCodeExtraState_Get(); --- Include/pystate.h | 2 +- Python/pystate.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Include/pystate.h b/Include/pystate.h index 6ca463f7e15a8f..1838fa40480713 100644 --- a/Include/pystate.h +++ b/Include/pystate.h @@ -60,7 +60,7 @@ typedef struct _co_extra_state { } __PyCodeExtraState; /* This is temporary for backwards compat in 3.6 and will be removed in 3.7 */ -__PyCodeExtraState* __PyCodeExtraState_Get(); +__PyCodeExtraState* __PyCodeExtraState_Get(void); /* State unique per thread */ diff --git a/Python/pystate.c b/Python/pystate.c index 92d08c41091878..65f9b7ea05dd79 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -571,8 +571,8 @@ PyThreadState_Swap(PyThreadState *newts) return oldts; } -__PyCodeExtraState* -__PyCodeExtraState_Get() { +__PyCodeExtraState* +__PyCodeExtraState_Get(void) { PyInterpreterState* interp = PyThreadState_Get()->interp; HEAD_LOCK(); From 92e9e35292d4e2044c25970389f3cdb30cfc903a Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Tue, 13 Jun 2017 20:32:46 +1000 Subject: [PATCH 0423/2287] [3.6] bpo-29514: Check magic number for bugfix releases (#2157) Add a test to check the current MAGIC_NUMBER against the expected number for the release if the current release is at candidate or final level. On test failure, describe to the developer the procedure for changing the magic number. This ensures that pre-merge CI will automatically pick up on magic number changes in maintenance releases (and explain why those are problematic), rather than relying on all core developers to be aware of the implications of such changes. --- Lib/test/test_importlib/test_util.py | 44 ++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/Lib/test/test_importlib/test_util.py b/Lib/test/test_importlib/test_util.py index d615375b342091..ac18e5c34b87fa 100644 --- a/Lib/test/test_importlib/test_util.py +++ b/Lib/test/test_importlib/test_util.py @@ -4,6 +4,7 @@ machinery = util.import_importlib('importlib.machinery') importlib_util = util.import_importlib('importlib.util') +import importlib.util import os import pathlib import string @@ -757,5 +758,48 @@ def test_source_from_cache_path_like_arg(self): ) = util.test_both(PEP3147Tests, util=importlib_util) +class MagicNumberTests(unittest.TestCase): + """ + Test release compatibility issues relating to importlib + """ + @unittest.skipUnless( + sys.version_info.releaselevel in ('final', 'release'), + 'only applies to candidate or final python release levels' + ) + def test_magic_number(self): + """ + Each python minor release should generally have a MAGIC_NUMBER + that does not change once the release reaches candidate status. + + Once a release reaches candidate status, the value of the constant + EXPECTED_MAGIC_NUMBER in this test should be changed. + This test will then check that the actual MAGIC_NUMBER matches + the expected value for the release. + + In exceptional cases, it may be required to change the MAGIC_NUMBER + for a maintenance release. In this case the change should be + discussed in python-dev. If a change is required, community + stakeholders such as OS package maintainers must be notified + in advance. Such exceptional releases will then require an + adjustment to this test case. + """ + EXPECTED_MAGIC_NUMBER = 3379 + actual = int.from_bytes(importlib.util.MAGIC_NUMBER[:2], 'little') + + msg = ( + "To avoid breaking backwards compatibility with cached bytecode " + "files that can't be automatically regenerated by the current " + "user, candidate and final releases require the current " + "importlib.util.MAGIC_NUMBER to match the expected " + "magic number in this test. Set the expected " + "magic number in this test to the current MAGIC_NUMBER to " + "continue with the release.\n\n" + "Changing the MAGIC_NUMBER for a maintenance release " + "requires discussion in python-dev and notification of " + "community stakeholders." + ) + self.assertEqual(EXPECTED_MAGIC_NUMBER, actual, msg) + + if __name__ == '__main__': unittest.main() From 2bfb45d447c445b3c3afc19d16b4cd4773975993 Mon Sep 17 00:00:00 2001 From: terryjreedy Date: Tue, 13 Jun 2017 10:11:02 -0400 Subject: [PATCH 0424/2287] bpo-30642: IDLE: Fix test_query refleak (#2147) (#2161) Patch by Louie Lu. (cherry picked from commit b070fd275b68df5c5ba9f6f43197b8d7066f0b18) --- Lib/idlelib/idle_test/test_query.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/idlelib/idle_test/test_query.py b/Lib/idlelib/idle_test/test_query.py index 66af8eb85b2598..1210afe70df956 100644 --- a/Lib/idlelib/idle_test/test_query.py +++ b/Lib/idlelib/idle_test/test_query.py @@ -258,6 +258,7 @@ def setUpClass(cls): @classmethod def tearDownClass(cls): + del cls.dialog.destroy del cls.dialog cls.root.destroy() del cls.root From 6fd03459957ee53941183212457bba19f977679f Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Tue, 13 Jun 2017 17:51:26 +0200 Subject: [PATCH 0425/2287] [3.6] bpo-24484: Avoid race condition in multiprocessing cleanup (GH-2159) (#2166) * bpo-24484: Avoid race condition in multiprocessing cleanup The finalizer registry can be mutated while inspected by multiprocessing at process exit. * Use test.support.start_threads() * Add Misc/NEWS. (cherry picked from commit 1eb6c0074d17f4fd425cacfdda893d65f5f77f0a) --- Lib/multiprocessing/util.py | 34 ++++++++++------- Lib/test/_test_multiprocessing.py | 63 +++++++++++++++++++++++++++++++ Misc/NEWS | 2 + 3 files changed, 86 insertions(+), 13 deletions(-) diff --git a/Lib/multiprocessing/util.py b/Lib/multiprocessing/util.py index 0ce274ceca6057..b490caa7e64333 100644 --- a/Lib/multiprocessing/util.py +++ b/Lib/multiprocessing/util.py @@ -241,20 +241,28 @@ def _run_finalizers(minpriority=None): return if minpriority is None: - f = lambda p : p[0][0] is not None + f = lambda p : p[0] is not None else: - f = lambda p : p[0][0] is not None and p[0][0] >= minpriority - - items = [x for x in list(_finalizer_registry.items()) if f(x)] - items.sort(reverse=True) - - for key, finalizer in items: - sub_debug('calling %s', finalizer) - try: - finalizer() - except Exception: - import traceback - traceback.print_exc() + f = lambda p : p[0] is not None and p[0] >= minpriority + + # Careful: _finalizer_registry may be mutated while this function + # is running (either by a GC run or by another thread). + + # list(_finalizer_registry) should be atomic, while + # list(_finalizer_registry.items()) is not. + keys = [key for key in list(_finalizer_registry) if f(key)] + keys.sort(reverse=True) + + for key in keys: + finalizer = _finalizer_registry.get(key) + # key may have been removed from the registry + if finalizer is not None: + sub_debug('calling %s', finalizer) + try: + finalizer() + except Exception: + import traceback + traceback.print_exc() if minpriority is None: _finalizer_registry.clear() diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index f1f93674935e7a..cd2c8dbc487fad 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -3075,6 +3075,14 @@ class _TestFinalize(BaseTestCase): ALLOWED_TYPES = ('processes',) + def setUp(self): + self.registry_backup = util._finalizer_registry.copy() + util._finalizer_registry.clear() + + def tearDown(self): + self.assertFalse(util._finalizer_registry) + util._finalizer_registry.update(self.registry_backup) + @classmethod def _test_finalize(cls, conn): class Foo(object): @@ -3124,6 +3132,61 @@ def test_finalize(self): result = [obj for obj in iter(conn.recv, 'STOP')] self.assertEqual(result, ['a', 'b', 'd10', 'd03', 'd02', 'd01', 'e']) + def test_thread_safety(self): + # bpo-24484: _run_finalizers() should be thread-safe + def cb(): + pass + + class Foo(object): + def __init__(self): + self.ref = self # create reference cycle + # insert finalizer at random key + util.Finalize(self, cb, exitpriority=random.randint(1, 100)) + + finish = False + exc = None + + def run_finalizers(): + nonlocal exc + while not finish: + time.sleep(random.random() * 1e-1) + try: + # A GC run will eventually happen during this, + # collecting stale Foo's and mutating the registry + util._run_finalizers() + except Exception as e: + exc = e + + def make_finalizers(): + nonlocal exc + d = {} + while not finish: + try: + # Old Foo's get gradually replaced and later + # collected by the GC (because of the cyclic ref) + d[random.getrandbits(5)] = {Foo() for i in range(10)} + except Exception as e: + exc = e + d.clear() + + old_interval = sys.getswitchinterval() + old_threshold = gc.get_threshold() + try: + sys.setswitchinterval(1e-6) + gc.set_threshold(5, 5, 5) + threads = [threading.Thread(target=run_finalizers), + threading.Thread(target=make_finalizers)] + with test.support.start_threads(threads): + time.sleep(4.0) # Wait a bit to trigger race condition + finish = True + if exc is not None: + raise exc + finally: + sys.setswitchinterval(old_interval) + gc.set_threshold(*old_threshold) + gc.collect() # Collect remaining Foo's + + # # Test that from ... import * works for each module # diff --git a/Misc/NEWS b/Misc/NEWS index f7441600837025..f3874140a5249c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -51,6 +51,8 @@ Core and Builtins Library ------- +- bpo-24484: Avoid race condition in multiprocessing cleanup (#2159) + - bpo-28994: The traceback no longer displayed for SystemExit raised in a callback registered by atexit. From b0efd493b6af24a6ae744e7e02f4b69c70e88f3d Mon Sep 17 00:00:00 2001 From: terryjreedy Date: Tue, 13 Jun 2017 11:52:08 -0400 Subject: [PATCH 0426/2287] [3.6]bpo-30642: Fix ref leak in idle_test.test_macosx (#2163) (#2165) (cherry picked from commit 8323189ff1a19566f923c04b95e4d17fa57d1f56) --- Lib/idlelib/idle_test/test_macosx.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Lib/idlelib/idle_test/test_macosx.py b/Lib/idlelib/idle_test/test_macosx.py index 775697b278d30d..3d85f3ca72254c 100644 --- a/Lib/idlelib/idle_test/test_macosx.py +++ b/Lib/idlelib/idle_test/test_macosx.py @@ -77,6 +77,10 @@ def setUpClass(cls): requires('gui') cls.root = tk.Tk() cls.root.withdraw() + def cmd(tkpath, func): + assert isinstance(tkpath, str) + assert isinstance(func, type(cmd)) + cls.root.createcommand = cmd @classmethod def tearDownClass(cls): From d92ee3ea622b6eee5846681bad5595cfedcf20b6 Mon Sep 17 00:00:00 2001 From: terryjreedy Date: Tue, 13 Jun 2017 15:40:59 -0400 Subject: [PATCH 0427/2287] [3.6]bpo-27922: Stop gui flash from idle_test.test_parenmatch (#2171) (#2172) For unknown reasons, this does not work when running leak tests. (cherry picked from commit 049cf2bb44038351e1b2eed4fc7b1b522329e550) --- Lib/idlelib/idle_test/test_parenmatch.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/idlelib/idle_test/test_parenmatch.py b/Lib/idlelib/idle_test/test_parenmatch.py index 051f7eac2dce06..b5fd0d1c69e4f1 100644 --- a/Lib/idlelib/idle_test/test_parenmatch.py +++ b/Lib/idlelib/idle_test/test_parenmatch.py @@ -24,6 +24,7 @@ class ParenMatchTest(unittest.TestCase): @classmethod def setUpClass(cls): cls.root = Tk() + cls.root.withdraw() cls.text = Text(cls.root) cls.editwin = DummyEditwin(cls.text) cls.editwin.text_frame = Mock() From 22d909f8c24bd7768df1a5bf0e52c597ea947cfb Mon Sep 17 00:00:00 2001 From: terryjreedy Date: Tue, 13 Jun 2017 22:13:15 -0400 Subject: [PATCH 0428/2287] [3.6]bpo-25514: Improve IDLE's connection refused message (#2177) (#2178) When IDLE fail to start because the socket connection fails, direct people to a new subsection of the IDLE doc listing various causes and remedies. (cherry picked from commit 188aedf8bb623d41302e10503268b0852ea91134) --- Doc/library/idle.rst | 44 +++++++++++++++++++++ Lib/idlelib/help.html | 91 +++++++++++++++++++++++++++++++------------ Lib/idlelib/help.py | 2 +- Lib/idlelib/run.py | 17 ++++---- 4 files changed, 119 insertions(+), 35 deletions(-) diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index 1a2dac0233c4d2..a945b6d771225b 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -552,6 +552,50 @@ If there are arguments: ``sys.argv`` reflects the arguments passed to IDLE itself. +Startup failure +^^^^^^^^^^^^^^^ + +IDLE uses a socket to communicate between the IDLE GUI process and the user +code execution process. A connection must be established whenever the Shell +starts or restarts. (The latter is indicated by a divider line that says +'RESTART'). If the user process fails to connect to the GUI process, it +displays a ``Tk`` error box with a 'cannot connect' message that directs the +user here. It then exits. + +A common cause of failure is a user-written file with the same name as a +standard library module, such as *random.py* and *tkinter.py*. When such a +file is located in the same directory as a file that is about to be run, +IDLE cannot import the stdlib file. The current fix is to rename the +user file. + +Though less common than in the past, an antivirus or firewall program may +stop the connection. If the program cannot be taught to allow the +connection, then it must be turned off for IDLE to work. It is safe to +allow this internal connection because no data is visible on external +ports. A similar problem is a network mis-configuration that blocks +connections. + +Python installation issues occasionally stop IDLE: multiple versions can +clash, or a single installation might need admin access. If one undo the +clash, or cannot or does not want to run as admin, it might be easiest to +completely remove Python and start over. + +A zombie pythonw.exe process could be a problem. On Windows, use Task +Manager to detect and stop one. Sometimes a restart initiated by a program +crash or Keyboard Interrupt (control-C) may fail to connect. Dismissing +the error box or Restart Shell on the Shell menu may fix a temporary problem. + +When IDLE first starts, it attempts to read user configuration files in +~/.idlerc/ (~ is one's home directory). If there is a problem, an error +message should be displayed. Leaving aside random disk glitches, this can +be prevented by never editing the files by hand, using the configuration +dialog, under Options, instead Options. Once it happens, the solution may +be to delete one or more of the configuration files. + +If IDLE quits with no message, and it was not started from a console, try +starting from a console (``python -m idlelib)`` and see if a message appears. + + IDLE-console differences ^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index f10cd345e886c8..0a3062e156421c 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -6,7 +6,7 @@ - 25.5. IDLE — Python 3.5.2 documentation + 25.5. IDLE — Python 3.7.0a0 documentation @@ -14,7 +14,7 @@ - + + + + +
+

25.5.3.2. Startup failure

+

IDLE uses a socket to communicate between the IDLE GUI process and the user +code execution process. A connection must be established whenever the Shell +starts or restarts. (The latter is indicated by a divider line that says +‘RESTART’). If the user process fails to connect to the GUI process, it +displays a Tk error box with a ‘cannot connect’ message that directs the +user here. It then exits.

+

A common cause of failure is a user-written file with the same name as a +standard library module, such as random.py and tkinter.py. When such a +file is located in the same directory as a file that is about to be run, +IDLE cannot import the stdlib file. The current fix is to rename the +user file.

+

Though less common than in the past, an antivirus or firewall program may +stop the connection. If the program cannot be taught to allow the +connection, then it must be turned off for IDLE to work. It is safe to +allow this internal connection because no data is visible on external +ports. A similar problem is a network mis-configuration that blocks +connections.

+

Python installation issues occasionally stop IDLE: multiple versions can +clash, or a single installation might need admin access. If one undo the +clash, or cannot or does not want to run as admin, it might be easiest to +completely remove Python and start over.

+

A zombie pythonw.exe process could be a problem. On Windows, use Task +Manager to detect and stop one. Sometimes a restart initiated by a program +crash or Keyboard Interrupt (control-C) may fail to connect. Dismissing +the error box or Restart Shell on the Shell menu may fix a temporary problem.

+

When IDLE first starts, it attempts to read user configuration files in +~/.idlerc/ (~ is one’s home directory). If there is a problem, an error +message should be displayed. Leaving aside random disk glitches, this can +be prevented by never editing the files by hand, using the configuration +dialog, under Options, instead Options. Once it happens, the solution may +be to delete one or more of the configuration files.

+

If IDLE quits with no message, and it was not started from a console, try +starting from a console (python -m idlelib) and see if a message appears.

+
-

25.5.3.2. IDLE-console differences

+

25.5.3.3. IDLE-console differences

As much as possible, the result of executing Python code with IDLE is the same as executing the same code in a console window. However, the different -interface and operation occasionally affects visible results. For instance, +interface and operation occasionally affect visible results. For instance, sys.modules starts with more entries.

IDLE also replaces sys.stdin, sys.stdout, and sys.stderr with objects that get input from and send output to the Shell window. @@ -551,14 +590,14 @@

25.5.3.2. IDLE-console differences -

25.5.3.3. Running without a subprocess

+

25.5.3.4. Running without a subprocess

By default, IDLE executes user code in a separate subprocess via a socket, which uses the internal loopback interface. This connection is not externally visible and no data is sent to or received from the Internet. If firewall software complains anyway, you can ignore it.

If the attempt to make the socket connection fails, Idle will notify you. Such failures are sometimes transient, but if persistent, the problem -may be either a firewall blocking the connecton or misconfiguration of +may be either a firewall blocking the connection or misconfiguration of a particular system. Until the problem is fixed, one can run Idle with the -n command line switch.

If IDLE is started with the -n command line switch it will run in a @@ -590,12 +629,12 @@

25.5.4.1. Additional help sources

The font preferences, highlighting, keys, and general preferences can be changed via Configure IDLE on the Option menu. Keys can be user defined; -IDLE ships with four built in key sets. In addition a user can create a +IDLE ships with four built-in key sets. In addition, a user can create a custom key set in the Configure IDLE dialog under the keys tab.

25.5.4.3. Extensions

-

IDLE contains an extension facility. Peferences for extensions can be +

IDLE contains an extension facility. Preferences for extensions can be changed with Configure Extensions. See the beginning of config-extensions.def in the idlelib directory for further information. The default extensions are currently:

@@ -646,8 +685,9 @@

Table Of Contents

  • 25.5.3. Startup and code execution
  • 25.5.4. Help and preferences
  • @@ -697,7 +740,7 @@

    Navigation

    style="vertical-align: middle; margin-top: -1px"/>
  • Python »
  • - 3.5.2 Documentation » + 3.7.0a0 Documentation »
  • @@ -720,12 +763,12 @@

    Navigation

    -
    -

    IDLE-console differences

    +
    +

    Running user code

    With rare exceptions, the result of executing Python code with IDLE is -intended to be the same as executing the same code in a console window. +intended to be the same as executing the same code by the default method, +directly with Python in a text-mode system console or terminal window. However, the different interface and operation occasionally affect -visible results. For instance, sys.modules starts with more entries.

    -

    IDLE also replaces sys.stdin, sys.stdout, and sys.stderr with -objects that get input from and send output to the Shell window. -When Shell has the focus, it controls the keyboard and screen. This is +visible results. For instance, sys.modules starts with more entries, +and threading.activeCount() returns 2 instead of 1.

    +

    By default, IDLE runs user code in a separate OS process rather than in +the user interface process that runs the shell and editor. In the execution +process, it replaces sys.stdin, sys.stdout, and sys.stderr +with objects that get input from and send output to the Shell window. +The original values stored in sys.__stdin__, sys.__stdout__, and +sys.__stderr__ are not touched, but may be None.

    +

    When Shell has the focus, it controls the keyboard and screen. This is normally transparent, but functions that directly access the keyboard -and screen will not work. If sys is reset with importlib.reload(sys), -IDLE’s changes are lost and things like input, raw_input, and -print will not work correctly.

    -

    With IDLE’s Shell, one enters, edits, and recalls complete statements. -Some consoles only work with a single physical line at a time. IDLE uses -exec to run each statement. As a result, '__builtins__' is always -defined for each statement.

    +and screen will not work. These include system-specific functions that +determine whether a key has been pressed and if so, which.

    +

    IDLE’s standard stream replacements are not inherited by subprocesses +created in the execution process, whether directly by user code or by modules +such as multiprocessing. If such subprocess use input from sys.stdin +or print or write to sys.stdout or sys.stderr, +IDLE should be started in a command line window. The secondary subprocess +will then be attached to that window for input and output.

    +

    If sys is reset by user code, such as with importlib.reload(sys), +IDLE’s changes are lost and input from the keyboard and output to the screen +will not work correctly.

    Developing tkinter applications

    @@ -752,7 +762,7 @@

    Table of Contents

  • Startup and code execution @@ -841,7 +851,7 @@

    Navigation



    - Last updated on Oct 28, 2018. + Last updated on Nov 05, 2018. Found a bug?
    From d0e3105f7ca3fc54b167edc756ce545cbab0ce95 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 5 Nov 2018 20:50:04 -0800 Subject: [PATCH 1958/2287] closes bpo-35171: Fix test_TimeRE_recreation_timezone failure on some systems. (GH-10347) The test depended on '/usr/share/zoneinfo/posixrules' or equivalent because it set TZ without explicit DST transition rules. At least on OpenSUSE Tumbleweed that file is linked to '/etc/localtime', making the test fail with certain local timezones, such as 'Europe/Moscow' which doesn't have DST transitions since 2011. (cherry picked from commit f1b9ad3d38c11676b45edcbf2369239bae436e56) Co-authored-by: Alexey Izbyshev --- Lib/test/test_strptime.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py index 1438487161f965..92de8110bc6d85 100644 --- a/Lib/test/test_strptime.py +++ b/Lib/test/test_strptime.py @@ -641,7 +641,7 @@ def test_TimeRE_recreation_locale(self): finally: locale.setlocale(locale.LC_TIME, locale_info) - @support.run_with_tz('STD-1DST') + @support.run_with_tz('STD-1DST,M4.1.0,M10.1.0') def test_TimeRE_recreation_timezone(self): # The TimeRE instance should be recreated upon changing the timezone. oldtzname = time.tzname From 7476fefb65075161d57435c8dd7e92437578d3c1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 6 Nov 2018 10:59:39 -0800 Subject: [PATCH 1959/2287] bpo-23220: Explain how IDLE's Shell displays output (GH-10356) (#10369) Add a new subsection to the doc. (cherry picked from commit 75d9d59ab3a372d3d78e6a1f5e9f256e29d0a9a6) Co-authored-by: Terry Jan Reedy --- Doc/library/idle.rst | 60 +++++++++++++++---- Lib/idlelib/help.html | 53 ++++++++++++---- .../2018-11-05-23-23-00.bpo-23220.H3SAWE.rst | 1 + 3 files changed, 91 insertions(+), 23 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2018-11-05-23-23-00.bpo-23220.H3SAWE.rst diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index a4432190bbb06d..44085e172d4779 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -502,8 +502,16 @@ or immediately run an existing file before editing. Python Shell window ^^^^^^^^^^^^^^^^^^^ -The editing features described above work when entering code interactively. -IDLE's Shell window also responds to the following keys. +With IDLE's Shell, one enters, edits, and recalls complete statements. +Most consoles and terminals only work with a single physical line at a time. + +When one pastes code into Shell, it is not compiled and possibly executed +until one hits :kbd:`Return`. One may edit pasted code first. +If one pastes more that one statement into Shell, the result will be a +:exc:`SyntaxError` when multiple statements are compiled as if they were one. + +The editing features described in previous subsections work when entering +code interactively. IDLE's Shell window also responds to the following keys. * :kbd:`C-c` interrupts executing command @@ -520,16 +528,6 @@ IDLE's Shell window also responds to the following keys. * :kbd:`Return` while on any previous command retrieves that command -Shell has a special facility for squeezing output lines down to a -'Squeezed text' label. This is done automatically for output over N lines -(N = 50 by default). N can be changed in the PyShell section of the General -page of the Settings dialog. Output with fewer lines can be squeezed by -right clicking on the output. This can be useful for extra long lines. - -Squeezed output is expanded in place by double-clicking the label. -It can also be sent to the clipboard or a separate view window by -right-clicking the label. - Text colors ^^^^^^^^^^^ @@ -666,6 +664,44 @@ If ``sys`` is reset by user code, such as with ``importlib.reload(sys)``, IDLE's changes are lost and input from the keyboard and output to the screen will not work correctly. +User output in Shell +^^^^^^^^^^^^^^^^^^^^ + +When a program outputs text, the result is determined by the +corresponding output device. When IDLE executes user code, ``sys.stdout`` +and ``sys.stderr`` are connected to the display area of IDLE's Shell. Some of +its features are inherited from the underlying Tk Text widget. Others +are programmed additions. + +Text widgets display a subset of Unicode, the Basic Multilingual Plane (BMP). +Which characters get a proper glyph instead of a replacement box depends on +the operating system and installed fonts. Newline characters cause following +text to appear on a new line, but other control characters are replaced +with a box. But note that the ``repr()`` function, which is used for +interactive echo of expression values, replaces control characters +with escape codes before they are output. + +Normal and error output are generally kept separate (on separate lines) +from code input and each other. They each get different highlight colors. + +For SyntaxError tracebacks, the normal '^' marking where the error was +detected is replaced by coloring the text with an error highlight. +When code run from a file causes other exceptions, one may right click +on a traceback line to jump to the corresponding line in an IDLE editor. +The file will be opened if necessary. + +Shell has a special facility for squeezing output lines down to a +'Squeezed text' label. This is done automatically +for output over N lines (N = 50 by default). +N can be changed in the PyShell section of the General +page of the Settings dialog. Output with fewer lines can be squeezed by +right clicking on the output. This can be useful lines long enough to slow +down scrolling. + +Squeezed output is expanded in place by double-clicking the label. +It can also be sent to the clipboard or a separate view window by +right-clicking the label. + Developing tkinter applications ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 1cd9b6913de8b9..83bd4a1b91df9d 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -501,8 +501,14 @@

    Calltips

    Python Shell window

    -

    The editing features described above work when entering code interactively. -IDLE’s Shell window also responds to the following keys.

    +

    With IDLE’s Shell, one enters, edits, and recalls complete statements. +Most consoles and terminals only work with a single physical line at a time.

    +

    When one pastes code into Shell, it is not compiled and possibly executed +until one hits Return. One may edit pasted code first. +If one pastes more that one statement into Shell, the result will be a +SyntaxError when multiple statements are compiled as if they were one.

    +

    The editing features described in previous subsections work when entering +code interactively. IDLE’s Shell window also responds to the following keys.

    • C-c interrupts executing command

    • @@ -518,14 +524,6 @@

      Python Shell window

      Text colors

      @@ -644,6 +642,38 @@

      Running user code +

      User output in Shell

      +

      When a program outputs text, the result is determined by the +corresponding output device. When IDLE executes user code, sys.stdout +and sys.stderr are connected to the display area of IDLE’s Shell. Some of +its features are inherited from the underlying Tk Text widget. Others +are programmed additions.

      +

      Text widgets display a subset of Unicode, the Basic Multilingual Plane (BMP). +Which characters get a proper glyph instead of a replacement box depends on +the operating system and installed fonts. Newline characters cause following +text to appear on a new line, but other control characters are replaced +with a box. But note that the repr() function, which is used for +interactive echo of expression values, replaces control characters +with escape codes before they are output.

      +

      Normal and error output are generally kept separate (on separate lines) +from code input and each other. They each get different highlight colors.

      +

      For SyntaxError tracebacks, the normal ‘^’ marking where the error was +detected is replaced by coloring the text with an error highlight. +When code run from a file causes other exceptions, one may right click +on a traceback line to jump to the corresponding line in an IDLE editor. +The file will be opened if necessary.

      +

      Shell has a special facility for squeezing output lines down to a +‘Squeezed text’ label. This is done automatically +for output over N lines (N = 50 by default). +N can be changed in the PyShell section of the General +page of the Settings dialog. Output with fewer lines can be squeezed by +right clicking on the output. This can be useful lines long enough to slow +down scrolling.

      +

      Squeezed output is expanded in place by double-clicking the label. +It can also be sent to the clipboard or a separate view window by +right-clicking the label.

      +

  • Developing tkinter applications

    IDLE is intentionally different from standard Python in order to @@ -763,6 +793,7 @@

    Table of Contents

  • Command line usage
  • Startup failure
  • Running user code
  • +
  • User output in Shell
  • Developing tkinter applications
  • Running without a subprocess
  • @@ -851,7 +882,7 @@

    Navigation



    - Last updated on Nov 05, 2018. + Last updated on Nov 06, 2018. Found a bug?
    diff --git a/Misc/NEWS.d/next/IDLE/2018-11-05-23-23-00.bpo-23220.H3SAWE.rst b/Misc/NEWS.d/next/IDLE/2018-11-05-23-23-00.bpo-23220.H3SAWE.rst new file mode 100644 index 00000000000000..77c71268dddd4e --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2018-11-05-23-23-00.bpo-23220.H3SAWE.rst @@ -0,0 +1 @@ +Explain how IDLE's Shell displays output. From 25bd1073996f26ad4895d3eb2d09315361c3cc84 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 6 Nov 2018 21:18:38 -0800 Subject: [PATCH 1960/2287] bpo-33000: Document that IDLE's shell has no line limit. (GH-10373) A program that runs indefinitely can overfill memory. (cherry picked from commit 76cd0c30d60961d1a10e2673834a455d2b51f695) Co-authored-by: Terry Jan Reedy --- Doc/library/idle.rst | 18 +++++++++++++----- Lib/idlelib/help.html | 17 ++++++++++++----- .../2018-11-06-23-10-54.bpo-33000.pQasCt.rst | 2 ++ 3 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2018-11-06-23-10-54.bpo-33000.pQasCt.rst diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index 44085e172d4779..9be54fe01b0229 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -671,15 +671,23 @@ When a program outputs text, the result is determined by the corresponding output device. When IDLE executes user code, ``sys.stdout`` and ``sys.stderr`` are connected to the display area of IDLE's Shell. Some of its features are inherited from the underlying Tk Text widget. Others -are programmed additions. +are programmed additions. Where it matters, Shell is designed for development +rather than production runs. + +For instance, Shell never throws away output. A program that sends unlimited +output to Shell will eventually fill memory, resulting in a memory error. +In contrast, some system text windows only keep the last n lines of output. +A Windows console, for instance, keeps a user-settable 1 to 9999 lines, +with 300 the default. Text widgets display a subset of Unicode, the Basic Multilingual Plane (BMP). Which characters get a proper glyph instead of a replacement box depends on the operating system and installed fonts. Newline characters cause following -text to appear on a new line, but other control characters are replaced -with a box. But note that the ``repr()`` function, which is used for -interactive echo of expression values, replaces control characters -with escape codes before they are output. +text to appear on a new line, but other control characters are either +replaced with a box or deleted. However, ``repr()``, which is used for +interactive echo of expression values, replaces control characters, +some BMP codepoints, and all non-BMP characters with escape codes +before they are output. Normal and error output are generally kept separate (on separate lines) from code input and each other. They each get different highlight colors. diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 83bd4a1b91df9d..f0b42151f35989 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -648,14 +648,21 @@

    User output in Shellsys.stdout and sys.stderr are connected to the display area of IDLE’s Shell. Some of its features are inherited from the underlying Tk Text widget. Others -are programmed additions.

    +are programmed additions. Where it matters, Shell is designed for development +rather than production runs.

    +

    For instance, Shell never throws away output. A program that sends unlimited +output to Shell will eventually fill memory, resulting in a memory error. +In contrast, some system text windows only keep the last n lines of output. +A Windows console, for instance, keeps a user-settable 1 to 9999 lines, +with 300 the default.

    Text widgets display a subset of Unicode, the Basic Multilingual Plane (BMP). Which characters get a proper glyph instead of a replacement box depends on the operating system and installed fonts. Newline characters cause following -text to appear on a new line, but other control characters are replaced -with a box. But note that the repr() function, which is used for -interactive echo of expression values, replaces control characters -with escape codes before they are output.

    +text to appear on a new line, but other control characters are either +replaced with a box or deleted. However, repr(), which is used for +interactive echo of expression values, replaces control characters, +some BMP codepoints, and all non-BMP characters with escape codes +before they are output.

    Normal and error output are generally kept separate (on separate lines) from code input and each other. They each get different highlight colors.

    For SyntaxError tracebacks, the normal ‘^’ marking where the error was diff --git a/Misc/NEWS.d/next/IDLE/2018-11-06-23-10-54.bpo-33000.pQasCt.rst b/Misc/NEWS.d/next/IDLE/2018-11-06-23-10-54.bpo-33000.pQasCt.rst new file mode 100644 index 00000000000000..c6ba9e4669d584 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2018-11-06-23-10-54.bpo-33000.pQasCt.rst @@ -0,0 +1,2 @@ +Document that IDLE's shell has no line limit. A program that runs +indefinitely can overfill memory. From e422de828fba695a49dc7e9cbef30e87d4c4f249 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 7 Nov 2018 09:53:27 -0800 Subject: [PATCH 1961/2287] Mark -c and -O as command line options in reStructuredText. (GH-10103) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit ea6a28c9f7e4baa5fe775cebce697a14a7d7da8b) Co-authored-by: Andrés Delfino --- Doc/reference/executionmodel.rst | 2 +- Doc/reference/import.rst | 2 +- Doc/reference/simple_stmts.rst | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/reference/executionmodel.rst b/Doc/reference/executionmodel.rst index 5c83181440bc57..1a69e972f2cb7d 100644 --- a/Doc/reference/executionmodel.rst +++ b/Doc/reference/executionmodel.rst @@ -22,7 +22,7 @@ The following are blocks: a module, a function body, and a class definition. Each command typed interactively is a block. A script file (a file given as standard input to the interpreter or specified as a command line argument to the interpreter) is a code block. A script command (a command specified on the -interpreter command line with the '**-c**' option) is a code block. The string +interpreter command line with the :option:`-c` option) is a code block. The string argument passed to the built-in functions :func:`eval` and :func:`exec` is a code block. diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst index c3a20314f79d09..b295eed9d80265 100644 --- a/Doc/reference/import.rst +++ b/Doc/reference/import.rst @@ -925,7 +925,7 @@ In :ref:`the remaining cases ` :mod:`__main__` does not correspond directly with an importable module: - interactive prompt -- -c switch +- :option:`-c` option - running from stdin - running directly from a source or bytecode file diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index 9246939dbdacf0..3ab0029698c7a2 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -402,7 +402,7 @@ The extended form, ``assert expression1, expression2``, is equivalent to :: These equivalences assume that :const:`__debug__` and :exc:`AssertionError` refer to the built-in variables with those names. In the current implementation, the built-in variable :const:`__debug__` is ``True`` under normal circumstances, -``False`` when optimization is requested (command line option -O). The current +``False`` when optimization is requested (command line option :option:`-O`). The current code generator emits no code for an assert statement when optimization is requested at compile time. Note that it is unnecessary to include the source code for the expression that failed in the error message; it will be displayed From 55e1173c4f9a2c8b9f6ea7e54950ce50ec850efb Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 7 Nov 2018 09:54:48 -0800 Subject: [PATCH 1962/2287] Mark len call as a code snippet in stdtypes.rst. (GH-9804) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit ca03f3b93ee5c2943a2b8cbf9447f99f835ec672) Co-authored-by: Andrés Delfino --- Doc/library/stdtypes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 23e6c917b9dd7c..a5fca9d4690066 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -3743,7 +3743,7 @@ copying. ``nbytes == product(shape) * itemsize == len(m.tobytes())``. This is the amount of space in bytes that the array would use in a contiguous - representation. It is not necessarily equal to len(m):: + representation. It is not necessarily equal to ``len(m)``:: >>> import array >>> a = array.array('i', [1,2,3,4,5]) From 0d9896db1638e924a4215772ffc0251e16304b9f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 7 Nov 2018 09:55:02 -0800 Subject: [PATCH 1963/2287] Correct grammar mistakes in string.rst. (GH-9752) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit d64991031e4c86ce0331caac16770757511dd025) Co-authored-by: Andrés Delfino --- Doc/library/string.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/string.rst b/Doc/library/string.rst index 007ce84e78f454..f5c22910c83b70 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -551,7 +551,7 @@ addition of the ``{}`` and with ``:`` used instead of ``%``. For example, ``'%03.2f'`` can be translated to ``'{:03.2f}'``. The new format syntax also supports new and different options, shown in the -follow examples. +following examples. Accessing arguments by position:: @@ -739,7 +739,7 @@ these rules. The methods of :class:`Template` are: simply return ``$`` instead of raising :exc:`ValueError`. While other exceptions may still occur, this method is called "safe" - because substitutions always tries to return a usable string instead of + because it always tries to return a usable string instead of raising an exception. In another sense, :meth:`safe_substitute` may be anything other than safe, since it will silently ignore malformed templates containing dangling delimiters, unmatched braces, or From a5bd0d3c300e27652fd364a2516ee30d17ba1cf5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 7 Nov 2018 10:30:06 -0800 Subject: [PATCH 1964/2287] Add a reference to the name mangling description in the tutorial to the index. (GH-10138) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit c5eec4426d9144b2255500217d0e3ff9463d2770) Co-authored-by: Andrés Delfino --- Doc/tutorial/classes.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst index 487d535e169bfd..914da426df3616 100644 --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -672,6 +672,9 @@ be treated as a non-public part of the API (whether it is a function, a method or a data member). It should be considered an implementation detail and subject to change without notice. +.. index:: + pair: name; mangling + Since there is a valid use-case for class-private members (namely to avoid name clashes of names with names defined by subclasses), there is limited support for such a mechanism, called :dfn:`name mangling`. Any identifier of the form From 3ede2b1da6be6c63c688b90f058bfbd15b94c52b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 7 Nov 2018 10:30:27 -0800 Subject: [PATCH 1965/2287] glob uses fnmatch.filter instead of fnmatch since 2001. (GH-10102) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit ae31e3fbf4e7def772fc1c94342d1011424fdc99) Co-authored-by: Andrés Delfino --- Doc/library/fnmatch.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/fnmatch.rst b/Doc/library/fnmatch.rst index 48dc5e5dde168a..fb0a1e33232619 100644 --- a/Doc/library/fnmatch.rst +++ b/Doc/library/fnmatch.rst @@ -42,7 +42,7 @@ For example, ``'[?]'`` matches the character ``'?'``. Note that the filename separator (``'/'`` on Unix) is *not* special to this module. See module :mod:`glob` for pathname expansion (:mod:`glob` uses -:func:`fnmatch` to match pathname segments). Similarly, filenames starting with +:func:`.filter` to match pathname segments). Similarly, filenames starting with a period are not special for this module, and are matched by the ``*`` and ``?`` patterns. From 774d46f86cb3addfec7a5c48077bd554c0c02104 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 7 Nov 2018 10:35:39 -0800 Subject: [PATCH 1966/2287] Add link to PEP 525 in Expressions. (GH-10333) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit bfe1839aa994f0d84471254418a4ecfa7c7c9b9c) Co-authored-by: Andrés Delfino --- Doc/reference/expressions.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 879eba8f586c59..05f62cd38ba9a2 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -384,7 +384,7 @@ coroutine function to be an asynchronous generator. For example:: def gen(): # defines a generator function yield 123 - async def agen(): # defines an asynchronous generator function (PEP 525) + async def agen(): # defines an asynchronous generator function yield 123 Generator functions are described below, while asynchronous generator @@ -459,6 +459,10 @@ on the right hand side of an assignment statement. The proposal to introduce the :token:`yield_from` syntax, making delegation to sub-generators easy. + :pep:`525` - Asynchronous Generators + The proposal that expanded on :pep:`492` by adding generator capabilities to + coroutine functions. + .. index:: object: generator .. _generator-methods: From f6b9459996f5166300982d0427119eb326e74dac Mon Sep 17 00:00:00 2001 From: stratakis Date: Wed, 7 Nov 2018 23:05:13 +0100 Subject: [PATCH 1967/2287] [3.6] bpo-31354: Let configure --with-lto work on all builds (GH-10261) Allow configure --with-lto to apply to all builds, not just profile-opt builds. Whether this is actually useful or not must be determined by the person building CPython using their own toolchain. My own quick test on x86_64 Debian 9 (gcc 6.3, binutils 2.28) seemed to suggest that it wasn't, but I expect better toolchains can or will exist at some point. The point is to allow it at all. --- Makefile.pre.in | 4 ++-- .../next/Build/2017-09-08-11-48-11.bpo-31354.4f-VJK.rst | 1 + configure | 9 +++++---- configure.ac | 6 ++++-- 4 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2017-09-08-11-48-11.bpo-31354.4f-VJK.rst diff --git a/Makefile.pre.in b/Makefile.pre.in index d912a19e79f560..82f7edd1014cff 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -473,7 +473,7 @@ profile-opt: $(MAKE) profile-removal build_all_generate_profile: - $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS) $(PGO_PROF_GEN_FLAG) @LTOFLAGS@" LDFLAGS="$(LDFLAGS) $(PGO_PROF_GEN_FLAG) @LTOFLAGS@" LIBS="$(LIBS)" + $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS) $(PGO_PROF_GEN_FLAG)" LDFLAGS="$(LDFLAGS) $(PGO_PROF_GEN_FLAG)" LIBS="$(LIBS)" run_profile_task: : # FIXME: can't run for a cross build @@ -483,7 +483,7 @@ build_all_merge_profile: $(LLVM_PROF_MERGER) build_all_use_profile: - $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS) $(PGO_PROF_USE_FLAG) @LTOFLAGS@" LDFLAGS="$(LDFLAGS) @LTOFLAGS@" + $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS) $(PGO_PROF_USE_FLAG)" LDFLAGS="$(LDFLAGS)" # Compile and run with gcov .PHONY=coverage coverage-lcov coverage-report diff --git a/Misc/NEWS.d/next/Build/2017-09-08-11-48-11.bpo-31354.4f-VJK.rst b/Misc/NEWS.d/next/Build/2017-09-08-11-48-11.bpo-31354.4f-VJK.rst new file mode 100644 index 00000000000000..b63c9ea6e01f86 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2017-09-08-11-48-11.bpo-31354.4f-VJK.rst @@ -0,0 +1 @@ +Allow --with-lto to be used on all builds, not just `make profile-opt`. diff --git a/configure b/configure index bfa4b83cd6c0e2..75a80a797d347f 100755 --- a/configure +++ b/configure @@ -681,7 +681,6 @@ LLVM_PROF_FILE LLVM_PROF_MERGER PGO_PROF_USE_FLAG PGO_PROF_GEN_FLAG -LTOFLAGS DEF_MAKE_RULE DEF_MAKE_ALL_RULE ABIFLAGS @@ -1516,8 +1515,8 @@ Optional Packages: --with-suffix=.exe set executable suffix --with-pydebug build with Py_DEBUG defined --with-assertions build with C assertions enabled - --with-lto Enable Link Time Optimization in PGO builds. - Disabled by default. + --with-lto Enable Link Time Optimization in any build. Disabled + by default. --with-hash-algorithm=[fnv|siphash24] select hash algorithm --with-address-sanitizer @@ -6584,7 +6583,6 @@ else fi # Enable LTO flags - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-lto" >&5 $as_echo_n "checking for --with-lto... " >&6; } @@ -6637,6 +6635,9 @@ if test "$Py_LTO" = 'true' ; then # to get debug symbols. LTOFLAGS="$LTOFLAGS -g" fi + + CFLAGS="$CFLAGS $LTOFLAGS" + LDFLAGS="$LDFLAGS $LTOFLAGS" fi # Enable PGO flags. diff --git a/configure.ac b/configure.ac index 3f2459ab7100a1..b411c3e8f6f147 100644 --- a/configure.ac +++ b/configure.ac @@ -1310,9 +1310,8 @@ else fi # Enable LTO flags -AC_SUBST(LTOFLAGS) AC_MSG_CHECKING(for --with-lto) -AC_ARG_WITH(lto, AS_HELP_STRING([--with-lto], [Enable Link Time Optimization in PGO builds. Disabled by default.]), +AC_ARG_WITH(lto, AS_HELP_STRING([--with-lto], [Enable Link Time Optimization in any build. Disabled by default.]), [ if test "$withval" != no then @@ -1354,6 +1353,9 @@ if test "$Py_LTO" = 'true' ; then # to get debug symbols. LTOFLAGS="$LTOFLAGS -g" fi + + CFLAGS="$CFLAGS $LTOFLAGS" + LDFLAGS="$LDFLAGS $LTOFLAGS" fi # Enable PGO flags. From 0e3983689bc5c09ce9220c7976d94adf68ef118c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 7 Nov 2018 14:46:10 -0800 Subject: [PATCH 1968/2287] Fix the construction of subprocess.CalledProcessError in test_venv (GH-10400) The constructor of subprocess.CalledProcessError in the check_output function had an extra None in it. (cherry picked from commit b93925047a025511c48a7bf3e6e6f0cfec79b8ed) Co-authored-by: Pablo Galindo --- Lib/test/test_venv.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index d1ffb8132d819c..842470fef08a09 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -40,7 +40,7 @@ def check_output(cmd, encoding=None): out, err = p.communicate() if p.returncode: raise subprocess.CalledProcessError( - p.returncode, cmd, None, out, err) + p.returncode, cmd, out, err) return out, err class BaseTest(unittest.TestCase): From de25071f49b3f9bf9cdef32204a4516bbb259626 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 7 Nov 2018 21:16:16 -0800 Subject: [PATCH 1969/2287] Add future_stmt to simple_stmt production list. (GH-8239) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit cdb96f45b61a40a7e7c4c83b4b1f14ef6f5cf4fa) Co-authored-by: Andrés Delfino --- Doc/reference/simple_stmts.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index 3ab0029698c7a2..3fea709d3857f3 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -25,6 +25,7 @@ simple statements is: : | `break_stmt` : | `continue_stmt` : | `import_stmt` + : | `future_stmt` : | `global_stmt` : | `nonlocal_stmt` From 11a33e171b89ea9267672b0664d739ca06e459ca Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 7 Nov 2018 23:20:27 -0800 Subject: [PATCH 1970/2287] bpo-34966: Improve support of method aliases in pydoc. (GH-9823) Pydoc now does not duplicate docstrings for aliases of inherited methods. (cherry picked from commit a44d34e17908a49d584f86c4f8642a50707b7150) Co-authored-by: Serhiy Storchaka --- Lib/pydoc.py | 6 +- Lib/test/test_pydoc.py | 99 +++++++++++++++++++ .../2018-10-12-18-57-52.bpo-34966.WZeBHO.rst | 3 + 3 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-10-12-18-57-52.bpo-34966.WZeBHO.rst diff --git a/Lib/pydoc.py b/Lib/pydoc.py index fffa2d50a29c26..b521a5504728c4 100644 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -941,8 +941,7 @@ def docroutine(self, object, name=None, mod=None, if name == realname: title = '%s' % (anchor, realname) else: - if (cl and realname in cl.__dict__ and - cl.__dict__[realname] is object): + if cl and inspect.getattr_static(cl, realname, []) is object: reallink = '%s' % ( cl.__name__ + '-' + realname, realname) skipdocs = 1 @@ -1346,8 +1345,7 @@ def docroutine(self, object, name=None, mod=None, cl=None): if name == realname: title = self.bold(realname) else: - if (cl and realname in cl.__dict__ and - cl.__dict__[realname] is object): + if cl and inspect.getattr_static(cl, realname, []) is object: skipdocs = 1 title = self.bold(name) + ' = ' + realname argspec = None diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index 0383a6732401be..00803d3305cb53 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -419,6 +419,7 @@ def call_url_handler(self, url, expected_title): class PydocDocTest(unittest.TestCase): + maxDiff = None @unittest.skipIf(sys.flags.optimize >= 2, "Docstrings are omitted with -O2 and above") @@ -650,6 +651,104 @@ def method_returning_true(self): methods = pydoc.allmethods(TestClass) self.assertDictEqual(methods, expected) + def test_method_aliases(self): + class A: + def tkraise(self, aboveThis=None): + """Raise this widget in the stacking order.""" + lift = tkraise + def a_size(self): + """Return size""" + class B(A): + def itemconfigure(self, tagOrId, cnf=None, **kw): + """Configure resources of an item TAGORID.""" + itemconfig = itemconfigure + b_size = A.a_size + + doc = pydoc.render_doc(B) + # clean up the extra text formatting that pydoc performs + doc = re.sub('\b.', '', doc) + self.assertEqual(doc, '''\ +Python Library Documentation: class B in module %s + +class B(A) + | Method resolution order: + | B + | A + | builtins.object + |\x20\x20 + | Methods defined here: + |\x20\x20 + | b_size = a_size(self) + |\x20\x20 + | itemconfig = itemconfigure(self, tagOrId, cnf=None, **kw) + |\x20\x20 + | itemconfigure(self, tagOrId, cnf=None, **kw) + | Configure resources of an item TAGORID. + |\x20\x20 + | ---------------------------------------------------------------------- + | Methods inherited from A: + |\x20\x20 + | a_size(self) + | Return size + |\x20\x20 + | lift = tkraise(self, aboveThis=None) + |\x20\x20 + | tkraise(self, aboveThis=None) + | Raise this widget in the stacking order. + |\x20\x20 + | ---------------------------------------------------------------------- + | Data descriptors inherited from A: + |\x20\x20 + | __dict__ + | dictionary for instance variables (if defined) + |\x20\x20 + | __weakref__ + | list of weak references to the object (if defined) +''' % __name__) + + doc = pydoc.render_doc(B, renderer=pydoc.HTMLDoc()) + self.assertEqual(doc, '''\ +Python Library Documentation: class B in module %s + +

    + + + +\x20\x20\x20\x20 + +
     
    +class B(A)
        
    Method resolution order:
    +
    B
    +
    A
    +
    builtins.object
    +
    +
    +Methods defined here:
    +
    b_size = a_size(self)
    + +
    itemconfig = itemconfigure(self, tagOrId, cnf=None, **kw)
    + +
    itemconfigure(self, tagOrId, cnf=None, **kw)
    Configure resources of an item TAGORID.
    + +
    +Methods inherited from A:
    +
    a_size(self)
    Return size
    + +
    lift = tkraise(self, aboveThis=None)
    + +
    tkraise(self, aboveThis=None)
    Raise this widget in the stacking order.
    + +
    +Data descriptors inherited from A:
    +
    __dict__
    +
    dictionary for instance variables (if defined)
    +
    +
    __weakref__
    +
    list of weak references to the object (if defined)
    +
    +
    \ +''' % __name__) + class PydocImportTest(PydocBaseTest): diff --git a/Misc/NEWS.d/next/Library/2018-10-12-18-57-52.bpo-34966.WZeBHO.rst b/Misc/NEWS.d/next/Library/2018-10-12-18-57-52.bpo-34966.WZeBHO.rst new file mode 100644 index 00000000000000..b861405297f4f6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-10-12-18-57-52.bpo-34966.WZeBHO.rst @@ -0,0 +1,3 @@ +:mod:`pydoc` now supports aliases not only to methods defined in +the end class, but also to inherited methods. The docstring is not +duplicated for aliases. From 65e1a1fd311943866361fcb288c0df65dadbe092 Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Thu, 8 Nov 2018 23:30:36 -0800 Subject: [PATCH 1971/2287] bpo-35193: Fix an off by one error in the RETURN_VALUE case. (GH-10418) (GH-10422) Fix an off by one error in the peephole optimizer when checking for unreachable code beyond a return. Do a bounds check within find_op so it can return before going past the end as a safety measure. https://github.com/python/cpython/commit/7db3c488335168993689ddae5914a28e16188447#diff-a33329ae6ae0bb295d742f0caf93c137 introduced this off by one error while fixing another one nearby. This bug was shipped in all Python 3.6 and 3.7 releases. The included unittest won't fail unless you do a clang msan build. (cherry picked from commit 49fa4a9f1ef387e16596f271414c855339eadf09) --- Lib/test/test_compile.py | 19 +++++++++++++++++++ .../2018-11-08-23-00-04.bpo-35193.WK2PDg.rst | 3 +++ Python/peephole.c | 12 ++++++------ 3 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-11-08-23-00-04.bpo-35193.WK2PDg.rst diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 745ce029aa575c..13cc8821b082a9 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -1,3 +1,4 @@ +import dis import math import os import unittest @@ -628,6 +629,24 @@ def check_same_constant(const): self.check_constant(f1, frozenset({0})) self.assertTrue(f1(0)) + # This is a regression test for a CPython specific peephole optimizer + # implementation bug present in a few releases. It's assertion verifies + # that peephole optimization was actually done though that isn't an + # indication of the bugs presence or not (crashing is). + @support.cpython_only + def test_peephole_opt_unreachable_code_array_access_in_bounds(self): + """Regression test for issue35193 when run under clang msan.""" + def unused_code_at_end(): + return 3 + raise RuntimeError("unreachable") + # The above function definition will trigger the out of bounds + # bug in the peephole optimizer as it scans opcodes past the + # RETURN_VALUE opcode. This does not always crash an interpreter. + # When you build with the clang memory sanitizer it reliably aborts. + self.assertEqual( + 'RETURN_VALUE', + list(dis.get_instructions(unused_code_at_end))[-1].opname) + def test_dont_merge_constants(self): # Issue #25843: compile() must not merge constants which are equal # but have a different type. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-11-08-23-00-04.bpo-35193.WK2PDg.rst b/Misc/NEWS.d/next/Core and Builtins/2018-11-08-23-00-04.bpo-35193.WK2PDg.rst new file mode 100644 index 00000000000000..a6b3c64beab77e --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-11-08-23-00-04.bpo-35193.WK2PDg.rst @@ -0,0 +1,3 @@ +Fix an off by one error in the bytecode peephole optimizer where it could +read bytes beyond the end of bounds of an array when removing unreachable +code. This bug was present in every release of Python 3.6 until now. diff --git a/Python/peephole.c b/Python/peephole.c index 31d4e92cfd3343..3fa3b7fcee6284 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -96,9 +96,9 @@ lastn_const_start(const _Py_CODEUNIT *codestr, Py_ssize_t i, Py_ssize_t n) /* Scans through EXTENDED ARGs, seeking the index of the effective opcode */ static Py_ssize_t -find_op(const _Py_CODEUNIT *codestr, Py_ssize_t i) +find_op(const _Py_CODEUNIT *codestr, Py_ssize_t codelen, Py_ssize_t i) { - while (_Py_OPCODE(codestr[i]) == EXTENDED_ARG) { + while (i < codelen && _Py_OPCODE(codestr[i]) == EXTENDED_ARG) { i++; } return i; @@ -590,7 +590,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, CONST_STACK_CREATE(); - for (i=find_op(codestr, 0) ; i= 1 && _Py_OPCODE(codestr[op_start-1]) == EXTENDED_ARG) { @@ -755,7 +755,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, case JUMP_IF_FALSE_OR_POP: case JUMP_IF_TRUE_OR_POP: h = get_arg(codestr, i) / sizeof(_Py_CODEUNIT); - tgt = find_op(codestr, h); + tgt = find_op(codestr, codelen, h); j = _Py_OPCODE(codestr[tgt]); if (CONDITIONAL_JUMP(j)) { @@ -796,7 +796,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, case SETUP_WITH: case SETUP_ASYNC_WITH: h = GETJUMPTGT(codestr, i); - tgt = find_op(codestr, h); + tgt = find_op(codestr, codelen, h); /* Replace JUMP_* to a RETURN into just a RETURN */ if (UNCONDITIONAL_JUMP(opcode) && _Py_OPCODE(codestr[tgt]) == RETURN_VALUE) { @@ -825,7 +825,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, } if (h > i + 1) { fill_nops(codestr, i + 1, h); - nexti = find_op(codestr, h); + nexti = find_op(codestr, codelen, h); } break; } From 49ee41f1c3934aa095e32fa751cdf3ba641ae34b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 Nov 2018 23:33:10 -0800 Subject: [PATCH 1972/2287] bpo-35194: Fix a wrong constant in cp932 codec (GH-10420) This typo doesn't affect the result because wrong bits are discarded on implicit conversion to unsigned char, but it trips UBSan with -fsanitize=implicit-integer-truncation. https://bugs.python.org/issue35194 (cherry picked from commit 7a69cf47a9bbc95f95fd67c982bff121b2a903cb) Co-authored-by: Alexey Izbyshev --- Modules/cjkcodecs/_codecs_jp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/cjkcodecs/_codecs_jp.c b/Modules/cjkcodecs/_codecs_jp.c index 2c7788a645813c..3a332953b957cb 100644 --- a/Modules/cjkcodecs/_codecs_jp.c +++ b/Modules/cjkcodecs/_codecs_jp.c @@ -40,7 +40,7 @@ ENCODER(cp932) if (c == 0xf8f0) OUTBYTE1(0xa0); else - OUTBYTE1(c - 0xfef1 + 0xfd); + OUTBYTE1(c - 0xf8f1 + 0xfd); NEXT(1, 1); continue; } From bde5181bd3f424c3355cfa504a722f6b55d3b8de Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 9 Nov 2018 01:27:10 -0800 Subject: [PATCH 1973/2287] Cleanup and improve the regex tokenizer example. (GH-10426) (#10428) 1) Convert weird field name "typ" to the more standard "type". 2) For the NUMBER type, convert the value to an int() or float(). 3) Simplify ``group(kind)`` to the shorter and faster ``group()`` call. 4) Simplify logic go a single if-elif chain to make this easier to extend. 5) Reorder the tests to match the order the tokens are specified. This isn't necessary for correctness but does make the example easier to follow. 6) Move the "column" calculation before the if-elif chain so that users have the option of using this value in error messages. (cherry picked from commit b83942c755a78f6d917743b73ed87a8fd9f367de) Co-authored-by: Raymond Hettinger --- Doc/library/re.rst | 74 ++++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst index 97d83f5518cb39..89d36a9fe4f6c2 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -1581,38 +1581,40 @@ successive matches:: import collections import re - Token = collections.namedtuple('Token', ['typ', 'value', 'line', 'column']) + Token = collections.namedtuple('Token', ['type', 'value', 'line', 'column']) def tokenize(code): keywords = {'IF', 'THEN', 'ENDIF', 'FOR', 'NEXT', 'GOSUB', 'RETURN'} token_specification = [ - ('NUMBER', r'\d+(\.\d*)?'), # Integer or decimal number - ('ASSIGN', r':='), # Assignment operator - ('END', r';'), # Statement terminator - ('ID', r'[A-Za-z]+'), # Identifiers - ('OP', r'[+\-*/]'), # Arithmetic operators - ('NEWLINE', r'\n'), # Line endings - ('SKIP', r'[ \t]+'), # Skip over spaces and tabs - ('MISMATCH',r'.'), # Any other character + ('NUMBER', r'\d+(\.\d*)?'), # Integer or decimal number + ('ASSIGN', r':='), # Assignment operator + ('END', r';'), # Statement terminator + ('ID', r'[A-Za-z]+'), # Identifiers + ('OP', r'[+\-*/]'), # Arithmetic operators + ('NEWLINE', r'\n'), # Line endings + ('SKIP', r'[ \t]+'), # Skip over spaces and tabs + ('MISMATCH', r'.'), # Any other character ] tok_regex = '|'.join('(?P<%s>%s)' % pair for pair in token_specification) line_num = 1 line_start = 0 for mo in re.finditer(tok_regex, code): kind = mo.lastgroup - value = mo.group(kind) - if kind == 'NEWLINE': + value = mo.group() + column = mo.start() - line_start + if kind == 'NUMBER': + value = float(value) if '.' in value else int(value) + elif kind == 'ID' and value in keywords: + kind = value + elif kind == 'NEWLINE': line_start = mo.end() line_num += 1 + continue elif kind == 'SKIP': - pass + continue elif kind == 'MISMATCH': raise RuntimeError(f'{value!r} unexpected on line {line_num}') - else: - if kind == 'ID' and value in keywords: - kind = value - column = mo.start() - line_start - yield Token(kind, value, line_num, column) + yield Token(kind, value, line_num, column) statements = ''' IF quantity THEN @@ -1626,25 +1628,25 @@ successive matches:: The tokenizer produces the following output:: - Token(typ='IF', value='IF', line=2, column=4) - Token(typ='ID', value='quantity', line=2, column=7) - Token(typ='THEN', value='THEN', line=2, column=16) - Token(typ='ID', value='total', line=3, column=8) - Token(typ='ASSIGN', value=':=', line=3, column=14) - Token(typ='ID', value='total', line=3, column=17) - Token(typ='OP', value='+', line=3, column=23) - Token(typ='ID', value='price', line=3, column=25) - Token(typ='OP', value='*', line=3, column=31) - Token(typ='ID', value='quantity', line=3, column=33) - Token(typ='END', value=';', line=3, column=41) - Token(typ='ID', value='tax', line=4, column=8) - Token(typ='ASSIGN', value=':=', line=4, column=12) - Token(typ='ID', value='price', line=4, column=15) - Token(typ='OP', value='*', line=4, column=21) - Token(typ='NUMBER', value='0.05', line=4, column=23) - Token(typ='END', value=';', line=4, column=27) - Token(typ='ENDIF', value='ENDIF', line=5, column=4) - Token(typ='END', value=';', line=5, column=9) + Token(type='IF', value='IF', line=2, column=4) + Token(type='ID', value='quantity', line=2, column=7) + Token(type='THEN', value='THEN', line=2, column=16) + Token(type='ID', value='total', line=3, column=8) + Token(type='ASSIGN', value=':=', line=3, column=14) + Token(type='ID', value='total', line=3, column=17) + Token(type='OP', value='+', line=3, column=23) + Token(type='ID', value='price', line=3, column=25) + Token(type='OP', value='*', line=3, column=31) + Token(type='ID', value='quantity', line=3, column=33) + Token(type='END', value=';', line=3, column=41) + Token(type='ID', value='tax', line=4, column=8) + Token(type='ASSIGN', value=':=', line=4, column=12) + Token(type='ID', value='price', line=4, column=15) + Token(type='OP', value='*', line=4, column=21) + Token(type='NUMBER', value=0.05, line=4, column=23) + Token(type='END', value=';', line=4, column=27) + Token(type='ENDIF', value='ENDIF', line=5, column=4) + Token(type='END', value=';', line=5, column=9) .. [Frie09] Friedl, Jeffrey. Mastering Regular Expressions. 3rd ed., O'Reilly From 384d5523c42fdabce98c0cac67fc7c8e2f8f4904 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 9 Nov 2018 11:21:59 -0800 Subject: [PATCH 1974/2287] [3.6] Doc: Make all versions sidebars the same for consistency. (GH-10288) (GH-10404) (cherry picked from commit 556d50d03dd1d457c01ab552c8bc81f3431a0746) Co-authored-by: Julien Palard --- Doc/tools/templates/indexsidebar.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Doc/tools/templates/indexsidebar.html b/Doc/tools/templates/indexsidebar.html index 3131050b036b7d..e69e9a305425f6 100644 --- a/Doc/tools/templates/indexsidebar.html +++ b/Doc/tools/templates/indexsidebar.html @@ -1,12 +1,13 @@

    {% trans %}Download{% endtrans %}

    {% trans %}Download these documents{% endtrans %}

    -

    {% trans %}Docs for other versions{% endtrans %}

    +

    {% trans %}Docs by version{% endtrans %}

    {% trans %}Other resources{% endtrans %}

    From aa4f9a23932fbb298102e2ffa00021a8ddd2ea1c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 9 Nov 2018 11:50:52 -0800 Subject: [PATCH 1975/2287] Correct a typo in the Unittest documentation (GH-10397) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: maggyero (cherry picked from commit 009b2f02049eda3b29d4f4f743e51df106686375) Co-authored-by: Géry Ogam --- Doc/library/unittest.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index a43e9453239ca8..3a8af0c52a5998 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -588,7 +588,7 @@ Distinguishing test iterations using subtests .. versionadded:: 3.4 -When some of your tests differ only by a some very small differences, for +When there are very small differences among your tests, for instance some parameters, unittest allows you to distinguish them inside the body of a test method using the :meth:`~TestCase.subTest` context manager. From 2903b0fd38a65e16ddafae7754ed5d605fea68ff Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 9 Nov 2018 23:08:05 -0800 Subject: [PATCH 1976/2287] bpo-35202: Remove unused imports in idlelib (GH-10438) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 43a74abb3a87092a7fd6c71042eafb977d70d8e0) Co-authored-by: Srinivas Thatiparthy (శ్రీనివాస్ తాటిపర్తి) --- Lib/idlelib/codecontext.py | 2 +- Lib/idlelib/filelist.py | 1 - Lib/idlelib/idle_test/test_config.py | 1 - Lib/idlelib/idle_test/test_config_key.py | 1 - Lib/idlelib/idle_test/test_rpc.py | 1 - Lib/idlelib/pyparse.py | 1 - Misc/NEWS.d/next/IDLE/2018-11-10-09-10-54.bpo-35202.TeJJrt.rst | 1 + 7 files changed, 2 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2018-11-10-09-10-54.bpo-35202.TeJJrt.rst diff --git a/Lib/idlelib/codecontext.py b/Lib/idlelib/codecontext.py index 7c88a4d015e358..ef8852852d1f80 100644 --- a/Lib/idlelib/codecontext.py +++ b/Lib/idlelib/codecontext.py @@ -13,7 +13,7 @@ from sys import maxsize as INFINITY import tkinter -from tkinter.constants import TOP, LEFT, X, W, SUNKEN +from tkinter.constants import TOP, X, SUNKEN from idlelib.config import idleConf diff --git a/Lib/idlelib/filelist.py b/Lib/idlelib/filelist.py index 52628392e6170c..0d200854ef0007 100644 --- a/Lib/idlelib/filelist.py +++ b/Lib/idlelib/filelist.py @@ -115,7 +115,6 @@ def _test(): # TODO check and convert to htest from tkinter import Tk from idlelib.editor import fixwordbreaks from idlelib.run import fix_scaling - import sys root = Tk() fix_scaling(root) fixwordbreaks(root) diff --git a/Lib/idlelib/idle_test/test_config.py b/Lib/idlelib/idle_test/test_config.py index 8c9197284e07e4..169d054efd08a4 100644 --- a/Lib/idlelib/idle_test/test_config.py +++ b/Lib/idlelib/idle_test/test_config.py @@ -4,7 +4,6 @@ Much of IdleConf is also exercised by ConfigDialog and test_configdialog. """ from idlelib import config -import copy import sys import os import tempfile diff --git a/Lib/idlelib/idle_test/test_config_key.py b/Lib/idlelib/idle_test/test_config_key.py index 08471666a4529d..5031daadee0a0a 100644 --- a/Lib/idlelib/idle_test/test_config_key.py +++ b/Lib/idlelib/idle_test/test_config_key.py @@ -2,7 +2,6 @@ from idlelib import config_key from test.support import requires -import sys import unittest from tkinter import Tk from idlelib.idle_test.mock_idle import Func diff --git a/Lib/idlelib/idle_test/test_rpc.py b/Lib/idlelib/idle_test/test_rpc.py index 48be65ba10b9cd..81eff398c72f45 100644 --- a/Lib/idlelib/idle_test/test_rpc.py +++ b/Lib/idlelib/idle_test/test_rpc.py @@ -3,7 +3,6 @@ from idlelib import rpc import unittest -import marshal class CodePicklerTest(unittest.TestCase): diff --git a/Lib/idlelib/pyparse.py b/Lib/idlelib/pyparse.py index 1eeb9154d90610..81e7f539803c08 100644 --- a/Lib/idlelib/pyparse.py +++ b/Lib/idlelib/pyparse.py @@ -11,7 +11,6 @@ _chew_ordinaryre - non-special characters. """ import re -import sys # Reason last statement is continued (or C_NONE if it's not). (C_NONE, C_BACKSLASH, C_STRING_FIRST_LINE, diff --git a/Misc/NEWS.d/next/IDLE/2018-11-10-09-10-54.bpo-35202.TeJJrt.rst b/Misc/NEWS.d/next/IDLE/2018-11-10-09-10-54.bpo-35202.TeJJrt.rst new file mode 100644 index 00000000000000..1824536f3db1f1 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2018-11-10-09-10-54.bpo-35202.TeJJrt.rst @@ -0,0 +1 @@ +Remove unused imports from lib/idlelib From a650493a4626c309b34a38919a41f5de32de3721 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 10 Nov 2018 20:49:10 -0800 Subject: [PATCH 1977/2287] bpo-34864: Document two IDLE on MacOS issues. (GH-10456) The System Preferences Dock "prefer tabs always" setting disables some IDLE features. Menus are a bit different than as described for Windows and Linux. (cherry picked from commit 50ff02b43145f33f8e28ffbfcc6a9d15c4749a64) Co-authored-by: Terry Jan Reedy --- Doc/library/idle.rst | 23 +++++++++++++----- Lib/idlelib/help.html | 24 +++++++++++++------ .../2018-11-10-21-27-25.bpo-34864.Ci-G2q.rst | 3 +++ 3 files changed, 37 insertions(+), 13 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2018-11-10-21-27-25.bpo-34864.Ci-G2q.rst diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index 9be54fe01b0229..b91a3402f691b9 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -40,13 +40,17 @@ Menus ----- IDLE has two main window types, the Shell window and the Editor window. It is -possible to have multiple editor windows simultaneously. Output windows, such -as used for Edit / Find in Files, are a subtype of edit window. They currently -have the same top menu as Editor windows but a different default title and -context menu. +possible to have multiple editor windows simultaneously. On Windows and +Linux, each has its own top menu. Each menu documented below indicates +which window type it is associated with. -IDLE's menus dynamically change based on which window is currently selected. -Each menu documented below indicates which window type it is associated with. +Output windows, such as used for Edit => Find in Files, are a subtype of editor +window. They currently have the same top menu but a different +default title and context menu. + +On MacOS, there is one application menu. It dynamically changes according +to the window currently selected. It has an IDLE menu, and some entries +described below are moved around to conform to Apple guidlines. File menu (Shell and Editor) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -792,6 +796,13 @@ changed via Configure IDLE on the Option menu. Keys can be user defined; IDLE ships with four built-in key sets. In addition, a user can create a custom key set in the Configure IDLE dialog under the keys tab. +IDLE on MacOS +^^^^^^^^^^^^^ + +Under System Preferences: Dock, one can set "Prefer tabs when opening +documents" to "Always". This setting is not compatible with the tk/tkinter +GUI framework used by IDLE, and it breaks a few IDLE features. + Extensions ^^^^^^^^^^ diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index f0b42151f35989..a8afc75c316ca3 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -122,12 +122,15 @@

    Navigation

    UihbG88H!RSUB{9!}VP=td-LH%wD-a;4 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%0AAhF=TFQ_Bv-KCo7Or6o)^+s|p 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 z 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%0DlJe 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π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
  • U~)``L>OzB#i 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 z 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

    GAA(sga7pm`E4cX!wdV-uq~iFjh9gs8Hy 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

  • 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 Pky<2If>4>!rgO!4px^;0IK3wZ|ojm_JW^Q z*qBds%V}fL+$+_|*p2d`>V;bkctOeYd>@q(J_&Q8yxWa*H7?&_DS90yhG? zU2p8%QRVF=U)$^-@K(h$$9yw#XIw}6&BA}P48z$$fao&1_}kgo|M|lZza4uSmh1$- zamIiAU#fHdwO;iJ^%oU9lb&L z$E65IkNR}>k#!)ULqiMB4|>m+i*xy>=bAbyMAWAl`Y45?2Tnjg%WBlevM8gEGY}tL zi~XD=_G7$%m!HUw0@n^EQs^jlq3FlCC_SqFAJvMZZV!LFLBA29==`W@#qoh>@a&*k zLHT!{68iB(LXP4(oPJu2{?hwMD31~g%6$h0a&9)a)5J=|v;DFQJNN@Y01kv;LfAeT zGV}NP)WuCb)5Rs3x3113DNM+-J-!xgS7$xmElkgIZJxIGi6h+SH2tcUi{|m>s9C?u z6r1Mx%!ZP6$Wi=W$NC(^v9@lrwgb`bcZmu>bNHk1e$=cM-TS>5@5tM}eV>LOu;H~o zUGlG24E)ne{`HE1zkSJv*2fp~9q^6C@tN?r&xBX-3=(NRrQM-a%3^ZUbYl)dFJIw6 zrjh$y;c_o*u5HPYH>Cp39igI*`DSXtnwKZ-dp5u3LjQ)=d5=os&8fupm5jWX5yjmv zpE5nXmHNU>YG2;i3UHp!9WRV@TO$kg;JFKdbjIuY&dmP3Pjb~M1DWduf|}*kmt07C zuM2m-pL#uL&iS4z0~Z&ghlYIjZ)sNWal}r}nF@&W+@-S~om&k3_jlu7Wke|= zbGb2WD8dL3j-rJim^6zbqxSNsV$0moJb6_O3l|AwIS(_{tad#=bqj@p`D&2Q;^dbE zCJl9a1-9a?Swvo6`;yL+EY>6TUT+6tW97bu>QAY}gLZNUn5AwaS{vkqTs?l+1xkOF|h`G$UPyd+vU=`x1Sg7g5YO zpc18QR5we-H}Xs~J!uWdn3=ejS6FKy*sEn2M^>NjC#8()JhvRB)7~Ykrp$iNEwg`> zS+}0!;%(;PGSf+TgQ(c6Z@7WfRaP@DPI)%LF7&;8ij)q@Q!x-aKWl5f_7WR}4RE$nT43E6HYQra zd*s%o-LSNE$GomZMq!J-^adT1 znHU=S6UB*8?O2_pZU0Ke`P)rG{i#CfW!Mp{RCZg!2lE8?>;64xYAk?usMD;$mT5ZT z3yIhz{#>tP1Xov8O2O;APFp78>S#1v3XXTm$8L;86+5<3e0f#YAkbPnKg|rmlds6h zt?S5Iv)oIU3w|~(i7?X~nC7R8DGgzSlBswyA`yH~1+Zrq#Q2I;`nF}k%U?>6%!($u zI8{4K8_28#^c;&NgK2K@-W{667dVXs^X0N=BIg+!j`C zfzg9ns6YVCr-_9(?Mc2vYLv-a=k&McA|@5fdH_TZD#>#u^@c}}R?72pxjjhn87D|u zkna}``iOxFL7$_R6)({v!yUmtIhI+&asM)bn}zY)mgmyz-n@gYk;Q&G@pmIt?p(jt zliKtWh@w_l@#Q85Ox{H2Gp|CEW83r6zW|5oz~lj`iM%$pIySB4ARv6_8_OPF#ppy4 z(<$z&Ue_rtn?Mqth3BDsOkO?del@avW=aY8Mm_q>rcODk#qG5{UrN;UX9fR+2 zRQ!Xb!w&}H+Wwp2W7Z!Og#Y!a)qH=$Uf)C3ynnO*X&H4}ZKaOh5kGHvR^^_zU zvOhJz{6BV*AH|+8Pw-P!2Pbg^!!U@(k7Y=Rz`pkLIF!2ZW5F@~AS4Jnn#GZiA!Uqw zXy3^p+=`MPPcr;#zC?bsmmh6M{!vHljF$bBMg>(Trd;(kk>hE+vr1r^^jd94`7%_hpWfFGxgD%O|XOVk)ua( z=MWf!kDd1$+~Fxs?w9hHg&ys|bIT9Dgu>{rn3SZAA(`;Y_HbEze6LdgzpwI{rt=4$ z1T%}SD2#i8f7dK?=D)ctN@r#;10TP~K3|wf4P_4h05neizBCwrTlKTfF)9}>T5qZ7 z4av$nYRNvr9TcgLdDQG=Ki#+5&YAtLN5<<@QhqbPjQp?*5CPf`_{jwG`-}w^*Q(uG*g}LT0X(7ePnxfa9HukXT`I6>_AXkG$&cLZQoXLEYSTTXy)?# zADA13#@2_6q%Z^yzr)aPx6976`u!OlnD%pt%9$y@gJKc>*Con=j_=Q<*rNtYf#xW#0_!9 z-sh^?#L{b}OBk_Pkd;t*YLpPVHqQ$Ydst^i6l}5?XZEXtcJ_%wJ>Z?apwj2}xuSIt z;(2vPNK@1o{u~#OksRVd!0$_V8Qs_>Avim|PexmX8>H~>7u+=&Kr19TOE_nYiCTNt zXg~_%!Ea=82CsIxy3`t{0n&7}UYO3?lQ@M7#U<58e;G-H^8h};?uF{pt#l0_RY4d2 z_WFOS`;uliwPfo#zv9h__(UVRn$ZXZ0*O{MGy1+02oS&i1D$J^?R#9;u3N7n-oPiq z9JB=-X|I);D_7ciKzNOZfV7*qHl*G|n;RF#4paBsCAURL72c!q$Zj7tkTrB5T?z0a zwhu_?=fkNZQIEN6JuiAww=rq+cv+v z>$^HA7UG=+A?UCs~d7v&kdIWK}u{8{SzHLX)3#P4bh5y=5csB0sz--EyM;})_BmTL-K+tLu&XLkCPdLgR(s6oeOPW=tH+ zMwj&KyQTvj$60hHg@pyqtdOa1MQAw59H20k+ zmw2b_g4Q%!rj(0M6HGt)*vpINc_sx^s>Z^MlSoOFS>0@_n(VMrk>SK9XAEh$Tafb6 z4ud8b@(h;3-psP*uTONz?}haQoMN$=Z?5Awz`mLPMR+nSX8W63PQ#CoQfoA}{g<>I z%-WSJcY@3lW1?vus)@~1=YUt%Y`h2dbJQRF{R`dxmZ|THR~JpBmsy^W1t*Bc>Mc+u z*NWn!<&m1iU3g~1=cLOT!CL_()LqTx8p`jyN^($e<^W<}FvvrLCA_a%=wHO(CE3pl zt5L*nJh|kDuOe;tkyCSM*&a~ZEO+Gr{X9H^KLbO>I~VuW4J9 zM{1R^)2|`sYF~WIXg^&0?qk<|Z|&JNQ?qWSdD*SfpJwR6R@M1Hp7)SxMNKTF>DHa- zzEJPJ#S`T^6y~FY59V1U zR&f?%NyU(Wos@FY%?riC6eJp^nzgV{$CD!l$;wJHA`FSItBCFME`14}SFIza5j^vJ0mBY33%>eFVn zc)!a>uaG?%c-j4T8r3QK)ft+&rn{Yxs71I~NRWxzQfr8Wk@uE}pMP!9>_fmQelM90 zd@jS~zsV^gTeb)n;X5q+?5G1qwVo(96jcrnTZ8hDhOY;~kf?5h3mQj25C$ z)FFoHexc)MOnD|jXzNf2eYtjfh5xv?R?dD?tg~)=M4YpzE72%G7qqalDaw!`T85?kTH?49oeGn;?Z7r^2m|0ZS<6mLKsBJr`YJ2 zI2X#rs05XuA$5ufxi7eFgm`*4t7E zCmokTxvhTZ0a@On_(R4!opksGK|-2V?Cnfege;u{m+!ykvE>BcA^p@cyd*F z>uktxuHFbifhJson*_w|A>h*3c0T@GZq~n04(sPWqnzZgJD-u3gWVE45 z&yx(eJn5x%@4B6Zgz7{mdXDgbEv!l*Ltt#L!z;aqo)pxxs*NH9h_rAjG}O(o)yN;LOI%g% z8)DLzU}s3ZQ9%BG2v*zCX)Ik*5~Vf;p}~PAYVyk^zZ*}!iNH8+6q z4Axo&wzJCu*f1ltY9Le+yhfNBXnF48HXHRi3%0qIqB|Nl``I^i38aUv;V}4w9#i7g zjliV_Z<|6jA7sbGeTptvW90wY&ffcsM_BB(>iHsuCs2lFAx58Wv);%UXles|;4fjf zqu!3mpQwI~Kp8H6*R{8ax+ljDG}jzgL&-#CMH_@gR5$5vw)quPfJ%mGG1xeJ<^`b6 zAo>;Tfj&{xwS}ZWRgvXl!*Pn&&T3IO-cRkDsauJd-8+nGn!WY@Qjl4UNB=MY@gg>! zWaGb$fE=~V{^K#`VN{#)Q{}jmV`f7{x1XI-KGmc_gEgXDZ(iY1CZFCSqjF!+TEM9}=?>E!gp zpH1>1SNmPz{{G%rKB_;C+)1o-Z&*^AppW`i#W>qn2>BKnVq?NSp(lEblTs?ge#_iP zK|;x%<;9JU@-xt%F>(uGqEK5>6%jir zA(%Y))=`Y~m;-&kV^oW5B<4298+dUUO#bqTdx`fM%XMWpZQqg|dub<|?t^R*v)2Xb z(7|;&z?$f>wPzQ7okm0Bs31MHRa7Jvoa)KyGSWqNv5=zr?9WUwRCE6UkGa<^Bb|K- zC`*ekpeS(IeHRuSQVV>_EROh4Y7k2$&8~6aE!lkcPsrqjGxp6tY`H3Jv-2(5oxi_l zgB$lzoLw+A&hze)WDwE@@Ylv>60gFbnxY;zwYH`yQGN7p&Gu<66+-3m=C__i5tSqw zX>a&chs#5JAQ85e1)ZXsm*2%grK=Y>zGS)A&SvQrKi<$lHE8xIhF%+77mxjfdfdfR zKy}%v5);t~?%GVetLQXGi3KgqxS<-EI~53tyWM%+9Xf8CV`LnSq|i-7L9*@WYgI0} zZ0W;y{dfFFhR|(RW;ectYIfSorm50rdhoP}6UjY{W@sMQ$44H#LEcgfIeNwHAu3Lr z#cG}$*?PcSmci@^-3`PH87vvQqG)`UOgW`T%#?x9#IC|k^gcyXtq!lbge-W%b!|4v zooGtaHqm7_Qex*OfD_MS3VRY;>D4=^@2PsM${DDCG%i)upvLcoI)Zs z&+;4!_va3G&+FNCJdYcLA{6+}%`+dLjQyLD2shz^|lIdlLBMuK&%e1k^cX4D9+yGxfD1CgFO;eOv_%HoP#l5?;GO;xC z;@0qH7uz)nJOXZbI$85lSKJ+MPyE+p%p|8!;ojLO&!gT$T&J*DXysLzM#oUg8e@`# z<;VOZlXINxhla0+w+S{A#%=0(O|9I7aVlKYT8bLB!k1syL2Gda{Z$d?<4`)!RTj&@ za5)Ck_A|NyH>bm2=L9&#!NDK$7h}x(U)aqLfb1H5Lw5T={$M9x z$535?H`SXP%#GH7tF5nq4S(x=Ca#Z)XrJh9a%qESRFTpR7UWQp?L{q znV2Ex1RkM$k&OcS5xxD*V#6_b2HyH#Tiokglx2!o<|Dd38f>e{lO~z@vGNEebeFeR}F-YnPYS@Fh9S zGorJ2NOlbCjcl)xuiY3ZY}gLP!p#MS#!r7HUi98>C_RQ%=t@gc@$XD){LKp!_q`@m^lEh6<7Do?_fGmU8kTf&0up+#!__c%3q-7u{Qg?YrgD*d0U9u z9Q#5-8(zqmA@836;M;a8O=BMNJ;rBqQf8byn6Onu+ig;J+S-=;6rrcfBWkeP`?0WF zWvYKh6@Lc7uXqfbP|fr@e=ECfxqUV)ee%d{N&B9V@LN+~OhZ6g=UG#ZlOt*Bcd%-j zAYdqFu;GD&=Lw}Y#@ItxT5vKt>^C95G8lAnZ(^TaM3eS)pv?How)p#AdMJintx8V2 zl!AKpVugx4*yaY(>{$C@m^V-D@2!KUOYxt36-SjW@ruLel0`)}%=qBQFr`T3xNvXvri(iGE{3;!xDI?`OH_(Df&%$ z13aDlqk~&AZT(O>~qwtq*^%thbeSeTxjx)Cb_1Q0F6=cuNu>WSf|PURS*trxO8 z@~P_f_^1uw2@1C|XJj2SAlZ6;&_u1FornVj*0G%WwsZePdD=9_Ov z)ebMp5zcHY78Ra^RmP+yGijKIwp`3WGOB{fJkYX)8s5#=H9tIJ@)q+ouLTBEC?S@D zwn3T1=JLL_{D95kx-6j_)%i)}c>)nwRd(V7)R} zwKCii{@_!_3CtspA;k#neMWuZYeTPC3)o#hY9ME zZv)bc+Mi+j>pSLZ<6Od)b?Hp`cMK1Dx2#=G1f0tNK6GEYKiqO(9~>dy=<8d^Px%{n zYpmmJ>XKt8pMN42a!KitZ~gP&X(*$+gfL;q^ZoN4hjm$r^32=lU>@4Ll^@DW2O*Fj z+6hG?INR^i=5+tc&+yI#^-ie$Y&ZA$|3@*+_47kE`CXEN`!pqTZ{&Vt^SZVLv16{; zaS>~@sg^GWVdIw9-ZCH~f-{Zd8K>X;QhO17BtRwZEc8HJfD&Aeg2YB{@eLpsEd3nE zXLKRGMInS)>w!xIV_A&WRK8+Pd(2iG7M&@l=^g$7F2BMSq7QHC9kTU?J>hjo&DN|< zb?jj>VOidO_Ch{9^bqZa^IW%gJQ5|(1LxD~G^NHiMcRc!Y>}o|YT63cC1}x`8#=tD zHC@Y&HXoH&7v*5#(7MPQsIn2zWQ?*a9Lyfbsx3*c#qPfY`H>$|Fubo2w9Q=G%BmUc z_zx!(((zQqQ2?DO3vx(HS(4QugBO@eoG?EdwdTjN%~=p_)0RGwUtw^~HD|6qDp9J{ zp2tI;zMsUYEc@eNYHV6K=9STDBr^4VsAl?eb3U1k(v{Q|_dgHhu`V}(Z zofiMK91CHOPe{II{CT{g);RKbbJ^A)3<7y2{nGP0{PuYhTGp4amwFRm*OCc^Tao*- z_s|yliv`)26VsN{?=303TPG*kbjNG{Q|j`IE;%$@S^5rOO z&22rt*9X4-=nNZ@Ec#;Zb3we+5!ifQ<7}AN1^-k5al7&N)%KIWsl4k&;@!xlbB29Q z?JX4u?zb#;uLV%5^GbE&1)7a= z?^U5Cc%6bm{;dA1tt1_wQXe@Dqiv#f$_qgwYz`6Ud){A-lt7**lS0B(-JiE^k1{Po3&8ASvZN@BZuKr7DBO2t=CBIz z?zDR?lyWtm@f!3rEvL81aM*)djuFM#9>&vDdXfeI><6t3=lUZ^E8ru3@kF(@6gcRC zDZTS$Zai3DuyvFcjD%Ft0b;7Leu;G$`$(rNB3=}-o|`z)QAB$^RBlq~f;$r;3J+`Y z%%Y=M44Kn}^=Vek)3s+1+zW>Ob%D_IT&CF}nO`LIFwGf86(@|)%5AX#?gdimBgJHt zY98cD?=xH-UFzQsKEXQUirm~5F1~7sy{E?;6ZjBc;c9lm0ZoDV*zBco#AD?*I|$o9 z0B2|FMwGVWr)|`*Sq%516C33tgdH*Cy(nY==@>kPtP%rN@5-j3FUh@u>0 zpWiZstq%`N?qFHzB+hfy{;F!j8DUvMKtnQoCs<)0lc!Q_cXztssVDKqfbQZ6mvNjB z(2@kUgYiQZ~I2`zNIh9b(Yv+ zyMjGL%V2V+ihk$TP@c4NbHb4jLyo0b6bEQopOZ|!@JQxRPNiv7{O{#ph zo)w(hkg!#o!wN#Jg6EHv$m+D#64);ZR+}e{;xjJ63RH`ZSM8NxZ0SGCF-A_z z<&E#;{|vX|ay*OWRNqDsyEuDAfqNE1T2PV9Xewi2$2Wgg3rKTnQUstn(Cl%-bV zBy&C48Ac);RA^!YQxjK1Z9%KFQ7s-Gqd;1TYc&G&qe zC-e8=nd~y#Q$hTNCQ@q!3Lto3o~c1;NbBB}I#Zi>JIJiKSP2Ga(2C4^jrBQ5qF>a-GH>Q(t2uXrPT@dm@(;6OGzWs2zlcK&OCK@*z(Qf0oSsY zE!A#IxHnIpGupLarIMOY%b7iUqZ-R;OxWcwZ`W^y*PT!;xzr&t>-vG!tgJjj0@^7g)r-Rsye%d&%q>f?CUch{N`SsYQlIF}GJ9j(k_z5_u$dpWNa>=*7}@BZ#pTg7pL zAurUOKwLY2`>ftLoG=pdM_l{C(rgOSQJ_DhFQ?`JuPZ`6KlSD(zM}VoS)tdM1YEv? z=N`*?tTwX;at)csiZ`+SDGb0}1besR9?TbB+zk@){Wrtj+rQ@-b^_qT^Qhk3nr(66 zhK!lL8uAkvOP#)9z(u7?ZvV$)63JK>lh0n%s<)oReRGsRH=R-ks8K6$IPdE6!FQbV zCC$*UDGj0ilg>V6ji)iqz=ZE?#_;oX3+Arn`0e4xWcU~E;hFnW8l6yX`0L;25=DRq zfIfY|zYq+9ChM7E(cec0boc6oNj*>i_9;-XZCFoRbVO5wOLhTa?&yAKT`JiW$UZxE zN!l726XE8Vk9il928XylM9g;_9`c)QxN4c%WF0#*kf^efPxS9DF83OOPeIa~PqPqY zccgW_7qo)>&O~~uLa!Z8t|uw6C+gvflnnM)vO{hzhu7!ak1H>v{2R?tWBGCkjRn!1r*W@671tg^ZD&LtXrctCkX10}s4tTLZPJ>dQx}Gsnu#)+D!Ue-}Q=XN8ax@2ZD`Y}Gwc zvs-i{PHVn%Po>D{A0I70CYTc+N#sOv-mn#XB7&avsdVTgOioYd3`3p$YtDiHPLBi!1{lpI7vV*zB^$-~`p346;NsLqtmSLdO{t8n9bKiC_ph|ySY!nI& zDdS*Iq)1}%Z==G+_OkDDl&;_m)USiRHK)|lLcS(FXY45d0(JVgmD4R;OapOb*CJ3; z;37n8!D6hVNbDSKqq0F!6mwdU$XM4|JdnSE)4GaQV=7-&6`7RjduRzK6Cz@)TohNF zXX0^7gwzi=N$vGE?3$2~>Bq0l6Hs0R zFp;hVGU<*R?MnVkhJoEWf^~dSp-BbjRL1}Fy4tWk?b!l+S?oG?0sWhg*wxaDzv+8j zkRb9Xoif=QYw}wM*`!SsYPi8UTo3!fj-=HUOGa8h2BA!sLjEka!>UkX5v%(4@Q#)_ zm-l)KUc{e$oe*FQ#=E>+&(1{^+{~n)5U{+qwsvVO*}a4*E~b$Tr4(y7RP{!WR@pQ( z-c*F;lEF5_S}M(C8^Z{pKK9%|Tz%1b9cub3PiIFqV-FPp3m$(qI@I;*awN0!7k%8% zjf}ucJnVnWJO*2-;NGem+max!S0)`8d;7z%m?tz8Y85A4`$b3@+KfFq8I`QA@c))O z1Xlu6+0$m<)2=;!_`CXX>b5K6vN24!;K+9P1{js!ls57pS0kGf^>(ax1y}3;DRE8N zql~y=2^3MGb{vgVE}J9$0{Ndh>GEtpJmLlcN%#K0bz)>`{=>}4)bT%^Wb4M8E+ziG zVt5g>8N-WBL|Z-cw)b8~GjK?Q0$0JX^0ZS_N=;YAPIXZ?6#IIOJc`VIl!`6JWlX9} zKC0{zFcR;)8SYqqnX>nL>A4t)|GM9AxLBY9_`a{D0qg;OuP>5c&Tmv#A5%5{4}UJ! z+*^Q0$nO4K-XHHvk8>Xrz>CYN$D_BePVa|P&-b^tD}Nu~r`;FeTlmFLMF()jz6JXx z=V>=N9^iNTdU>Ji^BCXa-{I@}HE=QD_I2_2h^>79p1aZQd$;@YU9_Vy;r>*!H7E%1 zYxTbdGVw>k&AA0gwH-cIG?pXaU*_dYRK5dCm?qb$@kT z1Z&hZmvp{NJ>EY~T?}m5=?fqo6~3+511`H?SR~$noLBF0Y0VciGk{Oux82Jn{qGxF zn;Qjx>|0u%fY^dPAD5pGTSp|67fTzQ$TI*xv(Ikd)~=1sb^o`=Z%*7*OYW8bx*nf@ z7yo*9r+2bK1gvKVzyHVW#~U=>^XKQmMvLIxzxW#c;nL$bATa!Di%d?R2=k}Pw)YS@JkGU6Y3EI~fX%P_#zHAC+g!>~r z9k@OH3+stii_k9^!#P(lGzEUYBHrGv=i_DxQEu>0i@*2nxxV1n>DptTx&PYdMR19N z;Pd&Kz8}Co4mZAMSlLX)ed`N_^2I4Sk)O~1GEdqwi{eBljC#0R081J=zcyu!Or!6x$y=*9$Z}PiSZWqu&?;% z9@`gAU0oRq=x=uW`aPXa?LB{?!GBQlyqq39Zrt^33$E3S4 z_4!QhurIt&(A(G&T(<#i_IOU{e7%DLHmzyC|HoaJ0=r+6(mvPxfg`yeH(%cb4urYK zaCd(~n}o0Do5zRf+PR~x&iVnvnwgxfkNfurf8;N8-n|#m`@87yx2r2$vGXZ_eow3S z5bxKByZzSZb;r}z*GWn4W{2;~p0~aK>xR?C^=Hp7I;GP(+pF$3Cg7)DjVqR3 zg|R?4$1;nLZOZHOzta_K)0z*j3ohW?$N6UbS(9^Yp>DkA?Jd^Tt;M0sJxy}=$4*_} zlfTYpm!Gfso2W07@4~|I`Nvbwb>GU(*f;LFhtQYlYS{kj-O#`0e9tlX<6ZQ5Qr~Cy z&VH4^^_{bl{>}A^hvWKBi%tEvJa0B0bzAwfWu6O4{C&o~e4h6e_Rh@xUv|eN0Y0w} zfLx!K^OI!c9JZ1#eY1wWq8m~!8* z;&Fv_?yjmv%)aM0%=CQjpNxE+oz3Ka-t3j!#BF`PYV7Dt$ZjF57Tb$5| z-diJka&GoY-#P4uyGN`|t30;!?EmrY8rS7%tMH`nyrvEj!j_w=!JG}UkC+pLSck#~-`KNe2r)aLI^OE#?l*&&;oc7OVtcl82= z1;1*G)@2X-$ju>ipxniK6QG;Boz-abpC8udN=AIe4sIC!-97||MCZa27GR1bhtrk& zkz-fISt8f#{v)ErrtTr5Q!_ys|D%lWJTuDp>!HSooQ3zzV30Su-=2?t6KjL9OTt<9 zXIW+Mr45sM@xosEW){Yw#VtN!Zk@-?%kgwC?X>2_b6>kL9+ha8?={&ck9%c7tK!Z1 zvW0IQ@eA~)XOY?`w@d zvsg^cWwq#?#=_{LHPk!1a}9;3Z45!YWv#f|Mc1|7v*TG)(gTh)_;w=>n=!v)ICb>VtyM%K+~c7+Oy=?&PDg%$7lxr!y4di;{HojITB`0 zuP4i-j`~|$L)O5Og$9^~CylUO`g*Z%9fz7dki#yET?*I>oM&b%!Z|RR?s=H#D zC$g20F@#J<{lkku{u;7#iBN1H!$4Hm1TKS1FSjZ?DbiWfU@h6@0qS=YVi@1`$re?hQLqM_iLer;R&Uv8= zQ-|kM``9Sm;2m$ntO*aCKk7|zs_OB3w0t`A9}a=p^bXA`GCIoy<;kfG=x;GUqQVU)sYDT+EoEJ7$j|xpqTMY%q3Li$apxT9 z-OZofivFt}l!3F(h4C64d zre4@;bi)+T>;RQYrB94=xElyV*}3;)w{Fk@A?T*EVyAs?gBG8PvKGw=PX^04D(5oCm&VJCM3U6&(M4bAy0kqj}c(nx@XnUuJ{PMAsA$L`3Q=!CnD}E$RqI->SX~q zbc0;VlC9lb;2n9Ms;I$bCkHLRU8lTe93nnrJ`bB0scxA{q&tDfoBW@NmO=Z%4&fMX zLy@`xD>T}^u9_lBE+a9u?3 z<@8ezVnW{X9GI_>!nZ*E^g(N*w|>{k;P5)j{-TVOf0=RJ@S5K~GfaNp_hd9@{Q~MgxSP!q z;8Yv4^e}X7)cKBCLhENBypn-m1g=>i_csUxpqV2Vok+iITW5!EY@+t(GyEDrLLP=@ z9Mg@Rm8ux^9ORyF2r3huVH=Xaninc$IJ@OoyqYET7ii{^CznkD8VM2$tHC*Mfct>Q zj$i;=NSRkxf7e^QOT!9YZb~C09CAR=W4dr$n}oXRFDx6ou!*QV>k$}N8n8 z8^Mjn#z9>;4&fE`k~!x9p^ue!S(gmyAC3c&k!<1p!Jq*UH2Yf=XuhzBb^bCD?Fh%21n52zjOY(j}Sy7 zyS{M`*5Ks)U6Y}n@|#){7Z`7`aN;-=-CSFIOxo+Ya(L|lA>g2%XFAN~L`xY!AsdDZ zu3VYlKCmcBW5+6$LS|4lV@WPnf&N| z@lf4mb`9m4Yi#IzVfMhX`tH!g2RAv$fa22yc|nKcy0uT)W!T650h?-k;+CL2I>S8t zNhgeN;@$^vV<1ch`=N&ks*7Ctr$K5J9j)!@VV2C8aJkl%>mDzL$>ZN5$1 zIWqzgv0PGsh@6G@tTK~e0vUzD>j)QgVAk7GZ9wQ03cvy0rJe)IEK{wwrFUXDZ?wi( z&5UT zplJ&&Kxe^xrF}H3N8szP^r|;0f!e$|B3BOw293__hwtsQu(yczvc~WlPHtcn4)3^Hk()_9 zi-IF7h0-&2s<@cytsvov$X!rPpe7X)X5bmPeta z+Qeb&h{o^m9RYLM439}fRciJ6&vP``gxx+tjqtNM@FNsPGf`g*##}@YyaO|+=r&lc zPmJl%Q`_!g4Pd=b4OkKTnaK%VjT+D}2CdVH3q03s2Wx*$l73KEWSj-OTR%Rh7=o7k zXp2R(m`>5qBHK1ZNS@|+rcP?I2vtH6IT$U1gJ~aF^!QuDWvXe$gG~y9RMPMpmmk{T z$^a5629>(mWyU3uVa>$HffUmn&5zb`h{mAL0l%-6HSoqWPoza|IigRU@{6Dq)^Ndc zGCx=DEHIfn=E2hLXnaTqga|eyc?RJjY`4f)loH61uU=SfXQ^U!5 zy!L*~8{e^_Zp$U_9PM}k%p!t=r7D?lE(2o>BC+}J&r^{A`2Bo$W2PXE!VyFR4VU}v zy=y@#ORjwFQ|NV`H1J-t$epf};{)g>Im(0e215`Tm+%Yk-M{i2$!mL)ua-ck2k@70Cvb{yYBVBrLOZ4ONZfT|w z%7eC1jFQmC5*&@@AC127zsUI5P_WwV0O?L(#%iWi-TXS-cMHjq0xo&pzwSTo4D2zS zikWvLa#|BR)jzpMISK_ciQlDvy#D%DeWb#TvQ3k)CbIjqKmks}RXy}JSbfH5UAlPZ zkNj9C(a^?q`ezWrf1x3x#4vv~Wh#*H0}_Hmm%z;u>}@b?@xPSs$w5gUS_VpvZE>98FRY_Kb<08)pZ`&cl&p1zqC;%nlC8IF)lws#%U0=^ zoK{j#6iD=woh3!bWT;DAyMC*-Wo?LTWp*XLPgH|U$nz0D3Vfx-s%bFEYmK6FgT%V$ zf$00LofgkqDXwxXF1ROc@}FV}puh`6WPH^N6O~_H)tPeDf0d_ZyGAFlxDU#JwAd}k zgk`xGt-8qk4ihKcc6tMa*kW)wU41YyMvO?v+tve1q_^gusrH~jqCZl+ejpf>(d&i3 z<5RQ%_*s+#+mKJ1#9+={*HI(dlTSE(#98K=Xt^{P^}uT}_V|}|dRqq&2*NRQWbu%Q z0~C^m1>H_f-cwIi!+i;c_!B;){ntV0A@$j|k9pts15^PC8$V?Jgl54p_vG=g)I(Y8 zlwa3w_w9IGe-ewb;Q#ffV ziQS?l-@(6*n#X0SJw}@4?$~qu7@(OU185V@41gr%{0lY+l@)YN!$6~}+)2AK0TSko zVk1DYUjzalZ)!<@ML`8&83TkMfE{g7u@A6J3JhL2b+W8dOSVwPJWhaR=ve)z*p#E? z6;)9PgEWHOWz)X3H4)YPTDLUe2K;3LIU4HRd!uIy6f7?lZH3=48UXnX7e$abZIDT> zAy;dDX28V9dqza&#)(f&3@%kSZW0G8jEl*rKWC~5Cu;NCRF>so5{tV^RTVL+7!w>t z#Qajm0!_9H_Dta=d7YTBcV069beZPzSFH|N9G1hG!@!CxuVup-OWmk+kyh&yy$ai~ zqg*J$gaezFK+eCQu>x3h9a}CVxaAa6>I4YQ1+XlwWY1f;049|1u#wB@KkX^fV(v{m zLSSh4KZ|4wqo$|x4Gt(nRl*mS)$45dq3FIn*vKUI0)Ahet4J1{G_xezW0 zQA|(%u$Q2zWp-F{HtR9Fu}9aL)IEPT^Ol8V(KJ(8Yu|bo0U+X^={9Y(glCE0D=TIQ zbmc8TG_A0A6L)uvjDy)gYx@=yd6F+2*tDDx0{tH5$X z?qjB-Mm&sKfHsWTOZn;)_&FWX?p%S_`(B*4Yp|Adq~UAGxnV5k?Q&&B8NU*wK&T%I z!h!db+&RBP+M6BH{e_!|3W%0JP!!q3WZt4zVP!xXmXapyhp8Nua(nG$ykZ-LULp<)!XU3W z8X_?F!ig$McA@)u%$Q9)0z9VBtkRNPm2dFCkcjDi<_O;tsA0Ib<5!2Jt()Btf}zeb z`dI(y*;=Eef+aT&U%jLb#M`&hz^l{5uXF)^6XxFiV~vcMUh^Isu8t_4jt8B|pFde)K|U_<*!zk-RgF zB45@jF+fT}RYnphKYrA3Wn~w~6XTbN2?SjWQsjxrI3qcP6CD!)_BM?{y|Uvxdbz)0=x-8$O@sn<1${r@cE*5n*LT1g;kD#T$Egq1p5Ourn*Yf%pV2%^+{O2PvmXonVopIn%%^s}TlG|C`O42a{}5Eex$ z&ZVO1qC#{cU@?iOsv21>y~w*kzg2loG4Xy2u+$hWkRVuWi0oAx!SwXdL$)Vkq`Zpx z99>F4$PUyl`pJa`3@znY)s6nG}aeNESfSx0P0QU+bLJp~wU+ae+>I7a5T*)Hs<;TqiCxlIAkh99sg(khw z5%^XmCyvRxVV|X15ji1Hp}uaAqufb{RZ(_85;77RbMX-6_<(=>7Pu)fRT!}d#_B*v zq0hZ^C@nvRQ~bCJL-7`n99tHiCTN>~ai=93)~}3(NmQp>x0mw0BvuKvB=dQN5sIE> z-(j-Zg}*~*Y1#2q;*YHO&1A|{ufm3S7*cfyR~8)lwL`juu`EYr7$l^RPk?LTq0$gV zNm2I_0SDrog4*VEe4*yVB&}$r1Sh>RX^$uauDY-e@3bR=gjE2*mbX;XBYqH)f z28wYf4I8l&6C=GX*S!TIx`pVrxN#b|5+O`-BEH zRxGLM3+6d$rBQbH34ec_nMa}#$GE~S47D^y!YFR7r10(353$?Pe3ma3eW#|aCaqtY z!h-d2d9DwRKwU2#RuL)-Wa7@f&JNzv_ulE%GuiFcT!7cwQzGm<7b3ssmAu_BvP5S= z{H&PwSU@-i99Dm;4Qj!FObTmDScP;n;CIe}~x-58Sui zGHA@dD&d8|qJ|Xva?i7T#_93Mb}l#|@oT%jdj7GSwYp1{I7-WGB0E;k4!zDofi5l# z)Vg%2UWK@PTRF>ZjX@}U?L9p#YUZ{n4}iflh*DhIz-$+v-S4O{fWQdV`}jWmS~i|W zKf}55xS2y?$RL5Jisn>7j=3%cY7-PE zv3yrv0OU#iEc*l*;?9*aB|;YoVl4S+EHhI@$6YNSbHiog@<5fko#AlcSd-2uq4|6e^g6A{u*r?V zwCrHlcZ$Z@KHz*YwqwA{4n@3WiBEyZMPUgkdS)6t5;0|VgN;^H2#!YI1|rJ@QENPA zy{5_aL9=)M*V?YZ6a(JZ;NGdt33@@%Pca+uwH*|Oq@#?KpBp)D+g2W~unPQ_&9#M9ZW^5%NgY#0Y)Y2`KOXY&50A@J2 z)|4Z@5opx;DH1$>^tEC^br&5Z*FN!;Q2oF<*0uGjpJ;g}8x};sgh)_t;ba7e0mK_K zvWknhP&$kaH#f0VKge9{M;S6yVWbhs$cT;QoodWgQc=b6RwZEG?y{TYpH3Y$7abIT zSJ&3k=u9H-nIrJdv8}~JV|aYp0`0{FMVWmN>+q7eeF$1w>4nS!o#W$J+NoxY_-}ft zj}ysDN~j$gGSB>KxIAd@W}Q}Km3z-KrVr{Xmt*9EDp+KovB^g1tq~e9D!i|YjTtlnfHAuMS@JVQZ&pkhGIKDs? zC>MAu*`#Ii{vgfhlA5|Q#ujIJ3@O;@{N1rF5~^6pYlWZ~y5$kp?qvrxyE8`j)k-cy zqUj+@9WXH;C}fXXwz-l6_HbK@W=CSn#dB!--zh~5L zuO4wH~aNg&Zxo|Cq(w+B+{dy2;A&E#p#btUsR7l3x^mXVBVqJdD{g)kdfTJnQ^ z{3Sgr^*tLQKjvl7zXqm3Yjn9D7c+61)|%=XU1yjyG!l8WDLyY|uU;ycpi&u-hH6bS z!8{JXoThK(2=s8$0;#M@l1h4w)q;^|(d3`JF>*ELZ7oR0*1Sgxx60xVC!2MI`5j)n z;w)pT#8lB>!{R=2kD!?7%lXL=2F0TK263t=q;-?^>}{o|t)ZZiCu!ArvZNIeGTTIC z7H){IR@UPp3o63)SGP%qJvfVFu;y~}HKa%hDV*G`qMJ0*{gX#jI{ZvHLB6US?FvPp zNh$g;bn$6-;8%GFaN5FbV20k>{A)pKYK4Lrr{|pg6pKAMqbb0Q?8w+v&e{>n?mz<& zQ0KJHrW{6}FTv#>f?-fD+bA5f8)JMGB&4*pPG@fTP*3ELXiL+tIH2R~0G1UC#RDdX zt?oDKnM+~=za6dF;l8}sD)_4}@JFi2@G$G^MIfCW4;xUB^WhsTq&LMMy9yuY;p@ro z8RT~0iAktx$RYj$U3{2W5>t^HD07EAI$0n+sJ|)JLbzZy$h2qiJOzK@_5$X?-L0qQ zju$%I^EV)e_32y?MDYmCfK_OMFr@5>dc=LAnl2}w(ea^KmemcFOthc~G% zEe)u7Aq5#v(!L0qoI3kugC#@{VSX5Ol?2be$<1$T*3|Q|v10zhZH&-{=E$;X<$ykt z=IVc(5^WHcj?^M*sMMiW69#UPY#WjoAjI}s5I*h*p!J&k1c*?)KAPS+g&Q$-bhLrf zre#z_d-*KS!EtW&aRw-CI>u5aYHCNVIY=>uYb~Q3qj{(yOg7ddlFuMH8A!yotlr09 zc!zpWHd-FyMWD=?=tH#R;|q%IjetfIB^aH}yu5v_;lsN%M@#riRZkkLr2bUZyuXYj z&RR#M#3=yhapQH}^swse2CwV3YX|P_C}Z`BYF0^*q9Ud>;)4hW^7#fWW)@hu1_ z(D{eWFeJaabl(g#K0O@87HCPFLhal(Zi#T~zTHtN1IS=nPN_!8;3E1mluhZqKl-Db z*@YXd(~&4jmzr=4)b2GqI`C+eVz$J)Bm17L#q%{x?n?IFR;Xv{dB!#|jyV-G^$Din zXyja2>m)wPGZnk=ef6>G>>$O;OGOt4E?)w(#ce>7NxUr|Tm{l3JbLOfLNQaDIptCIfy$z-}og!!*UUmZDV0b98q^2fD@5xb`_~mUfkzP8&{5Y?09RlOtHQaS>mT`-Ml1cYiF^lK0~Z^W(TafCk{Oc#wDr6w+zkY=(_RcVZ}j8|536BGT zi7`*DpHTb^Vsbu(`A5Bdp00F3s~P$6AK2FNxh*vB8%3K1)dPsfR4dpZFYHMyj$-=+LmL6ZN-jx?QKK){NaGHSZja)xu*A zjPx+!xgt71OE5;)XRWux{=ymQ&h_`3|J`@%MpFsu=^YTWO{tmD#C59tQCLhsum zVmKNJ35GO97$V0z>Pb^bbK!mGx|ln6Fuzb~Pkrya!j0+9$FAqo)Mc?BvL-ci!<_Lb zi#kh|w~oZF3CS9_HaK6*g8D!tNr0cSCNG4T7L|laPTHV6V625Frx&oaLpe*5jiqLo zb`2Wro)hC32`~q>x|7H3FjKQBSSsnDHVO4YZlDG%4)yjk~vsdk43oH@U%#Mf74v&VKYuw4ko-7s_~NKQfQYbKp~2* z4T~(dH+myHrmtduoW3R4`81^b%>P{~$j&9PP^WrsR=#3-7ztl$87*fTPCdv4(2n z#dVV=VHEN69|Y6wxH~)&Ndje$ciEpswTF-jds`a7bPg)N-4O=kHJRT+L9ryCu;PG_T|hyx1XKt7=2n$M zIaa@6iPX~Fr$DB}tdC};(d%3|7g5-lI;;c;{(>%b1!lHeB>en-7C!QV3sR{40|b?q zR-0+rnQ2i9{jRaQqle)Turc*OrPPPwcuY8KVtN&+Q=o7=-Tupd$vM&-r-V)Ib;x;B{R$Z7F(}*KSesSY zERYiRNQ?}y7#DI#Tb^n71pH$|2lz1P?C9_`2M3DqPHJLp-6Sx{>VglJ+SBNrnu4i# zA8h7e^@%yT`#1RQ!`Z8h7J7lMwguaf)sPA;I4;K7muNUO-jx|y{;ShIJUC9)F^;gH=3X`W z$V!_yKbK2;aO7ZPMJRJiT`jAosAe}+KLY8g_^Mv8M8RPW zAH)0X;0GNw9spU7x5r~17BbhzTm1DO1HG%G#L;xpeLiTXI#y*RHa`$1BmZ90dAHS` zwvy5ki6w4vFtk>toEx;-6TQr+0@ZkRz?RV(nhnK@C5g$TwcPpI@l3t+V3s=ybSGiC zUdrTds=||wkk2zd_H2L5nuAO0XknW9ZoBjGvqpl3PL-TAoE{B=Hh8nmTe`qJ+lsh& zRgoLpMPXPA434!Qb92z=&9W336M3I7eswWEjtbL1@a3+{UwMC`Bg2eUB5QR+zfG+- zJ?#L2%w#OJR>bO?F4=9p7FP&*q%?R?Rf#oUmyoD<-4fV!nS2$^ku7lEpuxop+JCpB zE5peK4x78jcak#~f*NCWAf^-Q_pdYE8N!NqpvAxig*T$zl&owmy~jdY%Lr9aiD?`; z{PCV!u@F|&zlTH}@T5F5n0Ijc%jeZr+JP3k=ABy0`Ln+44i_UO8PmG#2h&2q9c1*m zvazI1KQO13qpQi5xJvGgHcqI1l&M9lU7?1U!yMwpc+GT$XRT>A*RXQ|Int92X}m4k z>(CN4E6iNj%D=Z!EqL7B7curJ5IDbc2=KG6E?h-v0K?Pv;`RM5ON@hHdmA!*lV=a- z3B+VS^ahJI2Jw=*mj1qzLEBjoLR~R1B}`6!HrFW*t`IQmuYrNuYfMs{cxBsqX`t`l z{i1;|xWkOA-gK8}lYsp7E43E4y^^UYPYN{C@Z(lih(Ee4)uL=XQ9z1&;WYT|C>vHz zlrZEr;-L`2#bf1wwbI2zS~mj4zs!P??*hg1=HcI;%LOSba20pGidau2@Me9Gg+;aa z5)S-Tgeiquik_#ITy~0ySj@DXM_H1tm*JV@i&PqT#DiaW3(6A1c<9QaET*t5p9%OP{Nk6*_8sHEI8dMCpk_yuI1b`K@9Y}k zVJJl6uBvrq$Q#X$QJW zZ`o~8&KEO~Ongf^bPvU?8+EIfF5=lVrF#=LM+%5I10GZVVGlSf*$Et*d^EU8{FJ+` zC*Pl#8x3Azt2Y}rgkM3w)8@C=&}66t;iIGlNy=dw9?|q`MW&>jK3$LpQ!A z%x5-_$J@Ws9%@fLs9QN_m(shO?GBw7dBoVS$f`{@etPx>;ZbPuKZp&4w$tIIn>4t> z+g~a-rm>nAd1-f#>=fN9gJ?*qTS=wQb$d$tU8Z?>Yj&0uX}Ncf8_t#eh{3bvmo2m1f!A|tIfo*_2_~l!4SZ{^rZ4@<2p(9W8 z!v<@}STF_(vtT9jj>pJBv}CQs?z0uV`dIJ0H+S?zwVuT~rSh-f^nb=wB1Y5T#T3hc z;D}o9o;D+C>3N565IY3{j1!YG!%>6eL}GY&u#Sss18L1dd}`{Ml{1&wy(3_ z(z*X|1GNQUfg6C32hh6~oa}m654CQhixm%8=jq*oA0Cj>=(w7|GO7Ly!O{Nl+Td&p z`mjwK{bnls>p__xs+PR7`$NzyFIHS{uCJ`qx3!_+dBu@9%kXfNXpm zqdkBGEY2?2eG8EB<&lRMWt1#_wr zby9-&E38CYJg(Rs9gaH5&)E-^Yw{iI^!C)9%Exp9SxR3Z z-9#r~vj2>4ts}3=Q_lC&ew~VFM6)23X|RDjLV$46FBQI2>pv{-8f>xdGj`l)8U`KB zvoNPlt&=({F|sW~~g-H4wReG8Lx@R-2QHav~AT;aaHO3LJ@=kp2qMvxqiz}ZC%a{3)!sn_|u z3-@WCTZtz7S+yFEu4?L*g7THH{m>Z{ToZy4{iUM-8xw>}of4r=-q)V{#>549U8cKj znyrM;yfClqBB@pPb=rl$(|Z*8<>euVW-P2rl%kHEXjP%@T1zYi6`4AU#2;>F_eb*J zMVUE|3yd>`SqCU?%HE6{5llk_5N)#Z_zi0Zyo1~scN`Li^sQzp`v!Kd?)pajbN9-# z{P)ttk!fxgS-3H?O`T*w@Lqi!ojiDKv<*>FtpGq;w8eKPAU?kyHbxz!30Ew22KH2Z z1B8=jP))U_Pg+))k4CdelVDEsG`3@R2AJF+ zdhBJb0+Y7Rs=Al#7?0pTx>4eYhqe8KEhe#so48!}xDPveg9cT!5b->s$TU6g@k3?z zjXxZ31!OE}{8+a_6ehkct1WHdm>kx3P}ME7{Kop@`FhQvD-vR`PnNp zKsHA`?1RE679JfKCb%6GSgy>X`b)jG*cH2jvGUVdr*E!;aHr+0gdmCo7gnl#7C z&c6*GOhHk==|S<64G8|qb_k9u@V%kyfc<-4j#esif=;87#ZOUID@eu~9wNiz8?wex zhC~jv)WbFZ=P#9-e-BfC7_V z-Wbqpc2Nm^q03|v0agb~eUFijia0C$R=nt2E9WKovPaUw%YGFuAwy>ZR1-hj=B$Z5 z6RsL^EtKC*>5gdt{*g}npZ{%dzR_GUR0_B=4-W+bLh?WCQvYX1)Y;X^)WY>YTcYX; zP8*WQ-FUZw*h5%2%Ib9C!IY9gs?CSU%UIGd!Ae6h__DF|p3z$+2*<0Q5vUYg=`rb4 zu2$O{-cAv2Zf;+}^Di{ngY2-Q_vY|LXQUr+jECF$Mq7Qhk@fYibS=ur+4v&7nOXU& zG$K0|I(AtwPW0xog-=N;GeJoN+zShG1A_Z-v}y$qYC%GS6G1#a8PTvi%yLBp{_7KK zPoW(qHkX1)I_QLMYwQds?~`E`jgLF} z?CW|R6*3O9TLF7yL0R=e#x%<-6R3iqX=nX-+MEGa5A#s03ght@ttQ{FvCuQX3XPWT>^i1r1Cx-x#RCFh&K#_}6XhDRCEq|y9LFEJAfhKTU z`{6OY%FZ7W4h;mZ&i#=ooA||!(Vj~XJ|wcJ@3Lx;cwy@%Dpi7N%B+5gnmd>m7~uC- zFN8xb%tiu2%B(z!Dz-;?vgsJ{=7_~puvd7Mxj2>w+#ixj#^?$~%WQO+;#IHQGRBQj zBtaI)b%o9X2&US#2S=nhNFb;~Gp8#HZiYnhj8RSOhgJ!O(nq|XvrE=e5|#KK`w$g- zII_6R$PXLp)8BTbtUentlvCp?P)QKh2k*DG6!9qW`<{u*?5Q|B+Uw)Vfq;ul3Lb?Z zGD+$q2z&hM^C0Iw=t=#+ONs!_y_VlnO6l2#Rn97Q^e$CH-^fCidv)P5_A<9FHv{?# zIXeY(L4AQ!b}>&(!~I8qzCvt;=l;1^4huJ^Oyshs4h*dsFrq8x zN!(wM|8-M4@p)xb4h96IngRrb>VNP;v;Qa?*tog7+L-=yw{da=`r?s}gVVk=>Q~Rg zS0o@>5w0yv*w8U$%A6uuct9Q$pDD(*>X*eOq|eBjy(b_1`$b))L#Ts2^pr$r*<@Vu zoWZBMr-p#Wa&BnoB~yFt4u{_DTvtV#&(HP%>m9!k{J)_@f!sk~VIq3BES?Hbj{G@4 zGHy>l`w2#eW)~}NTqo7@KqmL5G>m~{n3iO04x<+S>UJa6u@@UDY-y@U?=-7Ma(xjoF9fL%;C3NW>SILIS&iv~!C5-djuT*7@jwqB?a7el*1 z6VZKS{EVt!J;;sVr!OHDr_iTsI5qV9Jy^Sc^u(JRf15=vyEyFDLgxL!y2T0`8k}L7 zFdpm6us`IZ2oW~%vVFSQ2o+q?oxN4R@UW}-y7xtwj6I+Sum0KVnkGhS%&9z%vtUUKg z?fO)LyY;igF{7_;$}`g`Wh6mpc7R)Hq_S?+A^H?XUf}tKts#uwi^J3kR7gKGNXF8Q zF54c}`>0lc!uznNK0`dNT+uZl=$?)eNe<+QX1%6olgR{75up~qKK3hoj|=zyj1Snb zcE9*$UEkX9X#?+v_qi`{e8~Q;HA@wq(V~9awAo%FjN7oR+i@^NdYkr`JYBh!Vk!Nu zlD_y}nqEv~t6Nqo+;~ik9Hm-57=pa6wV`%{+FPn>tw-PPi6$Y+r)YKF>f)Q+49fG0 ze-n1@JZI9UWDm4|V#Qc|p?k1xP|!WgKgvXfn;t@MQ_&Q4U8)ymAkTnsdI{HwN$zPFCwVTvXMHlnpE zJQ7X_3zWnOR|;TOsn8T|>cSxpI|<3ak!popiz2KqGU=wHt9&z%^nrv4i|m{zXzI!q zNoXm+fVx^W3Hnt=e<~Z^fomu~YQ>!IY!}iCH)HM$KI%T&!?SV{7r->!P_KTfYnqjC zWQIaINqio)VU2)E{;&N*yyEZC{JftalTv7H>1FiYyu8<;llKtt@F;@5V%n5DH9xsp zoBSR*Mr(97uM79Y2bq!b5qwG@j|E9fritDGwg>$L{MP!R_7Wx8G4_U9lz7iC9@KRs zJaF(pjNL}XCgeK3M?K2qq>mld}j(%6{5i|_nhb&WSls0iU^reztW(ngR&6v3> zSb`o19_GSZ5OY5oR!M|(66*BgqiGI|#UeQTZP&d=Y%&uzO><)s*l`#5nHesX$c>ea zNrsHFa^s{SYlR3Pw`}DD1nqC8O1zv^naJXKowG*iM}U#($)mv)@}vgG5Tn56^(GoUsh2CxgL@1+NWd!i(> zn!HJpODn@<9PUCHGJVu!rw69CFskCge@rXF3Q`!Gun0BLa*!edCCo|=R|VeLEVmxc z(hd9B2d)k;Q9lQDM`X`nOXl-$?HqAG6av40H?S{$_B(2QQR&qHXHzaxnKrc%Lknbh z5dHgm3aqI6O~|ZDPb2Z9h&DDo0##M=D>?wjh7%o8_?xvLe0}PY2wc03EV9Z4rWry)YU}4 zG9kNhz#rW;keGk423w$^O{b!=l^7w6&}c2zHYz1M>yE8VQ8Fm>5UW7oWd6$!u9YKv zj)t#FjQzVcf=Q=|n66&TmyRW1t*p`zoq-N{&D~E4=q(hf&s7%jmxoDNo~nOJ1=)a> ztcerTwJw8!JMV#^>h1`uxS-Emv+0v(mvqhhgFf>4c8Y1S0M}r`TBuMyHl;k%|Db+mX4kdKRB-lle0_@+>wH{Ri@Fm zmtm%-5ucnZLPX|cw;N#Ts`rHh@cNADkevG4C>2x`9(-xO{vJDJA*uY{aa3%I9T=u5 z-4d05Q-;IZJHc>&Y$B`~#tn-jBxjlt`nkhA)71Z*ct5oo?ckE<)xO3u!_{McNpzAA z*ugm&ocOlf?~kf9dYT5MgcLWV@1D8@L5^1Cqv{?$K|OU-~? zN!k`~J9?6gq_1v%T8q@p?CAWMGT_Z!OcL#7rvB8>Nv4!x*g`#vy~Q>9$CSFs? z#y5QokN9;@9-StVC$OhP*QwU{-0;_zPWIU3MrQo7SKr>;{9ht&C$j7P4$sp;(Fba0 z(e>!)eUcg$nF33zTxe^d6->JFwoz=Joy27qE@s0TxImPDr**NNHagYv{XP5yvGQ*M z9l&`SzQH5G&tg?z8dv)R45onsU4b+}vHxY)9t8v5$2SMY z+~cL$iEr$EexSgHD@$zJT)bAJcK8$^F01aE;~VV1)?-*zhIK*UARrt_ARsjVOFiah z;cn&X^watOp`$Gg2fG7FPK@A1&sUtk_>DDfpuweVNQj9NNn>{l4%5{xvHTq;;11*&HikXxm z(EW+iQb6`{_%r6+bqrH^k16XXdU<_AY*%5ICviDFAnGCERCxg*coN-9Oyds`xQw|` z`J{1p5_TNwyesk{{7z(SUCI$C;DG97J9ipzFucgXld^AKqH3w^ho>eNAw0#N;vv<+ z7dHA;{hTHWcpjX0zB|N*kBD^%6pZXQhcw9au!=Qt;yIr&2K-i_y6*vI68bPj3Wo(B zCU@~nJqe!(YaFc7-EZ-5&eURPlfk@Su!O{AkYJK#Xg7*{Z~r4itm7X zxlXY9-E1bE$`FMrL>C0()5M0Dh6rtM9j!9@?kj!$5`y5bNIvV;Y8)-GbfND`sMANih)m&GV-LYG~VNy6S>x5FrKEre2|6***-New92geBoiPP?n(o0iIO?i zS#IS7gd%s9aofb#yj&(1-!Nw(3O~h3hnVxyRu z*0=}b1A&)BMwIUsEXD&}R(krq>zEoi=Xv=yV4V8;g_tci((OE#2spU%7T+r)=f

    e?9WI7@GNgjlNE{&nWV6p>+D2B@AA3X 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%0AUzHmr4qHX`VF%Lm&~Tp3iL==-?1#gGtYK~B zXmHn2Ol@{vrxLsI0%6PHa{}k|v`V&nrsB=tS)#0U^lWbjK$_iLi$67tjzVBOt`>DX zyq&D0%(y0JorpVixUr|QwM6f3RmLbW|BR0B0uR7On~mS4o}-G3fLr!G&e`*9nt9Zc zVb%a7LT7o1T@1J7a0=tk~~1?9aQMJSTpP+I@hrZf@jm z3V&^sCUGT6xP2Z!hL?&mIr&@-Wp$->W#MCDkKE%i{v@`#IoAC?Ei)rWxwLJX;A1%!OX%oL61)6v1&DVjb_W0s zuV;!p%tM@H)4sEQ{OO#7!uBg3=K)8(tqM?pWU1g;2>Fv-qT^qonLncx)A0VlM6C*~ z5*Pv8ePC||l%Z{cArsI~j)A4X%wcQl2ek@J3^NDtO^Y{tNU<^b2t=N}f6NnQIAESK z2MdfOt(ySh89swih1eKMHsng&oN{R5oYKc3g}x?j&Be=X8U5)4vv*4#0d3s@ zlKLB?ohJ|%=waZjHshXwWL}aH@>_he#*7v=_)v9LN5q}A(0oB_NF3!bUn?1_p(DDB%!k&gUsb?fE+@tUujQP zkfXYfgXGrkY1HgM1HuUJ05+Zhl9qvmpHp`$`|8`O$3ib!`W9N&DhrC7=j;YQOH8se zKMiN_v6|a4m5EOApr);aKp#b4OT zZeN_K+Mk%NRru1s6tpa(-13zKII*~kwyt&@`J^JtDY`@v#dPI6a=jmmuGoz2N7%03 zfSGXW?(aZ{;{NRD5;Nd_C|?=Aq~ebPx+e|~$^C+mH5$^8won2?a7#GC5?R;?@IYW5 zWI1A-5i_>l%t2<2{G&>p zvPJ?KKSnQ&=F%JXJ><2DlK_C73EdSB5@7Avmwb6}j%QPDE^?D835tOTZ9iy|+W2|0 z1L-miNDS|F_LlYE4zlPYsM(LY>pRXIZxKl2c@#pmpg#Z)iH~L!uAn9^!Ti1iaN^^d zt#OSsBh{C3x>Xx!E(1qFkSbLlLPxET-o07>(dd1* z!^rn*@M$=Syk>k_TElfRGdYbB^vm_c1btiQSCzlDK}nN3XSE2M*n)KBI$}{Zxi8O& zWxXw^k3n~h*S9-#(XQpBw8!wRQWl!)p;2N-n+g%ICy5O_12PhrkG$y~T|yefNmN3g zhAA3qvx+;`Vs8d&$_yL0e@{qAF`_?wN2)s-hc?_>V~XDsM9DLs5)ON=2}`@-9nqpS zH*eyjA2V|F$f6%@bYEuBY@a8PRzBqWw*-25k3}2-9dC+^A&TkpmcW+C{hSMUmWa<0 zxLI8{2G2UBR2H)QVv?x(Z`qudpmZR`8zakrOoPLc&bWWY9fws85>Vsrhl-ql1*&@3 zX5BydQO@o!@eaO7<L5d+!eoO(xRYNku)uH?W%WE)Br9k)JhI~Haye3 z#Uz+lYEr_PlLH#tK|0%0K@wZw!Wpp7J)u~D3ygXEtvZkuoGhS?n?-~P9?C(Ax4|w& z+%$Bp3gTU#8aXz z>EhNT3B*QxDh5}>U$hlTXbKBe80JVbvJw5Hr(?!9ScjgCrTdyBgBQf z2LDFF_n_TK+SGDRML7-yCWV;No1ewmxwy4XdvjJ;UO}uPpd+DLy=%0A;q&)&j9)~K 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 ?}p>b6ZS0!9jx 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 z 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'), response.read()) + def test_server_title_escape(self): + # bpo-38243: Ensure that the server title and documentation + # are escaped for HTML. + self.serv.set_server_title('test_title
    r8v1*;-W9jdS* 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

    ;>YUS{A#%)2 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�Fz{WwD@^tx02XXv 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

    Ajt;%GOUC4y59Gd#$6YH)<= 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

    yZjyujeJ9Kf5!^{vD^>)1R>oD5X2zjssVI*q20Z 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%0D(-|d4ev*;#QfHo;5)Q?xGON*2E-b zUv$|Rmx&k>(wQdBX#6<3O&=qedl*RAiYkp4@I^n+LxeSEpzy;1{S#BLZqzdwP+Pj8 zP#_`}4Fz31pZbD9hVT-F@RYvzI1GD(fzYVOm7sQDFmsyB+O8nS3w01U`%o+73ZR4L^8fWfr9MLz)(j+V#hUTif*?YgtynX)B%%_H6KvRk);S$j7yR$?tVT3FL;i$aYlR zR$nzaDSKmFQ9~^x6y7t*zL7yK5;9*k0$eeU@)v;TB$1F`;aQ2Iucs6n#^PM z&KYG_^Ag3c=Bn%lKPI+rL*io&t*4EBDbfrU>*#?_5(D1%S&bV=XMD2c9nBj)_h8ct zgV9n=iV9wqrz&Dl6EF&)W&O6Ue`+j4ca@|9de!1EOyn$pQZh;YR{$gswo&hre31%Z z%zZSP|(d!uPX_Po=e&w`<69JJi=YnsIzptQoN(PI6E#CfD z3S(-&Lm02c;D&%=^j!f3V*U7=V^C33kl$1qtBIWx9IjUBhVf3Oz;?_)(XDA|ijgUT zyO`_QVh}X|8Xh(!mG$P8m0Xhbb#n~616ZHcdxG2a+I^!{N1Nf7S9x;nQDY<<51-YS z1i04SK3Y|4w}+-#gEF4WF!$GT>|z?)R%C5_)gD5N#n)L9 zV6WASP9T5}_G*%YEaOvUQ&eo{AlDwFa{M#QD}g!oZUoXKYeu68#Te*WU@mGC3LnP! z46PRUr=8E_l!1j7ry^Q@d{7Iyb~Kum(?za+P0I;E8B(R3|sby6>mIQDX zpDic|Z}Ak;Xf$*y-~zFtb-BNXrFhK%E`hb6VYd(dp<_PEfhwXELir}-jUoz%BNqT2 zgt{*)Ql-(_M+eMZ%AVE78Ya4SfQsF2H6JO&3h2y1;}2{_*2kL?#)OW7Tx0Ozf}-LP z>|{})%Yp|l!zh#zgtu_AmQ@@CN94c=qiRR*e&45|<=i+V8! zlz0d0Ljj_`ZXVH}hPd4%=%u5TP!J1U`0U!q%Sn>+)Wuf?E;CRNI64jPp?m^%=L8)| z`D4IaXz5JiqfsabPI1G47p@<0a7Z&l3gO`~#ArLKZvrk(ks;cMh{H4N@eNAe@=Iaz zb0AR?)G&W<%ot7N>Kfg1yD3wQLS8;?Djy>zo>u} zc_$UBXufa!8MA{oQU!Z9Eo+C6s_cgOu=Q_0r;4pq#1DQPs!G$Rjzj}iq$kipu}L6x}0#WD*VL{OuQ*dwkQDpK@2F>ra}8fGJi zGOZbydgmz!%Z$UP`8^p1SR19OkW&O8ZnrB>#r{%Lp%nvDpG&~Re*m+Ay=MSshC&DW zz>Zy5I4MAk;3`ldw;Ix!x(-mXjEoNSU~+|nh4sfJ%p$65R>k;4>jSFu5H=>KDw8u}ye+GO1(cl>AljrIrtn#1 zcM~L(qvm@)vT2Z`y7#pF^E-3-uQOrjI35{f&PasAkISLU4Z1Wk}#ju<>=sUF5<*F6QUSIoSu+UkJ z6!1hnU8#}F>O3oM6}lZ!FVp~P@}Q@VuCh|<_>lM?I|+oVS97&;~38lnvVZ; zZDwNs-8jPx6S|bdq3)9#)>faEumq_nPZ&*7h>5V=91Razdsl8>uY^Cyasm7MY3WMb zN!rx(cCj7G{|`GG6K-jwP<(3dK|@8KhV1q@LkI0Fsc-wNnOKg8I_86CAVue8ojru8 zNk#hOpOd?UZD@EpvPxTW8M9I~BJ+sav_}*G9a z1oQL(x^yu5f=hWA6fu#O8dJfNG8EBDe4`TNsq9u-SNjT5 zpDd~#)!7p2EJcf~T0|`R%Xl{mfU~DQd!448u8!3c*Dy8IB=DF3WQKH%rr@t>I$m5y z;VB|T2Agu-;vP-_2D@Uj&eRyIR|<1us1w-Ic`M4u$WUh*cSqH`GhTT9Ttqrfv^ch1 z2T`dtG^xmzdjk7YC9=8J9Vm_u@8jb02M4FDyXheSJ$YaZkKBrpF}-&NDr)XzT!3OI zy%R@8D42dqb_H`rgW8E+TWhu%(4lxT!K9Z$fWYs+jgG%_iROl@aY(1Oni{&Xjh8IV zvTdDkI3)_zHVk8Kgds?J;%W4(u|2-JGiIMk2p28r6(ZuaAFz|@N_ubU%rm#5>WZ>{ zFOQJ)8cVr@=<-G1oyDe5wmjS``d^iKj{8|Q1y)WPr8wj1;K;?(ziwJwcGV#|+L>tS z&08p!Yk8gJ9KDDu3oI*vF~yYz5(jsH;;lT zs7wWysuu#(Ai%It!h66Yw-QI(tdO4LEh8WMQB+HreiftOy zrJOB-IqNb9J`vmR91Supfdi)_O@^VTt}Q{*`4Kc{dZbYr9*C%E@oK2m5-C!QrHdJ*<75e zY%Df&;K&Lf|%%~ z2!R?1*yc-W2je>MUzUPjS>YlIaf&^#R;aDk2p1w|yj^k@fJ{rb-jX(zW>Blzm1h?&m?Y`fwty`#}hQs0d5ys(P1 z;U_Su4vx-G|7UdSWGfEC=*yEYudhM{9}Te5mr);Hv_Am~{=V#e*#Qjj#zimw;o$V^6Z;y-o

    5wvnX)Cx;gW-i7e(mL?%=xe+ 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"u0e=}cLfwH+ih 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

    *z#&UG`_U-u_BC^9dh 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

    C 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 literal 0 HcmV?d00001 diff --git a/Lib/ensurepip/_bundled/setuptools-39.0.1-py2.py3-none-any.whl b/Lib/ensurepip/_bundled/setuptools-40.6.2-py2.py3-none-any.whl similarity index 54% rename from Lib/ensurepip/_bundled/setuptools-39.0.1-py2.py3-none-any.whl rename to Lib/ensurepip/_bundled/setuptools-40.6.2-py2.py3-none-any.whl index edc3ca2d8ec3e0af7a305c5b9cf0fe574069ae90..4c8a619571d1e50ae8b6b961a4bebc32c90694e1 100644 GIT binary patch delta 250553 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

    JZp5qlXO|LR$d_n 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

    !Xb0*N&xCq(q-Qpn%qL=V# z42O+gPe`8rw5!I;N6N*heGnbtgR}8`%1<__e19~b<*FC-gcHfplY~yI*q8dZ_-gj+ z&Ofj5(1S03H@~GymEA;SgI(q2D!Y4dcD6YjZh}BqB>%i#Ypkzt!o<6&qZJyADn-O* zv|u=g{lTDbeo-nR0Qf6~j#XmoHZ}y8nAVL=u&$^XFF?iDb+pKkubm%FBWbN z&Q-Zu9p!9O&O&z-z+|?FskGT#k+M{tOvl6MB0r`~xcr&+u%TEa<{}mBuP~` z{P%zLPoho-E$2ENjIt7UI>W3#>U82wqae-)d3Qz_;!l|989pisGrPHj9zA4&rgX48 zmauL;98$}Cs@zgh#nbtVt=1h6=ED(%dgp2Zr_(fwn-mt2RwjGv`)o{3g1Qe{*?a1L zpj@&6Td3|#YkXS74kV1orjW#dVie&(wqW{1)7f5@E%Y;Mwc^KrFuD82wYeIrL;Q|MH9R!+9ZB4ge zAP39=1e#54O}8*22U-CHnoVs@w~iwR3<3n2O>IrLo+Ssk0R);&ZB4gYCkH+X1e#54 zO}Cse2fhXbnoVs@w_Z30(-;JrO>IrLHBkpp0R);&ZB4g{QU{_91e#54O}8S@<~ znoVs@w|ij+asv^XO>Ip&^*y(B6#xMDMgRaGm(iUE7MDPM2L_iKWd}4EX}p#HzTFLg z07y`F?d?3sGbFmvX!JK4mu6)LHGjZ)-?zPB)xK-{fj!sH-{1u2_-+bNR(*!wG)T|) z?FXI>J?9DA-*owKJps`p>vkvK49AX-PoK3Ve+v&*>bE!w{k0vx_2cV--wn5Y-s#`_ zycgGbt=47n1;+8d(X)u^P7Ud9c3ICwd*};8#EuWy2Dz4Xbv|s{exDF8G=J+7#v5_y zc?PTJ#nAT0dyt(sLw|hLR?Xlgsu6%tkNvUQ^tr}n1{&tj=B`$N@odH5^MJiN4%dL- ztMt#T?b&zhuhXySjYM%2McZtvoxL*LlSF#}`Y z9%>$KtC~0Yo+}j9mW64^s)p$o2DN^|)*yZhKJBsS275c4pvvfX_>q0A#7;y`DtwB#7507ogVgUL+C- zCsp%XbkT;vpcKiDVrSvAhsTP8d75EX3%~7w*%^q>CeoUfurN*fwYHtmGz#ebv17IiKJ8$DR0%%0k* zl8XXnMLP^@4+@Z2z>qiWT>yjM1&)&or1dxmU_whU0)Q?@dZLh~IR(L6hd}WrObn|6 zq_0JT%tk{`YCv;V&5jM%+?_5?EY!HRQ{*h6?%+?L{Rt!eA6mxu8(yLo?Rdj`SV=jm zzF>i~ZPQN>fqyjThk7_;Cn64jiF3ad#STSarRzh9lA-*DcYBG+)iHx4iH6@hnxAIkQ$YQz8&v((0An8;D3fkuqiH9aZ`1t#9j}}@FfT_ zy+%SgcrWlp_%%Y28Mwd&JSt(xZU^6Djr>ZAD5zP@^TsQsE?*rw{99@xMw17IeyH-g z`p7l@Nbq`V**^TKf<`p|(x|v^QKmBGx8`q=L{eyY``CSTFIHTQ6xul;$XC`L2HYke zs9JhvnSV{82aZdp{k>=5yvm9_&Mi?ozfhkve3_}xIzls(Rn4{y;yJna9Ka=>@yTi& z2rs~@Q>Uq`vxl>>_SzaVri2r0=;7h&(MIEkl z*nc$%#1IHAvicngcB(zZDFpMb{4A(~hK*BA3P5W08Fj#tMT{&*a?IKrkl6y(8tDh% zd}_*f+yo>x>fhF7;@K)()o7OPd!4Y$D?=Evsls3!gX_9<6%Itd612dk;1Lc>803i% z4wD>!kkiAMt=H_Uvza^rxL#Hz@{ORukbl6$^P%|BOSjlFazjIU0g;JvgM6ITIQ+0c zqYb{E>=bavyiS1;{UB4V#c0Wee~9!5-g$>F@PWv}Em@B&xkOewm}5Zw!@%iB1k4063;0qP@ATTMw$*L8pO5W>&FS}AyZhRMYJIS zPBYJ~GUdyO6|=$~hin{{Ffhx~ME~heH@6lt$Y(B^5A6*Hv?f|AnSy5T72tcB=iKn) zEu_d0e(r>wU!v*)3#Gqo*u~2?Zyw^c8O<*9s8 z*#q_qNA%2g2pbNY#F;I`;M;hSLz2iuyH~n#4T>TxOx*$86a)?sMbUe*iepY>PoRHG zup_Wn5o=lMgV81bq#`2RC*xA%0BygNp;iK*LXqOnDc)3#aYAezW6gq(B9pXNWAM=c z^hESL8gK7bC_}^oFoj;R^IIGop0L}zZ;(Ih$1@J;mFR^V^N8TekU)HPH(C{&r`F?W zBGp*0prp)L^`S)qJFr^rbF=|bCntX)=|@Yzo5P+2I>4YE4!GIB`_^D>*JXEwshz?KmJ#CZg2F_ICLmRLG|8XL1TNhur<;G{!1de6 z42BJ$|0UZT z?eo;f={H}zYv$$k;Ag>|c&_LFcK|^ZkHG5p5c{a#5*J245dYI)o|mbM&sVPU6f8Z4 z{A1o_(iMpXBd&I4e6@dv7a42^iQFU~N|?KkA9%k3xn0vR^<%+2DJfgqB9}0TAr$nE zH`z5uUmnGdMH%IEtO~o!w7LXlfr@WZhYL^35>0jZ-0_SEFN@z0#LMCmaw<4<7;OY& zA_r-k71u-5mk&c9%{-5;JnAEo%d1#N3C>DX*%HsGLf`3iq?LcgY)EX?&Frn7(%dKfc5p0W)4;(09|*3!A!B-@w-qgZB9X{<+3@iQq5$&xb7D1$j)@o926PLZX* zB7&TDSm&vN0&7(Y42M*tFN5s(4ub&pP+V@r9sqSvSxi4 zegEn&xX$m=hw*>A6o2jWT~&N{`M>EEK7koSFA`Z^O85CtTt^C{X67Pg4Zodk!eX!? zcZbIIq-^_i*SBEFLYyRwskDpa`R5x&a&ZEXRXkFLtsMza}s zGl(=zEz6>i%i-K(N)jtSjO|+9=q{#*a2<-i>6AkG6g=DK-JCC=yf7^5a2yqbLrYpY z9zOy$Oy_^2&}y}^kDGy=|M(-8Lx6a}i^Gs_ut&#cFrf0Dc&XKgw;?(sWM1Ad8x0uT zmQ~XI9K<27u@5J8q5*{BU5Xn|OMve(z?e)$wP8;eo+l8pDPY7RMl52{NguN!Z*b1* z95ywSQ-z-Pf&ggg`4)0>(AS*FY5{f@M3CURYGi*|*X{_;4imiY;a~bqcCq=x!_hYSNxHX8%*KYv`3S2rw=ig9l$c+EmRW zaXk$UL)fxQ_I{l0%g67r_2eYdPht_UE65gHC=dXUj5}U1855jD#Hm=Y(}D%=;K1%6 zYQ=xI#7vn;G=ld-^f(!pm~RB-(BYSlAyoc$vX227U6|`;7muBTlGIq?g?N03P9kJ| z3?XJbS#7|AFaIl;EeFplW)DH-it83QqHPgMebM$9kI49ex*x9LEjFN1-n4||Rn2j$ zrBOu<+TfufX5|*6so;pxo$vCh@!~>`Z*zYiwcE;m6oX*bEhO|#nElB#OI0xRZm5F& zOx~6vSsT?>XSK7K9ebzTp(-hr!aIF8O+~el%0ufkWLiv+Cn5vnFnk&T2G3xysl8(< zfl=K7w*$A>KpEkAV9w=arw_)5k&ec5lmzfU<*BH1aZN>0T}r}q%|b%~5ZF#xFw}qN zdyvc3t>w&dvdmMB!soO@PKs&ZIz*g9Fyh+UlvrHc8TPA;)<$g>Oa%^U9B&thq!8*hxN)OyPqsH~D8&tK4!D-3KevhONR&Ky=icY1w zlaqvDLr1*sjAW=dKKCAwOl+kzb?@&fZF)>5mf5H`SZvaeNj0aP`jis~wGN}=rSxL` zJ-9M~(|Yb&_SvGz)o`?O=q4}>@u#j!p$c~}YLBffU!Rr8nS1*pHoa2A>TSVwwRS;RcqahN%NTQB7r#^pL9 zZRulK*E{)?hb=2;D)CBAt;yxsIsUhult@ba??xtZAcGruT3K>^NcJ zPU1;bDq5%cC58GoSYf=4dY^fJM0~PyBO%_gv2)g~5uRE!)ZmvIg;g`&!j45iY`CTz zVBWpUr<9OJU3rE|voj3p1De;E&y|-GXyY-+%*{mYPpLwW_vrJkje?w!ma5!UC`HpHVfxfl*0Y_qGbq6Euq#!6q-ZO8^ zNqVlRqO}2-((=mFL!Q|LV?yj_eSaz^90K)22o}a>9DmghJ=^x|QG9%!{<$N<=_eSR zfB3q*u^at?d>vY`d3GzsQZUBH4F`c$0FPJ1^l$IqJU^5NEa0s0Dt6OK`nJE~Q=vUg zD&Xhryf;{sh0qow?`p0T$vDQ!z_UZ~Aw_fQSfT?uCZV5!CQ$b@WfFLEhJxD+!oYQ04hN+Qe5VBt^1`(%nNK?V^Q(m0FCWu7rm|`@ zhBYL@N<#V?;Y#c1hu(-0o$BJo`EV#bpxk$DdnFfYPKXckIQziTjkMvbvSXH za=`z~W;ian01yHSnh`WKq-B4Irw3WLyqo|<2>Lec{n|2&evJ*j8w;bT$cG0rMM!bZ zkTjZY>TMM#9fidc*_#;fdyy5E%GU#NVMUchNZ}HPetWYNgMBZ^k)9z2zFC^qOkcN z7pES{m3uHG>1S7$7L6-9?E3X21D`whaADmzPlQmCkRj|0dVk{nasv9^O`)xbdkv9v*z*WVCq8YI%nhaV`%)x**EITbuUUvuNi9ms&Is0={lR!@gxutHXHT zkxW<9CZXNPDoL7dNY$Kxx2OyUEg~6fKe9?tL0Y|deMJ=b`2>C8LC+RYX}gGb0`EJ1 zZ9Ji{1_-Q$Ra}L(HVWD**eEY8xjiQuZG?JRZIYVn7Egi)=fZ!*$nTs(9DP$Kw;t+B zZ$FIPui9vRqW-78dp_rk!4CoibO8Pz+G_K-C#3xUS9S4yAeDgsTZpB^iNXc`84N-O z0wVe!AvUHM3cfkt7ZMiyzb8^Z?tEYofPf5H{`Yb}6A%DXcV`BBk4qfunDwFCcHcp9 z$UxP8V}h>**s9=t38S9IK&Ls*7Q8U@*7(!{$z&O=5{%F5tTdm5MCX)g^eKoRC~(@( zv253Bn^9#Rm6>!VMQ~xf8d3EpeGJ}aeYM=WsglaH`+Quw*rR^)u1zwfy^eImpjyEMlN3xwTN?XghmlvTZXC zfaM`Kw4ODGp?RN>pb}mFmBn_ipLV;<$?Nw^P^~_@OhNgfJ$WFdFJFv)yqI0_ddzgV zy`Rj$JkR8nDdTZ-*J^0Ttyk}%bES#z9JeVU0MN<%fGgN)#Z7)ur^hNIMN#>i`7132 zT|a;f8B|H7Ub#KhDc#9xUKUMk6%<%cEfkE1Yz69^1MeGkg2rMUtzEjtM@x+eRqtfA zBVKOIZXjIO`~I>SAZN)rj&?{FK{~l56Giz6$#`zTjEdOmm()$p8Q+Z(ZXBbFSZU+h zYu5Ck$JBZbcAp4W9?*@0(M!t|VuZ0K$P0Kr+mB(i)9X%WoJv>q!zg;Z>wo9?0~q;w z-8l@JTNQrpURlHL)RS1C8DT z`r(@DR~+2=>tcka{~59iDZ8RhnwfJ%#T*^mQJUoka7D=qRR;I~x18}S=lTns z%IT@P4h$dEx9`S3`(R?K_2p;eY0)G#(o)Q# za)MBaV~DL4bzH4l z-}CA9*r1aFDelT?LI8HCwdfX^_yc8?O$2+Puo*`zH+{WA9fzwK>z8wUeLuhU*AcHV zv*|SGq~pAUG#4&tH>$fAkPf{A&lX6~!ajv*RE#C5q}N4|kpuL{+bo{$z@k^_0M&vs z3^jucvKAOhRhw1OMWyNl%S1`nqe`tU;TN>WYJTIB@5O;kP$<>Zw!JQTdda`Aj2R+j zZ@N9HN$mc{q>O3p(b=W0Q)0;V%f*Q=lNiT>a6&Uv8Rhw!ji-6R`?qPib`aitD{uH_@CHlG7ODOY;R(c0BzS-r7<$K zMil#*zvwMZB=>;_wQKi*WC_x#FK`(UZojlp%}fpcp{4e!>`M2#GNnl|?Sgyx@!I)K z6=$LKe#(Voh`pXvorAfzYr4?4m$=3OX&8m2urp-X7P9pJVHRTP0=s`1P#AddmPbP!m~e%EA#yL-Tps zd|cpQFWzDnzD^bcwV<1%gQOpK+k|)F@JAZUM}c;-hCT0}cnW>s8-O(6Ce7#La5AGg zheGqlSqfBG09E^$@3?A<{9GLSFCP{u}54mY6;TpM`*0xIFT-klmPXn^Y3S>&e|8C>O^)x22#Q`qMU|!k21={>8$A-VR zP&L{xgRl+^Xw=WW!uR0O&Y3Xp=pTaB(w^_GkGbwx>U2gLD6lKv`offSVBVlT3E!a6 z&Os)X)iU@oSPVpi6GT!}I6jp?an4;ORr2urTO|>ZK=&Vix6KhZDSnHF!_FyMmfl+5 z{MZ;|uEm-AM*tH0zxN-Gy!?foe zYv_sM%GYQ`5r#)r@%j&eX#(T~#9EP(r4*|U2bf3}&;T+cnk6DCb1YoVdLw4?tsD<< zXnN3ps-Oaa@>ENstspG&%7*y3LAp^OKsgC+a(+e)5LS=)`XF4w14fqfL8ygt*NUhm z-@_)h+YfQ&wKoo&pIArzDi2o*eTR#!8JF_EFc(j$Jl_M6Wc%Wr+p7nId`y#r% zb1Vtsx~YnkZa^!03dZ!lvRBq{{vWtm1lCO@WcMJ*;WI^L6>nvOz~4YLC;Zlkh;8Sh zdG&jb+)ujeJ=1HfLZHmtRPM_Ds5_ZYhlUCp(13#%>73tN$Lj%nO^ru=kE;y8x%f{-Nen`M!RCWkmRD%Qgv-IEWW}sB7Xf@RWX6;n+{F zoB{HlxLubaQ+w*(Sh^RK>vAz*-1CF5M70F#GWL}AJ2^*QFuGpQfglj*p&3IT)59-6 z*RFX(q&jnmj2Tg^7T2lTaMdb0_y@vHWcsn@>UpgQCR${csqDcBN>?8*s|b^#=Br46 zAl4cL5BI35>wyU3%BDe$Fr67Xb=9RmR{(1!>d67exYs5@o?#7_g6(08M*e%KDi)da z5?MtF(0BULX9hE=zQ4=3T@g@EH^FUUl&hmLWE;^KwvAjc`k4#$+hGYT*M*{zpKH61 z1~fwB8#GdfBjVtd%H$hriH)or@FX92=n^er7P!O(6i@TeYFcksDATdVH*^1f9Rqa9 z%;HlKLVc%*ZApfUjv13w=Hc4y%C}CIRk=JPH70T5x7ARmks-N}X-;qC!3d@T{j%fM zy(o@HbBS_J_IT>_5W#Mg@7~fc zk9YlS6&XfUygq1+<9+?BFdMC~7YC_U{WqUb7eL43KcG7fQVv zPdscOB=$=mPr}S1FcpNi%%cuI@Rco^lk^<;D#sf;)IbWEkpx50&`hau!Nz=fni_xIZ!F@ti z!7-*Y3_cqP!HZqIHNyC0GXRTTBxIbbeBrk)XDdnFC|a;NDxWoaaww_{)9GQ({@mFf zT#US|G_V90j?Ia&fs>0y`8vt-#j_{aF97Ee{##~;Rbg03$7xS+u*TGfSKPSBA1@BW zi1}}nZS7;X6eiSzs&0MDo2uPFDg#q{TqdbPoG?fVa`T&<0Rox1RD6P3|-%T znDEYxC@4#Go#{iAKb^*5zgu}6IN*7)N|SKmkjln8&05Ai!P74!Fj1XWs5uiYeMaiU zWmk>$)BXM9%nsvi7|&Vik(B<*6>Tba)v&2PA)e9ZvaQ%><{Rige?FUC;vr>V;s49y zbJleG2K z9^Bw#c#nCf-glNI%L7;}!3jR87cpNW=s6ouC7enBg1qBCghAKSnFrfe9GxI3Jjz;g-^QNu6>l(xC4o0q`u z_ndHoWl)g+MzH(HHydDsExnX`^3o!lnCymVGQA$R_D{_amfxU(r$o#XF5INxC9Pn$ zuOLKJ3AClG_|8tyn7H-YvI2`ZMN|+)YKy6^DBNTI`Y&GF?^@UEj}XEx%9lbMY&nS+ zX7kXz#SV!0vA0VAp`(FQX`FD>+wq_il1dP`JzS9f&XogE@fi^(h$yIQVO`+8ULF2o z<*hncjgrrn!=&xm>-+#tZE7x!Cm%mJWX6CTBB@69K3W3H-&V;9y!j_d1sLAV9IJ#2 z+;}zYw&iRjUScA|gRXG})X;Vz_TTbW*B;N6bCIB?{kPG8(=`#}urx(hOQ7`2!8WM= zkXtL-LC|w600ECey~uU|Ez_)kuz`q)bVxMiA2Krp??2d_=%`_CZpKFjy>=$LqJZpz5^E4l0KWG+O+HgVY z8C2HBEw==pD8QC*<|}vdWWjb~Gkn7oj7amFn7xkLkSuubc&v9hUuLc;MOCphcpf?> z4w|KGbnqO~L4Hbz9s1WK=$QW$&IcU0cLLikZ+rzHO!nY}5^9>3Q0gsQp->jtJPmW# zXuq)AmtiRonKDPJwyW(9KMD_`sMbSCQd$!B>qI-9nr&s&dp%RdzZW*V65}q&vLnR4 zHb5-af0l7H<^h=NSFfsxIM}+R+=^Kj>TqoUmBFWdcKBmmrEx^)z4{f<6gbq8lG4CS zCt5dyUjPL*yO2?&pugk2uw8a)T#b*(qjMtTFr)ZyE&*;_d8Nw4GD!d!-J~1S!Dh-~ z9%KygLyAj2Bt5mB&}vc37IjbG>K5XRl4`Dg3Qe?1O!^peGGXdi=gp}$dKdwYI$}*< z%6L8`F7R5)asE&HgJ+6v0b~Wpd1*6DA*3(}uu+O!F{BVMN+2%=ke1=KBsA=C^C}oO?a5DC!;CzIb%R!dHnKHOeY_bFKEU&dy zL%6)I>GNh6RI9Bf;%dIGvnOdh&#vxyQNu1p)VYU+{agrpiQpAA+q}X(7kpUpojN?YSeZffV@h!<$@zPTNF@qC`hUOcVrao z0P5Ayn(h0{?f<-F97-UE|3|+9ZtH17)&&AORRsnjNnwV7!b~wJ`*{W~Dc)s}48YCJ z6=je%z`!{vSQU^l01q+?80+9I%*Uc3v9BOS>#-4ND0A+W2t&`z6@{+yCfmkb*f%}} z{xh~v5A}b1{#9R`Ge!vdlgpEGi_{mPTDFGD=(z_t>{b@y)mVHaBlzC#Ti$GwYn#Qn ze+oj@+mE}6>gLv)&b$7V=hHHlmo^#{=&CGotn*u`HAPgs0g7oJg12mA*U<0Oc;P96 z1&xyzCBC`4_p9~xIp!nT!D~LJ+uQ!dN`gqX@Nai=XiVuX?po&TlT(+=oIrm2Gc%@_ zj$f*&t&Rd>0QL!&kK~bCzuH}uz@3k)s&>NnY{7o70i9B5JSrr`GR>C&c|+Lv$8l^{ z{ex+FUd;cq2H>HP2n*nBZ{pu(ek{qT5CGX3&d6x9WpDYgeA>DUCbg{k=E3@MyQ!la z?+VIJNx6!-&UnH(0@37qioKCu|NWH6%dO5JH{-blgIb@Fh!x8L$pUR zkSi9wh45(FyP=X{Y_ptDj;_e*yQY}U=U%S5 z8naVc)~o31bOOw@g1CE&!ghpm#U`XgS3%+cusbDP-r9bq?&e61s6KMFQAI~uowcB32argS1BTlWT``&H8p zo4SH1O7EMtyGDRaKfwk*c1Z5l{ONWGk=wrfI5!0JHEGZ9Bj>bZ2kgI0fl0KjhruaN9QH zBSqlmoA==z2okf*uYoqK>opzL^=)kfb^(5qkZsgCW*!>EDIluXo15*+WT&-gCVnoc zgqf8F5DKrz0XoIW;P-E5k6zuRgsGRyKjG_ng-6g0-OJ=f*)@aan3tSt9I_E$ux{(t zHu~$f)%?{h!x)tBdzi10n&Dy)I6ZB&-dcF3RO1#4gJH9FS2309TLG$d64DR=O0_}8 zjU6`gAAX<%Ycu=2DxLs)p?NI^>wyf%VEdi1eY6+O6Fj;*&)5^~2|7}-ohgYb@JvZ< zmTHcc=I)8A3M&~z+zwYiWBwQBy-%Di%Yob5_1X~FhP+;$hQZ~trVtG!9Mq@o5wkxz zvmF4eT1R017hv-e!HF$?#0*6MuJ^{znLP-g`%o4gSDFvRJ|E8`1(c<&1{p8-MIiSW z_7Q|0t3TCND^hJFE4(_psPHA^C2;03{{kOj$1d3IsU2Xyma!Z*M1J|0$323_6+tq9 z57BxNVoAHYtKwfCK?krTFhOd99sxgZs;_#(@<_9i5DbQ@0+;VJA!PtU>?4Z{*3~24 z@|VKkWH=@r>X-Qo!WHb|bYO(;5^ET$I(iBPCfN>Wkczz0AK$=r`b|%Mu^LRJzW)+^BD(rOh zdFb%s-h%p2To~1tkICKnW8Yi*^X$a|%%=EQ!U&<^hxO5mRCLN_hJ1>Vh^^^saolkVY?+pQOm^Vxhsa4cMtnTO`L zosLqK2q2p@;Iy$3t(1doO&m0no!rAq`%Jg0Ww6^FpbCr2WK z>yh3g>kjlO#-YK<*c1&HQ{Mz|r3y~MkYtWt+0H){(>noTVUU;>N^K<{*Ez_Y!q#}A}#in^?pI|J``>j?pZHp;; zxVT#}Eiir1?koW~sXDtoQtk0o?Lhe;z#OcX?O%y03Ai!Uzp@p?+uqs?p)SPPRNy65 zbk74%EJy%!dw4i@bi+11wz(H3i7kXip2`8XC2!4u=7!vKW*eLDu55wMgFW)bom5i9 z1;-Wd9`fFB<`-Ie_|WqupsO8)CPd0nt3ZC>P7|fc;F3825b2=Fue)WefhCwG^my## z{LOg%IaQVh4iDv;4#-Wm3cGUn{84&dDEohHn_Pg=iN*NH-&AMR_T((AAxfxA@M?x1 zM)b#8PrKz;qK9kD#uU>~zZX3l=W5)oU>j0q8RGcicj#quQ!CT98z+9n!IWi0*2n1$ zND7@B#7M$hFU{|ZS{ z=X6J?zW=pRo+*?efKCbw*0k}^L|i$UlaS;cTWQ5S@^GWwzY4}JHE$XqVc1o{(=l|# z(+F~p3&Zx>wsGW0*FmtP58;$u>T(`ZXYm10qjz8YJr!p;Eun9ya!^WG@SrfsyC!|y za}qme#dW6Q2CnUu_*Qqd^K=XrUkFkt-MjaBy9Q&cF#=V42t{eoL*g^I)ei3p*A7MW z_98H&t;x8A4%I8uOi8bIy2OOrx&~M9+?Vsb5N=n_I;+JMN++OAI~d|h#4=+jVl)ll zg-+I3+;j=4=k&Q9O#5^leY>170%fVn3J|{W?G$TL@JagwZ^xbim>Tux5F4+}hqh8F ze}PPXabxS)lZ_riIZp}y{yKoJt=HvO5*E~1vInAc)7AeMBalztw~N~$<@M?uQ`E<2 z;*6j$u!}O|J?vkmo8h*Oj^Ok5AUg>lT;=XST+FZG)ia3uwI+t~WYb@ZlW`s+`5>TCuq0AQxELzAkxk{)J_u=Jzu9q_;j_ z;#b~}&pufP&68=GbKad3y16Sl3EaVSj0sostaDMVa2w43k$VZc4t(99wfPrtEdMn4 z@p^2*JT`X!W~8R~_TXc~5AIj|X7sZamKrYw@-DX%+t=v691A3oI<4>5%aZrsSL1+!WV8mXmV^@yP!hlA@ovJA~thdc=G(ZmnF|SCyx~W;ahOSf2)nb)GYt9(jfX zh*1rAvr@KOxQ+Y$6%%)AMus;^U&O2U1+08XJa#Iea)EuJ;iJ3R*Uwp`TlYrh=GpMz zKtyxikN169@47Z-adcKEnprE3H)p$w$u(nhfozT%MxDhEo?;4YB`}FFWtOjjBb*g_ zk-mzyMidh2McOU*z?BWCfru3?cUsuq@T*y^Peyu%3FB=Y>`AFOdRksR_nlB?x7ktd z6=F!DLwI5}?hkDwB_-s(Cvw_n?G>+9vv|cO^mun8a5|~7oxGPu0s_BUc!vOF_5>ti z&5~S49(o8HA?nSRW(fRnZT2kdTUl|P9{3`cjTn;h>o`lIdz4H?Uhk{t& z>49bmN(gu3v++kQUE>FEyUd^zYF5-iGS<#I=d6ueUYmi5ZHhOGG3RT>?o;m9Td4bU z91@u$pCMrjB&Jbz!STz>4st8#xT0O{CYE@Jem{D20-Xa^P>hT7HgNBuviLO?IJ8@) z6^axB7f{8;QXw~s5AX;1(+>z2$wxG7s-XFqQLeK=BMmc$j-%q`gWN!o}<+nQp!DA(t3%n0oU|A<~C|CXY1R>ESTAOmfT{+Y@7`v`V&)9*h5x< zwnz1;2IGL4*ZGU>n1HXF-h2O)=@nO#7Q6A{*`<6C^J?b&^tyTb||VP z);R(JLUOyXUz6CIKSkwOCvcy)a;jpoxZ>UY)HMe#koh=XtDMlZIavxbji9zWr5%}* z6E@*K%a@98%%KdrPh!4f9$ix8;Kq8>Oa26>G6fbODKV6r{gI&VM zK8@URwdbXWs)b~gD_J5^F;~Oj4@gnW;`HSzs2(9|g*p!rua?z=$_?Z`l#KS9*^jhI z_ciZ)kh?>#?d2E7@`Nta+R6_tw(~p!Qi0d=(7I~Fr#3~b0RGReKl76JAi#dE`WWGuP@|U zjaCEHet;kfRXYteyF0X0wm-UH0Nps6ape9XK_)Nve=&`w0Ev!gZUNbtYnxIWse zWwG;2Gd91?ImKY~?M4mz6Wu3c-bF%I$3TE17TYAr#;g%7H^s!`<9s+1*Zh1fL@7E7 z1liwuAWLtI>b+|%A#ulmY&~UrJjgmgX)tUiUP#y0eG(@loR94tpe^LO^2 zSbOu|OFLA%>^$uuptn^5*wUC|s$AE~gHXovFNS5mL{my{#=p&wdq*qpCx><8x4!{B zwet(cgEQ6?ZOaej=ORX>R~~cKYG-GxSUvrig$QE3V6mT5o^)jA>) zrH*`~4qcTxu&OJ9pszBo0=u223fJ-C9xNpm+rh#MzG1b*IcKwUmJ~l}%OZ{j*}#3@ zkpxg<_8VK!YVGT*-~x@M(}nhTRv{b9Xd44}1C1)zbOE*dHDosf|5 z2=>btL-aGB=$<9H5Gll+kOY9N0n|@UP1oq}T*bRY^yu?D<6|juA=&wybnUAA5*}>B zlRmi9i3u|0kjv(@0V7qboU|jI>!j~F=ej^o3?394ASpREY%$$vqofJvl zDT#=TArzXvouDCyx>$*-5KQSh{^94rWvpL3kYGI}C$g;u|A<}zH5ml$zhOk}_>_Up zpBU+HCLc6zAhYXbcR3nkl)wz3U0NcKpZ>vOsWY{6y+6W#nZmUK?@Fo?LtC1wruF!S zg~WlmPuzpMe!tSiF!#pGX%A4 zzaJHVn$%0;mIaxtTfjra_-5iT%&{L9&N6l#i8RSV6I>am{IXe;B`qS@4{v>x%3H9D zBtbA-`D53WL1A~&iNgoJ;&xxjc(I9@N z-jbV@AqeB-jgVLDHU78T38f;ngCYmxulVU+$wKpj8xLUp0j z`S%qw6iP7FpHw_pKSu)9t3_rDn&&TeI|{-%_MPMAuyh7ZVVu?bp!iEX7zYM$1T7G-_7bl9 z;1nt0i)_kopnpAhSY2gn!W!n4ztIzO6shd|`k?C1^=U}GRpl*j2t}53b=6oO{X=aQ z#j@t5lP(e$Z={&MEMq z!6{G(kWY?9M&joxf$abk8nBOS#UN#8s5seru1ryZuq_*JnuMLEY{fA)$(-)Ys;_}% zpvnL|{cGZ~z9alTDnDtR9(-Ao(!7r(u_Q(4H%mU6FeV?79i0;%?6^YK*2@8qFs$!j*swHhfl_f( zcoUs=_f`F|g|2Zh(EDm>c-DJh)$vuqwxI9hxkZCl?Byc?fhG!|9Fp4LI#q9qh(`X= zT1PE|Y0>kW%q0kcSWnR`P8p!)upCx>6yzXsv3w%ZFQ^-uShRd`4<+%Bke=|g@rX52 z#mUkak8+?NU69ws3zo=cP6{qIFrGJy)Kip z@-m}7fc99duP39KFunv`V9d9P^dl(n_4QT)KvKK*ml(rg{aC2W+#`^;gEpfJqIHn4 z_BLi74kMzn{S{^v`ER;DLMvO4(j(b<0b6r2nJYL?T6B~g^NJPAU~NGz^w)hmsZ%$i zpRC1pYA9gfuvG{`{@oAk&*&?wQL8jGVZ~dUcHVp>n70ozP$5;58!VD%dH&2MPfPOh z<5Gm~j6fQ$TP z&7FV{6PM%$LAfG)Z4y1Xu&`G`*Nhhw@meb&kx{evHYrYO!OC2-2?TZ<( zO8rP+OeQ#GnUYL9pB3{by%q~kCb%M%|6;Su*d|aInwp2{X-FwbATQ;g4GOl?;Mlv{ zpB27}#r4B#4!tV_1K2k){Gxi!@d=bUfM9I_xFnVDUL|9>ufyT+F(nyeCxdIzA(^Dg z_ue30jFY@;t6H&=q=+E@qkf+bLIy2hFy;wetZmo+1qwukF{V%t8@Xec-V`N}yokZ- zM_VKQ3*wY`Sf3_cAdY8N^4JyM8>HtmA;s}GXWx*##7^uvP*cKLP{?aIz?p=5(V2HS z&<3Gkib^|ao`KpcpNQ#j?a2;~#4a5^8H2wK%7Nl4#liOhzuZuQd2RetE8PY#VCPbH z&g8zn5yp-j1h}NA4I09Kv?dW{=%^_MM9-6x9S?Dz20S%{4Jy2E-%rBK&dW<4o zk+b%W9EacY^J?wzAJ{7A7aXPQ8B#dKrD2)$l)4^pdPlQw0RlBbxNr`gHscrnQ0A_M z1PY(u8}LX;RB>J&|Iyj8+7;hW zUwtfYHPr}Io>Q8lZshkCdyc*)Yi@(eb>KL+q(lJef|7|V5hdk7HsvE9Qgc*_Q}tk{ z>&_St!ZLbdmIInL6kbMb=|kqn>JC{G#fcCgy_UIDCf|!;E$FBp!fyhkVUaO$tGQgn zNsP`Y(GOzn&0>Sy7Ik(!2(1R^3_hP_*S61>m?Muy z*Z49C?g8@{5MIOg;)H!E#{`hC3zb66UJAOg;Y7(Z5sHlAW2hWtZ|BLox|nw$%HoEc z4g=$9YUIL21*yRTdaeM#ptZ@FUv7nzWZ(;2HwT<4)0ylcf_=o`gSPUgeOwOEu5c!j z8whF-L)+-i>zJ@1E-wh2@aRH7t$`NV-E_3Q26$7Lj-5#FUnCvCj04T z3O7?B9`Ua0pT}M zX*$GmD-=h{Os2c!1%Y<@bN&X{*wI3v2FSMucrX)rJUU0At>*1pqxRL3S^(8 zCM%#&F}VyHqM-2NPfycZpb)t`wk;I2OAP`~Dz@+qQILJq_#3?0UMO7T;Ak>XMcHe%)Z(h}4HqN=QC@VAo?`w14y(au+UgWO z;n>7*yMT#TN6UMl^XlDnguyG^k9-Mman}TS9c(}cy_9X|J9neSD0?9Xm*=4zAn&wk zm*7=2%0LZ%3yVsQd*uCheSmMKJv@4gMTTWd1ICDv(hQiE2K!L`q-JF(J1j+HZBjAn zv|Li!5H;*inV%@s@n z^(f4rcDBRd8znFw(wW(|;b8K+iH4aD+uwbBnAt{!d>Ev?Zs}lEY@A0!nkcmlz<|7? zM5H6j3O@kV6@C~O(rDSlpjW_5JGI4k6D=XXo696&!kfBcPrS`6?{hwooG!GbZvu2$ z=@=onwk(Ei@#wbnYiMPvCOukrgNgfwx*q*9BcM&nc{kj2X)ovTei}>xiw*bSCQ40; zx($9wJwl^_;r#x)t2Sr{gPO2&}){r-|!-?pH^8o>J$AI3?V@O?`q>-@kY*}#^k z>sLv=$$?>Bze`rY+6R1U=jn-C&H_+_gGOC*7-@AR{v4st-PcB7qedBr%#g0?s!Nbg zw3*)}5_-&9Os!iN_z=tSNnL)MTG}Q4B9*a)bKrp0q=pjqoS- z#Pz{pm1dybV0$02T;e}Vyq4EVG78Yw$v|e|4&baI+4J(rKS3-eV~w_yV+J^Q+DQpe zC5vbBp!Q3XIe02sJ-e(L^5Omsq;Y*|eo8|i6k|=tp?h%I!H5$G`l|&GBq_uO2Ppbe zyn5ma7W8vVZzPavx&3TgEzI}JJ(xF5DuoRFk3G!QNQ_kXY0Y823HOM$_u!vq2)82( z>DyzYYteob(t@>w7<_ED1Hc%u9BdH^PvmVtw2hQh-X5E3-{C3Od88jA&h36I7HZ^6 z?Hgp2yH}&ze zFX`4GA4X?HV8?D-eMwMt(7Sn(4-ca#pAn>ftZTI%P#>Ri9hdma%ph3B*ZRf_4j+NU zw>HHT1M)DV_LSdOa3&QrO&k62L-*Hl-gyqr#pntyGs>psxql4`0w}eqhBAeb+Ye(Z zzFBgVXfkjpP78F@6mZpBQsbfgW4e*8(=P&>R?r;0p1H+uRpk4;%HjM5GIz($iF( zR=*ne$7OixbI#}?uO=@4Bx&mn{I%wL!CM@~cwZoy)RZ_%VIxGna0_tLQa_=fvV;HH z8axBSC&sV{4>qVsb zIG|RS3#B1}2L$eGHD@wM+BT@-NV)l+-elvQ!b`i41jB4~7KFE1D$uZwx0O_Vv zNZp=|pSRo!_0c!Bw{R3Ti6z;PN@YNfFgKDa{g^;x1*k3eH#7et9?W$Va;LF^N98e7 z_cE{(v6jm=L7Ox8{p#k+Jbsry`hs<3wy&LYw#dCrA4A~15=Hix9@%Y~3{||#<6r7> zAe*zPzIoP%0NAcJ@(uT1z)k9f)Sm9fCv!lUV+j$pw;T zXP!742goR=5U|wW;!6i^)bZCtkEVL&87*pF5S zvw$97)ZH%zg%Ou0ErC(Ps2I@$adP{W7OK1eV6J&M#Z^quyOsNkh!8g$QA~&i33G$e zL0QU;DR`GcrTjWV3od$Q$lz;)FIn!7XuW^eMZED(<9~iP&|RfZGyE)+mh`!Fv^dTW zweI#cd(OZAU+@XM|B(DMx{!ZNW=Ph?>`41J6$WhXp=$k86Q)_UpS&R0q!Ok^l;R_fU2uL95GVm;-<5y`$huJymN1IA+|NcL5|^Qcnj15mn+|_upCpB zY5(KpDl(=-%Q>ArL)U9}DJkVzv2K<-xRka@dLsB^kK0;PX={M*liomJ;Qu(tvq66# z3Yknk0@&pAplnE5g=Q7H0%-R|;(zk${p)uhP7Vji{y%Kq?sAxEFGJ^M^P@a~^v6cU z1Sq8!gxRFyxjP^0?_a)u^ZLziUr3z3iA`ifbGUOdw4YG+z_8|M6e~>@w!7saqRs4A z`g-HeqJ3ocE45$?Xuk!^V!cdJJ(GX^E+icnl&h4U9yNZXUxOwo+acWoDn=kFI(Y;p zl<-{~wP`Li0^D<1+HimMS$~k^7>4@==0mUt8Pws2v<}Xek z&?z^&FwMelY#_LUhBArV&4-v&^MK%z-6=$)lowThS70q=pBuQBclYHV2e*IRl&ia+ zD*K#MKiYu_&5LuK8js!nF2k`OdFW^|vy3ghV6n?$=Qu)7Y zt=2JQWv5E!%((2p%!YQIS3vhGlYz?JM$W#-PkCobRAVH&)H}jzYa5EGtxeJegu&qs zoZ#958w)fqQ|g#=A#;60R5^~ti8-H)DegAw>UF&;Tf`=IjCDv32Y~7DO01?!X&OKr zKrIqxHlko*7BZ`@#uq&CHW{F=ZuIiDn!!hpbCL)Vec{dIESJ&M2OA}-4!}cxRbO6J zP79IDpI$E?h+JoD1SL9-+uM>MdrC2QG?u`eni_j?YfP7kgH}ql^#&6Kon?7hB#W2byh{KT59#1mDo;x*c-5P`bP`N32A^1kyt!={Gj+Yn5S9dfv<@)eE9 z4H@suWh2Elh!ps~jBw5Iv|fbuD{>AznRL$iP++@;Xk)YPi9BgPhfY6U6>MOpH9|RS zT}tM6T@tN-rR}3W6^!YE&tU1PfX#@zQ_Su-y-5x!R1l%W( z;UN^1ZVx01Q$3fT*asN_RhPNg2TD6>-ZOV(`cruqaDe?HtE5g%L%F9CFY+}YTlDx~ zBL54`Guu>^-cBJX-^$C_mjEcy~!ZGihU^1G6M5CRmPJ8S94Fwy`ip#0)Wf*&ZQ}( zG62XA7F2Q>l8m+{&MTmiI~PTL137Sueoo@OK2HW%aJ0Ni`xfU0pXYC+XsFE)uoqa+y^6nXHT1-{p@Fx?0-x!v&`d(drMq0!CA{4xfFx>*mYGmiNP+Xu!CKf%5CC;eU;RPY>-nBnpQ}Dgj&U z6gyf^7cpma8Hit1U-=2S_RFKJx$`;<9OyJNa>UWoDW2J)I(qhyU_itDneOrFdLt%@ zcybyZR5zu6G=s9&b=UmdW2*iX(Y~!O5kx54V_{ZXJN|xa1g1BR%5&q@b%r)~czCSv{}jQ(gX9&CowV z%pS_6^*U8sFEu>!%X=)$qW`$3uC%Hwm(JY>JVZk1A@;eJ9=MLW%NNGQr^zz~pUXvC zp94-~hO&QL3Po#p9yDa$NBpUV-MKw6zLLPA4ynLG0UW2vt^e~-UpBY zi90~y?#-j^=EGjPC z(Lg${H`j8R2I-6vRkL?60B z1@nZX>53#G5VT06g9f*JtZi4ePyA3a6CX;nC-}+=_pa7@Xp1qU)NCXGudhEr^;c*@ z3mTt}abLz~w)kEQ+7^$Y1_4Tc5d#89sFG^>XPAg>g}t?QF$SJCi^+b)Wn`wDmTtI^ z3{5-H4F;V&NC(mF&bvN1Ix~0j3qbq`+}66V-b*IZRa+i^TzEuQ;Y!^~ z0%?ZCduOe*W>E8byyxB}IdY*KLIz#3$al6O{equU!ceC?J;;cj^V_SG3A#CKSdUsr zZ{dPdDz^8O982kM*4K)j3_b58;Fov~+sd7lfnt41{BFEUh>HRy8HtMzRD#0DEKI5i z?3<69?s>KTh=EW;WoH5b`cTV2D(-&Wy?djuhK)T^QK_&jiuJp$8gcAKj7pSCd z@nL(rZ`U3$MSJ%5PBO$uM2ThD-qxvv5eKXmZ-LCAi$444b=ebtG|4={{4YjPgT;>l z$})So-LB${RR@_>5zMn!R;xvpoo&_5kQ`0{dY>VC(U$B>oB(t9rs{Dfw%LMAf#;QV z?r)-Au;MZ6Z{~I-V|Ra#zS<5+fL zd`~mpfqPm#_{I@`$bDR>{uz#>52>7N5qAItC*i`RZXnV>-hwy>-(WT$^&wz0eQ0Sl zJy`G&p0fqyTTx64V{MnY1df`)3{5Y2fdtO{_|41Te0yAccXIr`IC=fySUFxN0L*PW z0prxqF*|UdNMN+?d+RCnrUSD#5xlYDrNE`FKnn*SISl9t( zV0c6Gdb8d2o#P4q$d%zue2tbnNjuC=e4@?HM$KwD>-xJ@HOedrv;0C;ZB#xDb`ot( za54{^a?cOTze;$7K6(WQNAXYG`g$p8yxN>fA3r%l5RhyVQMUObZ9u_flVGLG~MV*u>N^PE{ZFN&3a%ureujFVrqH zABTRy1bYtcK?jhPtwVEwQ^Vm!BnlCfN~-jk{J%I+z}r&Mr)Xgfhk>B|~*oLI(S8LE^01`TO$r75)8= z{+?QYX9*dQ$)Z8uAPLF1HLs!fwg4Gusc?|wpqdxQo8|jz@fGG zp&BfHhlSvC_$r$0NJxIcb=rpIz!|2=#5oP0SqO=fnA_7F`agL5#SU4WER zUFQzm48W=D*O!-5^o5080(Nt~q8A1bdbj9*#i1o1{d-;4z*t|ff*!hiy8;jla_3J! zK70Pfmp}XYFJ4YF`}=RwwH&A_CoRh*YV5tt8}Za(aFBv{x_TCy8jT2lv55^|fOJ2N z)4#!|&OMq_Q|`mB9O3Q>S;0Ik07CXfW|g9~XxU@~?FDcR@c!&pEAp=Ji2c(73je(6~XTbm%3Jg;7s>#^OgjS67 z{P-7Rj6&W9wwc}}vRWGRKu8iXdmnDq#WqJ(_X%0TUcb#5TwJ=-JDY%y3lJ&fKX524 z$=FroN3PQaBGE`Tp&+e+!Xw@o@)-bs5JoI?N>R_8)fahb*6@#*UjDYi;IL};D~tmn zZc*oNW96TOVo>r;^1U_8q1OD^iR9yV-@QNn_VsTLS>ZL+-+cS>1Aeo;1FG`H^McRr zi|4~F<8N$=EtRy!Xo?U0reD4M@RBt6fsEupGJgN0Nb&!ww_j7rb-i6N2{$EwyAc0> zB4ZgbBEd-tGfdI2$&9Zi5fpKU1DT+tI0a{5LQTOJT#<~DIz2xl-GNOEn&dsW>9ez- zsLzbzLI>V&tB-TRlQ=a|e-OYI&(9|M5W=z`=I0zP;Psv*eRh;RH#g*gZ1O&qS9PCl zy6yGlrvfo)*ycMd|CdjghZd}VM(h#f9D*q|FMnbhopv)Ok@e&J-5~DW(3kdK>LDx_AMI1iS5 zdd4O&F@$-<*ci0+1z^*E9`11HePWhsas^E(CeX_QWDLt_?Vo7hBA#$y<#$8*&gxxx zTZk+fR)i4M3YvPU-pX}#CsVc?u33zr0+_$2ffuzAN4!QTj)Z{>T6Voiz8#^=de1fY z);m}?VNfWPDjkW-1XC=@(E_2kf_$7O>^5K*&u^knOs_; zWH;aH>44|OL-PSr?@V3HVJ(C@&uxQ;WcD>sw0P|ekwhG$l!_Hs;jB>fA&KI)8n=}Y z(+$WiFVe5s;Ng;gVg#oZD@GDJCF|k9M`hwl>~%j|xUU$n00zAcPs$tT&*st4qa6$-UMTb;MvgvqsE#qB$rx#5-j>VkNBsClmo8m#Z-AZ} z+p)BZ5M!Tz+71Vnx;q=w=RM)5hHGousMkSOE*8yh!^)WPd@Om_>P_g}F+A20*+VX? zesQ}D9^h1B6>^SFMaRZ3br265HP$pS$r1*qrL#$KCC-79e9vC8a+s1uasP2LX&s2S zj){y~tcmpgdlwt8$*tFqH036N$K{4OSP)ip;$K#OGX%^5^>kB2CV=&_tIFpKRBkQN zU7R9(#qm~RTrXF>^L8N=$A2-KKDogJ+l=FEm}&Uckr_X>r1AAS@&u5Ws?pSx)6Qbo zMsDM-oiFX_ADbm~tMndzv%Py9vryj5u#?V%HBbi=p;)2weMJO2l0Cx@1P%U!dhMZ+ zixn_`t0AFeo6KTGZd$9|Qt9^h8@rq_Ck3nNdIDyIZTtf^tpH(;X485BZ^kF_&M`Zv z_AQF7!c3FMP+xTs=4G@`8UWJ+99hfxsT)sKW&lS1o)%l}5qSsuJ1#KK4r|iTyV+0V zMu4_2wr5-uB3P~Mh{_t^C+MP7w_%>lNBm%adwwz}#~;3X_u=i^Z%>MoKb{mw_=^w6 zufBQn`oF$ACeOF>c1$Wo;FJliM1L3}6AV3ocg7)-j108L1?G(%a8GQj%N^#Ctv+rs zTp0-}-C+y?^C0*cSk@)y3nE|~%+k%h5wIp$M+WZAqRKr`xV?SVVj8NxjhO+jt#OEd z^yh*vCr6(B>gbF4v-y`q%<%W;^JkPdgH0frj5OC;Bba~*F-T6!YW0lbzTBDE=lo)~ zSx{22DVisYqv=J4pX01fT{>$#dwwm>xFCgci{11}EzFP!CPz&dufKm!J}}|Nz#!O8 zTwHpX!_71+Y%awG|j9Ll*Mu2|I=)Hu`s9+rR(%(u-3-n`Sv9*EYz$>}B zQ+bEcQsS`xw%dR>Y`cEuC&=rz2HPN=}iG}QrAY%e0 zrZkyVb%93-RCS5j-l{taiM=T66>b#*_4bGNaL*pivtvAZAWi@VPbR&8ABIHpPIef+ zyR-vpFAaQ%6&A_D$(D?VY*MVtI=7WLdZ=S2sH8pPdH;D=b>`}u2+v!1Dle^9Y&K(P z#N8}O^R~o9yMwoD-04$s&O(AG=-FHH=A7US#GSD-wWvya-s}J<+>I&UAkK`7M8Kc~ zMc0?v7_$ISLR!|lTvd2~`eX7+snAG!+q9kACW76eNR5uZ|3kk^^+xJc!gfR`jKtPO z>xJ}6F582a&KBg=%K2ICM+}yQDd#+FnLsmN!3;JPC1f_a_wb1`bLg&0NhL@h%PfZv zMPkJOW4r5WIWHA^ZCI*9;+cg9<>Tjvs~Xr;n8~8q z5dwkGuv;5{KXcCp38bq=K)Dz71K_rqoNjQdah({#@z9;3ZHAVZ_<|kFF zIw4u~6jNVI3MdB?-qbm#_h%PN^W57SS%eDI-K~?K0Gx$IMRGGiei`Wjx#q(b);Bim z^^UXMk6j3!u0)u zwC;ZBca$Grd}}<*pDL6f=xcb)1I%V(GJN1%fe<&CK!CPsBhl0yPMXgqiHQQrkpi>V z%ZAU7&VrAB2feBoH_;mqcZa=kP?#z^dh!GubncoL^2d|xx5NhPOmBWI3k<-3UBT?K zSzgYs=fGW!*JX!@FW(6)XaQ0pJ-gyE?(Y`ogTe3dStU0mX-7LQP=;6}VPNKV;wQ4N zdz-`Vtmtv($I#>$0d8g2_E(h~R5E;^%t7~&>zVX_Xs@7KEt&GejQ2XThMU?;$=^Ve za2ygYovsFBSW)mKi-IBtDI|chjqs~wr^Z!BxUEG7MQ|Lak4Qf^uhADEfMSjilHVLO zq11GD-1AF+_Uy~JMvcgwxGwc=gBf=$jp`bcGzNiDR_2de``Gd|hudUsI`4^9A})>I zJM#N~7vYM)qv*x|Js7jQ4c0we6N~y8@(9mf0tDD(XQqKwT1t?7ciws%+1Joc$2P=^Z%@H+3|< zDly0Lg#tzeD2O~sidMR~w@tRaDm%Tahziet=GiNPgExdyXCkink72o>Dv)|^YDOM7 z_`&o}_+GnwAH$?l5lMU^ySWGKIqsHWjAU~5Ip%H0xx!d1!~KNw{b9J~Q`567i?An%25->OpYIU@wp@4ni)BwJkt{2$WZ1>R&}hB4h+dpA{o z;PAmfgE1)&=rKkYT`5Xc_f&;yNh~DSn<7*!Tf{i~R4Q<|lMlo>j@+RgUV zP3wi4;pf@2Gx9rSV;MU`hSnimpLK!qd=>dSgTta+jZk<1b*I9Zw@2h==OglW^i=|p zSr$_M;sdxlgc?$(H;o%fywHMw?E`V+w=^?Z9;@z=A><+gCCOQ3crmSF!0Lcp0_nWG zKtLw1S8KA74?RZ{mbWx(#gnlLHtt0Z-b_O8%$c%Mj8gnj+B~)j@q+P1C;n%ys0~i! zjn-y4ao#-SEIi@Ma$bcxSu4*1h&c=Jdgthnr|PBEhuNXZMD{}fn&Jt6_!_HP5OVA= z*QrwJkR(aU7#Yw4#DxJwTvu@4?alprX*NGCZ|1+5XWKih9Gr2wz55hoftm;(Z3T~> zZ^gB{b6D^#JK`NZ-TF4< z=tK0OF+B|4m&9+W2z7HH&r!yN|`?3lsW#LTVj^Drco=}YmckBDWU{&p6O2c{fr z)Db}lG*;meD53BQBmv{8xczz&AIzM<+R}i73v>q*u5>>^a9p{0Pd|MfxQ!_Ny}KJw zMqANw(H)@Eo-Z%}IICTxrK0^~yIV;m#IiGtJq?74P_l^C@}BWiAz}qQFOLo$ zC{eCT((;!rYBZ<8QiW!%0UDLkC0ojJN3SpLx9IF~AMTfbk8CxCM+aK(FBMUD@VMZv zu+^HkSeOGzZ;LO#F*~Z!0NQ|fiRo5~0-vvEi3Ddg~$Fcd>gHr)!s}Wj2WEu$Wr

    P1b9FhxRwzCyihq*4WKTHL%4wRM2@G1vC2(G6LY`9x(RFYaby|9Wu|w{S$3RvS6OcD;$?R58Tmd= zj7Z|G*UN3|AnDY$Xm8leo{6{q)~8wP^0LOH5f@tyEPd{8(c2T*p4V>&HYccmYsw@u z*rRNG@Yz^4XVVvd-Zg-mWqV0JV0Lr7hRA6ES$@-Q?bMO9=lJ6rO*+i`pfHrfaCN|6g>SKgsF0mzwu z%3-P2cW~c=6QBuJhgW7{xC(tI4SWUFkAwSc>`B6}Q9FQ6s75h>EhJ+Lu#8;%2^kKa z?O5!$HJj6Ky__MY;IeJH@uz`))9jdx*(Xdaua^mn?l>o-=t-L(XZo60PatLuyc9p- zJ-647IN8PqQE~YoIC}Q8d?Z)sHGQjpl0F<{|C2!@se-F{Uazov2Y$u6Ve+MX5)^sn zbYFzI+eDq4n~Kk-H*Tep;CYDVnMZz|M8)TD@DYifX=z_<=vq#}dfz_@g7*vtGCU+)v3eEG`7Qkcu|(%yfhjiU7f;>YetQ$;c9_L;1thEBkLXVfY^mHGnmHLY7Z1hHoQLE2* zKdhIsDsfS+kO5;wR+la{YO;2$x;>M_EEt8O&A~iPxdatlfE)qopZ%idkq2++4qg=R z{`mXjH@`2wefiy+SKl1JFR(&?rWs)0{^9*8&=Robcmeu#XfutC4Gvy!q&W6bSA1bf z8Aa8mC3(lxITBc4=ap#sQX~0J-voG?`MalfgTCM2S7Ca5g51c{yU-_lb2DMs18ttd z8^wzru%`O9b}m;;yi4Jx<_T0{fKt;zCUwuz>CycSQtLZK*da1b&h7<&E;Av-;NKsB z89x1B)F2&iW%x*7S=*|sHoYk2xq~BR$aqkm9%9GNQJKA}KJp7PfG?7wSvAaguxa+> z39jBzmFP0z4w;0^X89&pxnGo7y=P&907u5WIZ%wLNpfa^DKM(&1~W*UC_BkIQP8fZ z9mK%FuIv_dolB!s7_cdSq5I3K>~Iqd`oUmmeM}~QA;rMi(4fr2GurAG z<-fjr`+=$=j7LAHdE+boXR@DggDCh8;b=zj&s_L{KDKP{pHoFq#N`+oo<4gqQ+1ft zH+$D3yTKRm#V6bbZ!YRNn#WsYPKs3yWN4{3CJB2mVd8*4x8s{A??(q@yV#z$!ZQAn zb%$hJV^bJr(a$b_cBDg*BysacKGB8c_%jVivgOi5!qUu|`d#)Z=9IYn1+mc%7MF;i z`2N;s_Kr7;a@&zM7QISP?}_{#DNU`KnavN|rUog{mTjPFXPXW^TMX&G+|^iwstfo# zRVXT~f!F%A+mBzK{Bb7L7-q+BKD__qj5C4(6Px2}GHIuOk8`@K^czV^E=szv_38@@ zWinkHy<`bNNi2ydL84inH>GKX%0t%k6tov!eu#oJt~l-yDreEF6*#bf6az~KXNA#I zRKaNuh@H3Ne8!vl0}7SD{@*_!+c)|3zfdZ(sqQq1pj991K8`I9Cz{*M%iQi|X8R_| zAn-(KFnOha3xriLVtL5ChnJuN2mIzCvNAtG#iW(u;)v7#NKQ(@VJ)j7&S5f&TTFu< zi*5J=Uu`IY5P!)>-vRZ;v2jokf{x4X?lr&bUm*v=p&{RMAGZq>42h|aa=C>1{@`Jo zw3+le=r1R8l13aTehkn`xT2VQvkUS_j7E9`?AjxLlEgEbo2BHubqr)54;PQfoSarU z{69GW9{s)}n6mTks=BFGN6$S*M<(T8D37d4Sp&R1DIsm{rjZY<|Gu3JQJ0}!~OX3b|TObRm*hRPnP zFy<|P<+Fw9anb|eafHsY#N+4c>hHEyfiK}$rjB$BW*pE$B18BhP;+==&5FieGgs8A zBKHrP0Hwbq@`fp7n4k@p+abwEij;Nb1)IhOGWRLOkR4G~3(26R_~ULq&Z1V{H> zWhSV6nW>;KCXGf?{|}&d_yj!su@MTDcxmJuDB0oEbZSvUs&APFZ3SFt3Zp?ds z=jbw{s$D4<1}RKb@Pu-}Qbv$mhpYdoyeY>fh`rEJ>}lQ1@V402gQ+#{(aa@zl6$YK zMvoKrTO(YO8ZEnXv354j2H-Z0Z*8ujV-X%r4fdn$z$1R-^AU*`NvafDD;AaZAm-jk z!a0TaVp>gPfE93k(jXHFp^KS8IhVPA(kG_$mjGfO=~hzo(3~Q)cT#mEA8E|UJyz_+ zFw+{#Ru3i@|6TOqpMKrFq#UwANhrJ*#j0tp=>?BVEha-ca=47KZ&UEIuKXxQG%u^cNs}+D9B_o;J zq|-5`m^uE#hq1NXnWWag42d@vypILb(O&@cU!`0|C+^Jx_Lo+*Kw1@XTaN4Ej;s-o z3{dWPy1CyNC=ogJ)A#(5F>$5X)1e1c47EOq;~lW{#nSs zjr@B{|H1^vXBw7C{N)ilj|(r#C3+zlnkU#{q&?H+99DH*akW2sNI%a$a!zDAxYg2) z%I}UeBB3Ys_+Wtpn6iPp4~zW?Y8)n&txPpdgfdH>CO05A&ksP5s>lt*Pq*)j7Pey&IOok3jUG(kBed&LP9wa2aAO{mm zI5strz`%c|=F@NjMRU$9vvHh(U#o6WZqa^4EhY$P{`$9X-o8J6_3}jJ^g*9ri$4w? zX_wdpa->d$=R;0I5j|6Xkg$+6q9W|NIcE3mgjrApb*~tbhB5F)anyp3VV26iZc0-wZ4U5dh2arOpZqWk+0L-C{ZT@}Oj$GykhGG3Um0VxlD8GM<<y%5^-79~+Ow{>)>sDZjO6Wp;x^9MjN$TbxpM?M*cIcRyun zTkd<+gd%XA3iHqo2_yS%rRiH>qfD9v+zURNioDc`~R#Em?42gzXtnM3XaHQyo zaRXm1|H)u&rd-e@ZDH7Jy}|O7 z=pK_`7Oicx`1zNA=XF%Pow)e0wNW5$8ak$qI=75KzVk| zEZJ#w^AOBQRk`8?Rd(>~%P+VfAVui}?bn5=1gOq)ZYJP=Be9?XcbT$n!XC5f!ip(E zB@T+vlGV(YtOBwFv+%S7!Pk!>75JVG<}I^Dc0A-Hob=6S-x_~%^PX7L(Xy{ETX7RU zGh+oOU_asjI#FF!Q>Y`+4Khpvgt18b_`Sdcql#|9f@W$5oCmuylNZWxJwD=Z5?9|mMWm@yYzPq^5v%kJ7B zM!%L^!2Idc=IL`W+1SsZiFcUrw?I5^njUt!v{~yVRf0|BLNN-Il9AG-xKn?E)r}}E zz|JJ^JA|j;u#<#hV$rqj`M#h9^{H~RbJa_1q0E96(Sr{g|+C5AwougGOv&7%&&%fuO+;6JYR|kxQ(%8uLS%Pu#`D6@yEeWArTMdx6{fzqp67 z@rph@a;Nm{g(zP3PJ{N;XG+v-adbMK{h73XKI#=FVgF`~sZMdAX{s}YPiTZea_s~0 zy5V`!sU6*OYJNA|7sc#6dh{O@W%m(FGtcE$=mu+UIY2Y93%2@c*CQQ3RjznMe0TEl zx5o)D4b5H?D00VOXRt0i6)o;rrmTWR(-ymSmCffK=g_oX*Vzn@UbFF`&jCNgf}Od4 z+U(f1if8{gp^xNlN9OLMzb{{Y1x_m*`IeVARA`@6aWAb00;n@O>IpK#*Jye8vp>sW0!xD2N{=Ms0a&x z%{={=+ct8)?_Yt)-A8JpW$f#_HgB)nYtD9Z+e>V}*h!kMeOiiyBz7s1M^L-gCHdbw z9{>n|lvcjPecgBGNCGgJFAQb|1573pCA)3Y)pev3WLGzK zh|G&_4su!+t9>I(*9A^B2i@b2&Fu>2QuVgYdaC0S0e?-}DhZ8$+k$>>P$g$VrAs-l z(v6(yX3z`;OrOyRYBj%zT_MYVd|nongn`eiuHC(=i>jN60(d=__`|%xU!b|G=cpD4 zd1`f_r(s(aS)I!{D;+4i_rrkXRaq|#E%^B%jcC&BHeG>g?GyED`^z)gz+z2N(SBfc zJUPkbQgm%vsS*}CE)#?uhN3KPrHIadlJ0#MiJ}6A zK%Z8wwq@E1`5q=!$kl}5tP2GTYPkef3qpBWZPG4VCl(EHzb>-1NXxRmSK_`X^DJ$1 zg>b1S!RZZ;k|53$KB`1qfjKEvEp96unl9>X2bi6G7HOC?9+V}mcB0yD7P1xf(t}q> zm3V{$o#IkN(FuKf!~_6;Ql(H$S%3+sM1=5*ZVj|wXKO$v11^fJOqG)AUBW|hSE7?vV+ycC(ZycD2+)~1^{7f()X*GJ+h zBj2roKWU3GR^kMIf*to(tR*s(DY#$PX0=&5#2OkGQdaPx%1fEMg88xl zi-`)Z8krR!537=jRwuv&o0vi`+4e#Ji9fdAh}m-xzHn5aM;g`=pj3!|>pS|)(h5nf z*TuU~pxlhojt)w+U!npT?hvw%@6LMo6u}2Vb?5%$p}B*9`5vC`z(m)h6Fv3q#Gpq} zRj|{bSPCHJ$q0nkw?zZpiVkJ`$!G6q#t}eE3(JugyK5{TZhc3{elmh=fR6q&hSZ16 z_3ne_8sWg#b=`m`1*RC4IxB017T_JO{bjuc_a+>o756w4Kl$}2I{f(e%YBQbr{}A> z!%Yr}k$_Ksy`+!mc>`Iv!QghbgoTUW)1Kfx;GWf@LWtI);K z(E*6roR*cda}UvZN`gkQh;?&~*KUthg= z{xf`kdG_+n7hiu3JUn5ETtV=QK~$|5bC<5>i!HdSz@`_lN82BBbZGT&^y7atZQVdj zx?{If^4Te);xF^!y!S*Sg6!|-G!J8qh4(ULEpu2wQPflLTh|16L#W8loNsUsDW z4FJ2b1D``=;Frr>Y-(^(!1=4d0nQ|OnSPpoVCKL8xw8MArAm@W4JO*Sr6m}td`GSj zcqR&+f22iuZXzLlhd-0O)-V!KT7|k2_w7?(7hG-{8ufptqbv_Pfyr@Td)!w0c^pLp zc$HYPcTwUUacyfOF$=f@ zfVfxsnaLn%!oiqlZP9d0_#`_%Z!}?UZWUOTngAds{T38QIA#HQa~aJ&Ww@o>nOlJ-zz?O4lJ|dDMB46aWpal+b z&ZZHuOje2b-Q&lY$oB9A%`0bHh65<6%%tN*x3tehC$C(h7gbDk%g|(J8NgzyfAp1 zOY3JasTll&08O^6M7)t8Hn?D|=@2&!EaU7Lc*X(e?*8R7o5T`2jtEym;o*V(XKtR1Ctvc1Vmge3E4 zMb>$H?y|NzM3dnsSPz8reZ2+r*T6l_0Dx(bxij{D4L`p6@y(xKzWDQh7q9>P`uX!` zmyZXC(9-5TCVD6OZAUqH_Ik`QSP!5W*a^0*_#I!WJj) zC0HCumJggr*tS^Y*|u$w;VgRI&pZ|^cH+hmI489q< zMjP3s&?`+epc@m6Im23i3F|Q1Ql`^Ug3xBscl>1myB7e82b=EXR9#-4stLtY{hSy(a2qyy zqkO=4Us@FUZILdn4~QDV=fUXni3 zz!4@~Rg^FCoFYy%f%9w~;vIN2?=QruI!A_`4!}G}TR_^tg|ypip=cNMNd)Ifjm8J8 z19A=>e4z(hc1#d}qMv@5Vo(uB;EmKOfmI7F4n91vQn0KMD1|bS0TfM#3q%`G=e)(| z#T0XX)(spw-xkS#PcD0eF2;$`bD3=X|3GLOdq8G>->ExWbWZ0W9&#h|WNVq-&I7k2 zp1L71?Du-{^&u06T4)9rvXVsHB^cGxN-W2c*!pV43JOjEn*c^45!;nFz+(QO5`REG3 z<1v^%pVN7$BX8&rYYCGPxSl9BZSn+mYs?vWT9ClDF55T=PoZ;Y{awz6T|amO7--&p zvba(qo9n)j74#IH3tz1>UkWr#%XdDd^J84WmuSPH%3KacBgI z@}DTXn;WG3=4R#{AQ_OD_P`TU1L)?)Wr%fJZ<1ht4i~DdEa()bJg*xIZd;WSLT!g9 z@;wFsvmkepno0seaMTvp79DfC%cgFdbqYQapVY>{)Eg2DVYDRC%zCEhVUMl_2Y=j= zEy&SMN35B{@iE14_Ee z))_*7sd&oyZ)jpnCZSpnKn*jm?13JU73H-zrZ(Yvdtj9vy|7}PB!wskLzite73mV) z-n6Q~AZMgVUBB3Fa5mC`EtnX#yTDbk0p-L!2%r}^cv_gFz^>SHA?bJmkmzL31#M{& zm2pi%VbO*+!J!D^l#cjMhcfUsSFCe+_2WN(2VM(m$tC>2zecQ7yq?S#!*P zN<~1H@nFd$9)%98bJ(H8saR~SiUJcOn?y$tv7Pmse#PXhG62MPsx{S|n(SfwIfzx?jor_Wy# z@!;JSOQ||iYFGJ9gN+OxqS}G#P`uf|I139M%yxM2;&x9gMwdez+4bAZ zKZ2&%%+FZ;>6*^4b?8-eiX!Vj3=aTclFpWJp&h)h+gk{oS_D+?_|%chVv}YElDLy) z-At0V)fjfst5PB}Th=fwah;wDtbs zVR(yz26ID^RG~S6*0iec?dgwyDb0;-k**dk#Ce;hq{K_gCkFZe_2&{ZH@4ySE;zO*q)Rq%JdilUt7~ydA2u&Bd^bY=q1q^N=2$G;U zvacKhqP&Qh{rVP^7`;h-8pcIYrMye4jz@qWAElJ0jmTdw@6(+N21o#ZO!5mrB2wDb zX%!DPj6hrg&JX0i>)&de+>J=rt&~(Rry;_B8$8j(>@p5uB>sT&VDefDSp*<-)h5IW zn0w*yQ~$(nKK^WKI~~71X3#SS0Cc2(Y;U7Z9CQZ4A~Cu9*2}-lPfU9HA3svHf^|RD6bi7dWBLe_+JVK+n%Psp};TD%LMxC#`2p?{CslP{QtqN(f7XX2_NL>fjm;6MhDw>S1=K)$X2rRY2Hv zrap+L$10`Y{iE~rBdMt6@Po`H5wKVe@cA&5hlK#n%(hh!D;%xcgAwQ%jh||Ge=%)C zBO?0^WM*-)OMxbT`@dcfTdclzyjN{sj*=1W&_@aC*ab5f@&8ItW_|tRg8GdY*~b*# zs!f;O!xj#EkzsS4wJ>+u8!GJXd4UI#ryl2=TB>nhVn5LyW_#&vAToYfL8;gAguMk= zTszkWI{4recXxMMTnZG2Vx<&!cZUwH#bt1JD^{SmQ>?f<6ff>ldZ+Z9^L;)4ckj)^ ze)ceVv$FE86`7r#)=+yMv3{!UMH}1NgyJ|U3v25YEb&VP zwH{afxBlq7Z(_n=f}kt-4wKM4PU^mLe&}4;tna`qUqLV5nEl#(;)-2LZImm0^=9P~!=nnT}nj9-7ECZWm{OrB*3pf5(EV^`jF#R9cJD`cn z5Wi&yF58zQGCnk)B&;JO7$TRD{U`%X`?;M7J>1mLp9%)sNs<`$hsd7I0>`3j(dRx< z*#u~x&NZjEk!mYTWgRAN3Ls`g$g+YZHONB=k;xVlS6ZsS_$UpOzF-5Cc>t#2SN) zX-4M3nqlzxQW)92S1dof(;=H4Qg!KazDFN964yP4g3dbbJE*QgL`Rv?bp-NX=bHw`7T3@M|Cm^JR zd&B5+SCnj3u2Cp~TCs>YNXAfxH|b!!6Wple=FM9fsO|qT7DX{PC6gi3KZqqbHP-y& zVSswb=#Od#Q$2e9dW#Cod}4aJ%z908R;Hg(pC8lvJ|uvTx5(*9lU`eqd_NgZq|0s2 zy36J**Zy*!_twce1bOg9Vutt0G;@`TlaCL|>?2ltVl8(-7K@?rBM5#(ZJ5sui6N61 zq?+G8;#|xjZl!H~h?X03w=pDBBma~RHqb_+YnKw=7} z9c7W*l#s;nW_l^-h(gsOZlz@2ZHX0!dJA_xQM78LlDqE;%DZAcV_8uQlu?`GG7dL7 zufSDvX{N}DBKnEm0BZC6g!%F9ipM3@3oh?eGv#*{;{sIyP6`EC-@520Hl>YAiCdef zkzts`9htv|3z~$J&Z&h>_6?jw&FW2E_uVUtSL{(HTkV_GC%ssj8aDMA5x59tPMYkP zcI^_tUxfS?`6SL|7|ts+VY4w#_55O(q6^{2cVr#2Et~vW> zmHLN17<$|8iI`-WsR!1s-_a?Y$HZx&)O`3}8z{*2k;ZQ}5W_9TmmV?l26grGe+^UE z=6R0xCebacgJfAmrNcl`pcDD6$HM;L(YFs}Ih|zbflFuKWzBKI&J3c326tbgv_kRc ze&op#5=+_PZ5r(b^{S5E>}7g+zfYAFIBMEihdxIbc|kBbW^eHh`c3_FYfjV*9Btl0 z%^h(huk@-8L(YvW`7Z)m4plfRDxQE~R?@McyA?USyVpXWJP2zwfoQp3ZzVWJd9VDD z+wSyv=e;Y->h4PCPY9DT{La--h8V6d&w0PPVkNQc7jdGkgF3*fUa(bXF=uM`x*t1G zXhlM+5iAsGpDhIrg+AMcX}v7B{rKa!I+B4QY&H1826AZbPN*UZ;SFBy!OddPN6`Db z9|u{hwELB*`}GKlSciH!`cM_$?uY1h5#jlOcjB(+oMt~uvwRlgS>imbf-03+kdYWRa4z|61nfTWGV`}DhUOz_oSJ2y0(VidQYf6#Rk3Cd&g zY!#YC$(Hvh40lQU3!oyeSwYLJC=B}>^y1wdc1EKfCN^7yh*4!>DouhfYKc&#P+L@Z zv^-oWdKru$k6{EI!x-O`wCC73kZs4=2xU`VZnwR(!&2yMmm=|UX@1dW@XcWKW7b<9 z*lVN8A^Dw4@##11KYe*gUCgXn2EER@@mAX!Jx`~DLND^~N|f88CHW$81=a<1?w;R* zl{(08l-nk8I_?~UKi^ac!-!-nB;MMxx`x&1FzllUfV?KUIpveN`X3H9Z!{L*mD(Ro znQ2;~kT)E310$Gb?1u z^EJWubl+CZU1WS!E@_Okfzd7YRM@`XFIeI4ckgZx7;r$L=?H-4c;~pf207DOad~eB zjrVmA6iB6L*r>fW@6C_>4}K}LA}alQD^PkIK7g+d-mb0)assY$(O0VLqfQEXmnA}u zmKR?SdV;tR?Y`x}h##xiOBI4~AiLbkd?93D7=)4aCNRc8D-k_F= z6O#w@`g@VCjiD>ON-(bRd1Y+x43tySYO7EL;pnt)6zPa_7g7jN3308C3zZu_3)8LI z&0BYZKf3ECpL`zjqwGzm#Gbnw7tYRMo^&)h`&&bM;}-SPRv)*nmcU{?nBwR8e9^H* zHKfa-9gn;&hb6)e z0?8?&qb0(-rnZoid%T$9ce*$4TEYDO=*9%ph5P++o*mfr z*SA^RKo6+j-xBiz2jI|tCHv7fS%Cos0N_IZo?DDAh0HCQs8ri_lVdF3hO6@TBvH<> zxa_LAmK90+AI`QJq|pX zHrwK%RIn%FxL+_Gw@000EvSf65>MQ`aEm?9*4=xIV<<8`hjO4V?)2 z=yr(+yc;#pDzF4YysZ?)4Oaa;uAI+a^{XX5^0PY>-4S}*R|D|qGfD=tCCfbriH;eS z0=XPD<554N8r@n`mY&C74t@p+gO3L9l^;Tv(JUQqJe$)+z8=H8o9P>AQ@A9dTrcL_ zSIsE->fX>+357N)BV`;h*qCQ^tDJNB{r|HCRyvND0!3UgSMnZuj3Ij|nt)kvX^bg(92aWq6wn zX0C?{?|4IB_tGmRk%ol9WA^&M&h(WGHjNiw>rjAEeEPaK$YCp|Qmvb@HRej21>25s z`o~Psd#18MDM8+#C0C}JXQd^jxgrxuH5P%kxB}`VZ&+O>d27bPluKWy&Z{0bU!sE= ziP76drX$N`-(IpiXG?zK6IfPQ?lZf2^y+oW!QJ-7RnW$AK*V5Co6nd!I~@*#t&fv% z!T#ZbpxbXv7f~p!y?U%l<2+qz{T$bo$pQ*?2h)9Dvxka#FF7%h|3v&zI-kexXai2* z=W)*K>zbt^QT^eGII_S>k6_<l=Yy!*~N12tjZ1J1;c??}*EhVde}g+hbP;AZ(1=2Ll!-ZJANztsmBw=nxT z=7rji$<)2Y2>U!&&7GLt%#Heq-nD9c{6)HApY$Ep4Uwx7gd%hR~DVPmtkngjw zM>zKz&BTTva##+5vFK#KZz`h)(drE8Y2cwPRC^TKt`u9S7iF#=@Zcn1CYd)0)gos` zO%U;h;&|Nr54Thja4&QFFBhYDM>yjNmEV5qeVN@WV_3*^*G>3ri1tOmeiTe)oX-!W zyM$sH-Tc6V1I>D?Ar!D-Hje!uJVDYI|=B@y6Z%6x_zMYkgbjlz%7QC@yk@7v+&uIvnGgq zfxm2(jY&r9y%9%F)2=w#A<J5smf=bM5$a&AZsUCQ>n#`}DZ(cg5O;0Z_BEqYfb425PInP~AV57uh zy=|7;Mk!mBJ7D%d&)*PnHrA?F9g8K1fr~~trdlGsa`xC(4&|i20VbZB&PV`hdcj#7 zZx_yg3@}XNMt!x>UFE#;-%uZx^9g@pBG|Cm3`y zAE3Tycj0HzgFZyAF$dZIn8-}BDOoG8Ou{$nZYl6JiVa~cShTJd86OR#uKilwfC_6> ztQ1hxT8jLo)p~J|vj4=KU_2#GtpX4*wBt+Ip@E#J0sE@+Bb_h`#?>JHEWht7d*A3S zRQC!IlF|ks(`UVqT?IuO0_5E*x!kr~L4b z>%aApD_uTjSQ>Cl5}sxDAsqMj?&`bp9P{E%U{got*%~N4fhD#648WONpn~_Z$bM@* zS8sWgWK_0;ImM&N8e%Wz9NVYGN0>omnY7pGF*1fUvnvZdE*en_5`xZ({$hsF)YD=p zx6^Zm5~49(n=pzG+XFwijCE#oV6{z+&m)=tb0|Zu2y$x2SPoX1!$?bd`|!d(7WfkP z2X(-<@hJJa*A5-v-OFflVC5B-<|in;2m&W{e&WdVEW8 z9LBM!OO@kbT9InKPPH5_6`_!wlz0=3y3eo1H!eJ#4wfVgZ$UXFE4lF!V4ojbEEczM z1>*1&80?dJ&tYR6ybm~{Qat=@CIhmq6|XzpPS`nXiM>d}d~j(@=?aOypcmNUaK95( zMT_!1nwim5aDi*@nc7LPuSvPwW6!qE5_chTyDrz0=IXF{0mCKSSfOO$`lY!s)I}AX zaYpJs55*>=UkmzBSaTJOo+Fu_%$0rc1+Q1BvD=>cbuPmGjw9QZ*O|r|X}fJs%Nz6r zL7EWKg}faZ2bi2yHaplRwfF7%Apc19n8<+`X4llO=FC{z8z;4MDd7!lxIgjgSG~~} zVOGxwcxN1HoB?H>E$kYbvm^Vib<3!{!-)6D8?rt~%Q7He{z#g6$z+dB9$2~z4-a{5 zSxhbQg5|)Eo6qV`4a~msen{_={)#f%N>sxEfNNp?!M`)HMWb33C<_y3hj1NfBas@O@;SXAl?=;!-Pa~a-Wg2KuF1Li;LPcW}rAX;OBjVP? zMw!rr+s6v5B--Q@Uh{QfL4g}sBRIYfgj@F8T6~uS%DyOG3&2PXBdyEbP|0KflK)ut zYgDP#uEUmgN{sW8Hg|tXm!$Lo!GQgQtcRo!O4uq9+QAzkyaTbB>noe<*?2a&M=1ZT z#=r!llVD@n>!mINn2}uxW;3IDj^`T$6Sn<8+0z&_?C8qc#{QjZ-B0AIbVTkejSsm3 zE~1mNptBm)4PcKddUAkzCk;|uQ>jo%v=_kx-)f?ces|thdPAxdSyDvTlt0D$%+v1G zVKIT6!Z%?n1tk4TnS~j&8qx2my5u}#DfQ|q))ffuJkhTTJjonH{ z!1t{N5;OT((8*1V`Xx*AyvnW4LNf$BZx$}D09zJ%UBp4N>v4SZ31v}D>>xNcI( z=fi#Fj4I@fPc2sG;d9XZ?WBqKyiZ_SffcDJdqrN)ybs+qU~VT%oY;A@=%cw~OImNm z>AFcx1Qg;PXr>}rbiJJD!}p3EGHX+MNn%xg3ydJ)?S*%#(1P%i-ocK_k}KNOUqE&D zY5w1Qt8D^TuyMDYfC8It*M*?!cWG2Nj2gs}NaI>lIU?8}3di_N^WPIJ3?B)amp{xH zr*_}b({DTkxWm-3YKr_#6-^4T=4^Nrt6?34dffj6YJ&s4` z!-r?4w+eM%(9cHKOs@b!=XfBI z7PneIb7+OFCU%-+Ied%^; zKTSABqTpHI2%WVPpKoAMU;F?$ioDxdOubp#SnXrb5(!B~!CY)I^U;$_3 zhUN~l(#t`@sstt-%S;dha!S~UKAn7zEkZxbOD$vn!azn!YBH!Y|D*FH=JzNJLGrQ` z+WyDi?`T;0I>PsA#>B}l@=Q6=aX=_;8-68K2?XX83ExNK7?vGrxKyeH$=xpRlr}k* z-Y}E3y>G3!y_w&HOANnEW?z+-mVqy{P}|DO?7H)56Qn#DHsu1Hdz}Nmc?`Z9oT(dr zyVYkcNA~=r0Pb0Jp&*_4L2FFO3xw4KLFIvz%Fs6fjs_6?7w zSaTE)l%cB>hbvJ7L>2RuV_2k^arZ2qMqMVa9TnzaMr6a~L6}G<+VGCDp)qLSjWpur zSBWxRYMUY~S-8h_*oQ}=NVNnxrIg5+2FjA4Dp`NJoAW&^xDIT7f3=xRC+;!AvU-WS zZ33<)^l~}4{9^J-Y#=elk`&E#xx2jZq)0Nf1r67JOgTol6$R7T{W9Ha0kc?#R5#hz z14)PGqK<`JpjcS^ebErvCRHfE4^&LqG<&89V#T7Wt0d#rhU_1LNm>=z+ia`+G%USu zCJdc76m;tIwd2uqE{;-s7}(u$CD%;6}yAq|el!#FQ% zxgCvRaZ<-ketcs&KJuk@`;+ux@={(J)Htn6?bJH#Jm{sgvxRNA!pkjq^*bAQvRdC^ z+=v8=RBJq-E$(i4?FBmIl@Jse-r0BPm~XPW8fv%Z(Irf)0a%mPe&YzC8Rx97s%zd6 z2I=-4swOyMygCHbBO!SSOqnLdUd}xUma@2_7-y8m+O_pCDtM+azL>@P#-km`V)Jh= z#$MI?iGv2Ir-ITC*SU-Ui_qUcuV6CAw5em^YxS)VAKWac%ThW<78py8+0h5rixA6X`zNwEKfs(73s14t%;ge%N z6f#IRkCmTyK|S{E3&r~?-Bip3-#>cO7cz?RYF(;la3;R8E#3dZsa>=N--M= zuqXlL0IzbCjZbRn$f;gw2&VadKW7y*Rs~T&+$e9DVKR4c2lvj@vbv#tz0@G5I4Y6> z-HRh@V@i#4MKZk8%YT%=kTvDZ97((QK84j-D{5sdi{Qz--4)2sfH#!7R}rJsfCV>` zROo&!(CqO>kH820mDAB>^VmnxU?K5j4442C;fq+KjbvQ=N#}cx`a1*kp|lo%FXYb^ zAlr{&Uuu!UUv?qw=Ano|3(Ffq!IjT)xGmd8ATap9s%=m^%|8;8n$>N`c~4q6oLJgF zwisttqQ1FvFbWo}3DUyz3n;3 z<8rZINt5h|RZp*lUnBseo7FDZ{QTNe0p#}VGNyOM?N&&SSrFq3tBA$3UE(`45;c2b zd$1M{T|b9AO;MB+nf;e-#s@ zTEsZ-#5zT3h5c!Yux?oxP3wARD-0szuk{P)v5OKIDO=Eg-^jK}GD|o)9@cg5y@!m=CL*iHmZ{Jz#-&^x_s89tai2UU7&RkF&zxmD$YJ;oN_jz%ODPAstW9 zCn*)1@=Vy2oLhMLeA+77^JlHW;4Z5ogU7o#HcB(6cHX_`{rX2zr7?BYrsOBiNEKYc z2sm614Qro|y_ADN6d&230{}PHZFHC`Z&m}m4gC5DS}3%Y6b1;7$n2LvBF5=3Qnq2j zTLJ-yf~30&^Joeu@RKS6_I*Ws8Qh$8s^VOlb{K)*+L)2p<0!$jwDwViiW@`)zVL9x z4B`8GUf8#~wfm?N#CK;c1(uaWu65644HP8=$>422Ag=+3JS!xv4#StTwN41`{*F zFn*FWGe#@Y-8W)baA$=7n16g=Ty~xD$o4}Ek(j5ayung1S(do*Jqm$2aS|l${;9Wi zx=hvbhb7@BauWl1&3&9rfolS*Hw&rJ|B6K*F_jEPIMSSNn^b~N$Kf7VCY`pl&T;tdA;uV zI88Wg_~tCsRhX&U1L|!=xtLbeSkXbZwUUH&&BX|^Q&rDam6ckUg+JSHj*MaqwhHfn zVY!IgSJ&MKc4?4e@jDNez#kY73f!u>-)@CM9b}0;^e3drXv4R@_);pXQWmn^vMyy; zm+;26`cW$#8OIq9#9_Z2UnsS+mseZnQy7kiwa<#uj%cT7Hu0Bn$2FrC~ZBp)-3*fCG>KH|zHi40lG-rOr{)9Pm^txr*`XY{Hay-3^AGkWS;hDE;zlm1ic|J-@nQSu4!-mgTyh=^ z-Fvn*vO6pViV0CD#vtWWp<4`PPvOLYAEc_d&`j`dk8MdzF?>JTo@a%UAhA&t?4!-?kmb#5#(U)UlwAw+Iu z^Lnh3Y!ZyGT`Squ<#P1|I@AN-@PDGgD^a`p9_o~XtmD|~_AcxdWjX)K1cBZY&5Q<8=2la=`Pw_B*&At7(`vo!s<0}b{G?=U8m@@%(rwJ zTkQk#3{LAO$GYbzH_xIVuZQR`rMcusu9fg5exGIM>|TeJ)c8VVjXn`1@J8%T>qYn8 zbFl#)&^Vt%&IgQ^Nf_V7$x3dIqAX8~ormPvjbtUg_9TyS<bm;E<~B%5Y!m>1`u``jf~1<*OEERE3=M6~C0>m8vmcX%^Qm9V(IV$m zV9_l@+q|F%G|lmlue&PO?5tOdY>D{kBVB);s^E9#+cNR4?enOYGiSUaJSdN*pbQ@# zw2th+AosyysjCI3T2Jg!J(bZ$)C9Bat z4O9%0DmhPdAoSc6_s9$3RS#L3Xts3i7?Fy})f^|S)qX59CO_w0xor1a> zJ5bxs2MrPp`g8}dH5feWb@BV10_v{=if-8XLvlDYMw1gk?IP{Ef_7Ej`V`;sukMN| zLQMLH-g0s4vMqj6{QBkv*5Cx!yDy9%ThTX6P;RYG-rSuONjnk?CkYFBa`z8OI}wYd z8ciNq*{JQ4NqKH;Pi#o_^$0f_F;#%X-^QP3autc*MP-|ahVW*Tru1)U;kmeyX-=OLwLel zla}DMm-p#zoi0X=g(NGVcUh~x>5B0uCLQp8{`@F(Gp~6oZ&JShJ*u-eCfCIZ1W+V! zavLyTw}?YQ(7CaqkczQhazuR^Q($D=zyo33mqw@{SU9ci zD&9D{1P#G!bV1|uMAybuAW%ZN;5fPrzGP4^zod)O$_t%O24`d@4Qs>^3Q!%-E8Spt zkq~PjA2N`u@~wSbA`9Y@6iDxFA1VuH|th1t<}6bxSSM zt6v*Eeuo=_6?5kIv80ixZUR-GWR_46GspS)mrxtP)-=fBy+G}ZGd(_A&CE#SRdMH)RW35#Q?`; z`E$jbsFHsjRkUZoPdK(e+fhNO=wUrb3up_uDE?PV2%hx<3c*ZpO@Q&dfiGx&wVr(Q zddo==>@nnG|DS1=Du86*d?D`d|G({V z`~U1WUQ0?Sy?$Ad+8>vRe^>V;Yfq?>uR!ocnm|DXVGkygCXv^dWX^nyii)i| zZ-LlaQ}ngd+Gz7=>SNGl+IG^XP;A{2xx&yC!MTF_B_mK&34NuaRMuPM z*m5eyL;VCm&T33r!RaDvSsb0KUOlQZN{2)MC$y91Ug$W+yMf^9kU7j&?iaoc@YALy z4FS*ad#YADnyue=O}KjsG=iH0FLW^_{p2_fJkmdCG|lKgQ!3LfuEHFQSUtqR$bWCP z*@x~VGOxB$eu!{+VtEAOL7$Izxv*zavp$)_MFc*3t}ohjG!Kqfk6T6}peJ9MUY;Fu zr`wE>Zav)%NuI7$ovrlilY>In&$$5#AzUfpw$ROJaEhjn?~}k&fY>(V*mXIh;kDmJ z_pG7ZOyPWo4Afz^UXr*096~;4W+@;y=2Pr4$jT=t0C+1cbe%a@0x6xAqlFOF;4($M1% zm`Ldad-CdY6%uod-jZ~Z$orqHMiAVUyC?Z3Gzw+PKDej9s2O3&Dep+?z*n+YprEK( ziZ-h@ii%MwN1QB;@-H7P8 zx&k-6ONq%@m(%)TGll+cbB8ty9I> z!tZR7O^v?!JUVyv|fP?w5dATU3~cURRK8Dz#gxCF;Q8<;l=NHzf?l zjWoA(`&-jt)XQR0CPG{svd=`-o=wJYvhv{9@vO(*Y_eZ}=k)tpNE*DBJaypX(t$@Tq#+YTe|VdI5a`vYrI$e2~)u_d3cBJ_jx4r@N1TrwS@lGBE(2$|e9@G6$)=1mSi*lq7Y$BeigHUkY%ZawccAGdgw<2=y&7 z(|v6$cGJ_ev1@{@h$N3-CXq>;SKC0`j8vCr(!$pjZ5>sf{_FQ_h$#KzU}*rInu2xY zr)g7A5fKxn#QjwI3;ROHv$4T@gS4-2H{ZU)$Cw%?fsflow!BG)*DQpCQ7Le!)>@C+ zuZQ}k3ni)q<_}4$@uoF00ftJcPMUg>R!O+rx=NlMTwm;i&$o-|rXEncCOK8b3Z`^CVsNWcFXPc^@QM&aXB3s&{)}1Ig2E*I z!O^&lP5^&NDw9rMOVguHu+yC)f8)7gSYW1l5F0v4OM}ozHPLqFs(&7$CWdFB$;GQ< zVUTvk_r9H1MDPLE%a`wWIo`iqa*Q3_5!*ZFg7wN5C5Vfo5y#HeVmefgd8sSwu?1FX z_%sMk30;-y)2B9>@&BYjwJ?AX+w?NJcx}*GCFt2$y=d}xm#ig2u;)NPmJQ#++xf#@ zPq~EN%1lz$K4(s!R_=u%3$)5UXi>Q60X|SfdyF){XnM?I-ODksmJfT+lush1>o*k$lL3y++elq$4TIrVF#XUd@UGOLLhi%+DhRBy#2TQ$>@ICb&S# zu|>VJGPULu$L7OrkP{lnZo)#m*DWOM*=#q&0*(Cw-h2*m+(g;MPm*?Ed;98}gkptn zC4p@%<4c1q-<#QI_bm-OjvWi6)4k$VA2PQQmims2%GY?EqOUFpr-z{}_j!j@*dlY! z%e0k6nv?kvREHUokFtTfWtjOFEjmRYi$mxg7ffjbhhwvGul(D($O-mS!wy#K+QOeZ zprzbX5zvK+>I3J7$F!z~$o=g5CWcn31x50`f^8?-zPf0Ho@ld$0|dZ5XVHUk+n9Cd zel=}`hRwN16}o9lhx3&94L-bu_3}O-Jt|bGD5^F!QUmdmkD}TOmTXR2NBDo1%(DV$kK`j{a3Tqcn??5c4t?d!!P8U*{-a zB&;P|4WAl}MIE&ATmmvjd_e+|Y`xh!IC)2>`@GQ;u#YMHt!Ajd(r1BE3$pfWPpvZ# z9;{2QQu)b6=Ayt+!2(-I370!%a9g5IM_xm0&GGEYXL2->U(daCyr}swI5!6G9A<@= zYIoXmQo~@s#LGxb-h4B}!{0BBlGt+Avjg$H(U$l4&U^@y{6wvlgT56gWbrNLMeZ7z zfI*AFV-8a{(OJ8fp?lGHvR1Z-NMF!>L3SqItqee;c-3^6fQav9 z8nkpxa;$>=JeP+KGOUVZ(jFN>F_UiER$|4+x9uPl zl=j%Lj&HWi4ORyR5DQTVrrHQy4S(7Yw}uK=*%c_&Gk&b4`R3K_x4fU?B|{wB=pZ2j z_KO-pXVR}{W=)XrN0{PRb+y0`TD2tfX4cnD5Y((9ho&yH$l>7um7w4qary{STaktW z(`2_sT!C1P0W8B`zM)Z4q~8cN+6>aMOJHZKSCnG_^b4?QR#M5`8xmXECbyj#>`G9T zlG{8lcvoz!Mvp&h7u_^|5t+q%sHc?d7X6VVmd!atCrLv(U|emGUlL|_E@CZ z64j!43qr$PB>mX}DuLtQ;$rdrTnMjRJ%+fftJPUkdLxWEYKwD?N24U|@DtDwnc#iU zn6+jjuJ^$@Y-`sc{RdAX5cXmRE{@B2`XpRJNvbKV z^R)gjRdZ6r;P*}g{LhR$Mv*?Swa%P1-4<#39kX|L5qIm2<>3cAZ7Z9faT^)}HJH}| zr(|Z==`shQXx`@9h9=p6iCy$?V6u>I?Uy9P=FOkZ(7*z&vo!^`S`ArvU;r7 z%n#=s8F6o{2ncXzn}&h-jYU94*y;oJvVIsph;0w?IDFci;AIOF0lIdZ8gIS1y`)&y zgvnAITDS5p$#q$i@R!e#8{^bbLrW|p;&Q-XlVdGKC>J@>j}7%BzSDXv&LJD$v~7NZ z_glyLmE&K9fB4?Cznh7xhzIl=5NuJp(`m7~BG@VmtOq3`i|q^G!?*XgZzI4aI-%4s zz>+n0rpTXBD{A)PgR$wzGc?A>IA2p*YCtVfP~Xi2fnp&$fQ-@{wIFDJ?Uf;BWT8v6 zwVD(9w*M}s$g`rmOh*|{DugvjCrCTY>o5#74$^&=dzH1Qq(y9_Zo~>=L3hf5b!#>e zEe300yaGkYRStNVX8NnMAU~f_{Lx7yUXRpBg4SN~%5Ik3skJ$W_q@k*a}-y$k?P&E zy6{kA-DB`qm`{DMjEu1x_93soEpl7u8Ox;<`*bl9=0-(%Z+uyN#t8MojzGfLVPflG z@|9QKOWpWjd};5*dY3C34$Fg;0=~O zt)Hx~_xRr+crp2>OdPGNs+`izE>j|_edl2O%&M;y`FghQ(~_6WQT?u0n&+a3O}H?h z>Cg%rh%094T5xQX!*i0|e-|jJ-7CjJlzk@}la%F?MFehM6*1AiO23P1(X_M6A zw;RGjfcqvbU~B+^K_pVnmh4jk+1`o#G5w8?8mfZIeZ$W7{O)(1BXrhOC#aj4y5T0g z5MlF&!X+syTv|pbS7fL9bP~lbyUPc}OIw#4(D#zNR78aw&vh*gS~L?IuiRHgCLzhB zUovIXlPCk}*Sl?uC}K2gA0KPOc%-FMG)IzEGz$%`Ql7`(V{^8 z;5U3~nc--(nfIKZY45U$-ArizVx6>4rS0Nh#s$s7xTF;+wkMTW?LZ`d{3V@*$DqOW z@{|rTux7d0ArLO@GGY3nzVc&t=W!ON^$SQ#_@l`%(z_3;iK4L?YKSD!64~k1*ZG%K z2CNJ}-Vd37^BS_dmuPlZ$ng38Oo{VoIKbtqcT3k@*Uim+{jCIoPK?^ZIy&)KU6jue z)AUxZ1%m3-b@cq}2`1s-C^N(=_cmQttjNp_{8X$6yJtDIm74P+w}isD(7I&kr2N?? z8Z{DaZl|d{qC5TVl@rcmq2kH(P%%WyV#TzXL-*`2~p$_~I3nVA|HBANcTvCSG z9ss~dfdUZx9S^zJ`6b0x6N96`Kos&{xQLE8DH+I%^sJDFFOdDu{t0z{r}p50I3UB* zoAltSI3PY;ou88<06d-q#EXBlM+UR!08uD@$p}6-m{P$60DSZT0P=q%{K~8DZ@h>D z5?CnyFT5#wV71N^0N@r5^Ynn_?<9485h6tCTlvJG#~)rfCpLg@&}f- z8SDxMQmg&40a`hxYy>2B0doC%%Jz4t^SkVZ`mbkhY6-^cO4ufKCB2kMs}bmphS$fYDNblusx^N?6V`h$j_6`2CYF{4}s~3XuA#EZPh# zmXPWX7=b`={*bkk4g-dYhrtDxrTk@qW@90H2Z&P!R095`9bo}@HsvqvK9|NG%|j|n zC&cR@1pO20{F*1hc&R{|-_9$V`ozn?3=BAD5C;4IIBwJzC94BSC0K$K^iL}Em%tgR zK=R*WIw4{pBzkRtms9^DaSpBQA|eHnFD=x+isWMlCQk!W>Hl&RjN1o>(f>)c03zIf zJBpc$1*?g>$-gU>@$LJxXb8Pn5PJVK0)G-XFYPZQgs2?kzK4*p3~`q~UF9AO-bw?~ zKA8&J=+%%s1Q7!f^rx(ksbHq`zhsFXh3|2Y0|3EU|7L_G7i^RMHzTp>PmDx$fh*F1 zv`#<+g%~a=8BT7$f5^BhS1Fw^K!fJeG&l+CMd(yaWqo{3Wr* zv`CW`QhIzy+5SYmgM|lI+`til(;*U{a(7UHIrD^IxgkvbiS2-c2S2-mV6)@?!fK!# zkrF^;mO-XS|HRrOz=P23+NOQr45MA6UUR zSwMy-`LC+w4NV{##6Ye;Yp4M`SS@9q|o z=|7>)uU`-ze3}Eq`B!%vne$ZR4W1!@pXC6t!EHG}%%}YRyNhM`N6xSO)>y$OIY7QA zl%H$TAU;HQD2QsmrfB{Sb$(UszfcrlJxT;baCpMscK7?$FW32@asG-W2e;+|ah?SI zcNfd_w-m@7(tL9NhAO*5p@PZs{uacR_atb6=T|Hl_<#1Z{;p$w?vNJm8ZyK4=P-d- z6r7z0GtaqOd{TZZ$1(1v855+#|J>mb~yI8tE;D`pl#rNa` zasSFU|EUNcZNUabKpZf7!Cxa29$t{(k-Gqc?;XZ%7IMtSkd%zwk`IixyM#q`dE^U*F+^yNdpz7OJVE>6s1yu%`y~ zuaSsc!|&|$N)XV&7?7s#DZBsd75s1Y(y_sQ>rJHFBc;!%3|8enTJFfk5z&zeUHS3#d{-y4_zt04V;zLt2O@ zEq>uStt|}y$6!fHCF_{>C4a z04aXcj8XbTGf47xga|JX^{I`2;_g3dq5sXDyxea*WOej!?*6j^_}@)`vixr-WKHnz zhT=b~f&VRaTj@8HrVNPpTRqXTC-ux#en&Wz0kNMnOS2#9{|4c68PX{K+0)#;{S9p@ z`zyQuEG7m32>+lS-{3bCwj7A{B=w&a7ZBW^QfaJzL5bM@hjq@t=Y9Xrb^&9iAE*O0 zYBNefn)Ja&gBBw81LN>8P$g>GO01uLVGV~ico`G=A}E-1w=`-ub0D>za4v~LZcbra z7lknJO)IK__2`SNV9TV?jYMByfMjGBs*&g>hI_cW`k)&JTYE5l>sk&0@hy#A-B=8n z4qShrZ4B}d`qBf0?Rh=eGy)eQsI!1HPT#YRLjq`ibU!v_uh(&?)Pt5EOlG@o1dJwN zM**^s3}OB$Y#NakrNLGxpnDK~fdbq_M*ayXPQi>+$a;kUZ&qNT#K4dWg#5q~wr>Hj H&|v@oKgdg? delta 246930 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

    H)%*@{c;TLJR^%?7$hTsa_YOc7H$HQ5 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 z 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 z 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 N3IxHiL}1{8{y!pWmwx~N diff --git a/Misc/NEWS.d/next/Library/2018-11-19-07-22-04.bpo-35277.dsD-2E.rst b/Misc/NEWS.d/next/Library/2018-11-19-07-22-04.bpo-35277.dsD-2E.rst new file mode 100644 index 00000000000000..ff76988e33e7d5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-11-19-07-22-04.bpo-35277.dsD-2E.rst @@ -0,0 +1 @@ +Update ensurepip to install pip 18.1 and setuptools 40.6.2. From dac5124ba498b51a2c46e2bda751150ae244ed47 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 Nov 2018 10:08:07 -0800 Subject: [PATCH 2003/2287] bpo-9842: Add references for using "..." as a placeholder to the index. (GH-10330) (cherry picked from commit 6c48bf2d9e1e18dfbfa35f7582ddd32f11f75129) Co-authored-by: Serhiy Storchaka --- Doc/library/pprint.rst | 2 ++ Doc/library/reprlib.rst | 3 +++ Doc/library/textwrap.rst | 2 ++ 3 files changed, 7 insertions(+) diff --git a/Doc/library/pprint.rst b/Doc/library/pprint.rst index 3922a768311c65..deadf182085159 100644 --- a/Doc/library/pprint.rst +++ b/Doc/library/pprint.rst @@ -30,6 +30,8 @@ The :mod:`pprint` module defines one class: .. First the implementation class: +.. index:: single: ...; placeholder + .. class:: PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, \ compact=False) diff --git a/Doc/library/reprlib.rst b/Doc/library/reprlib.rst index 0905b982cd830a..dbe2a7182aec95 100644 --- a/Doc/library/reprlib.rst +++ b/Doc/library/reprlib.rst @@ -42,6 +42,9 @@ In addition to size-limiting tools, the module also provides a decorator for detecting recursive calls to :meth:`__repr__` and substituting a placeholder string instead. + +.. index:: single: ...; placeholder + .. decorator:: recursive_repr(fillvalue="...") Decorator for :meth:`__repr__` methods to detect recursive calls within the diff --git a/Doc/library/textwrap.rst b/Doc/library/textwrap.rst index 438007d0028d86..d254466c9a320d 100644 --- a/Doc/library/textwrap.rst +++ b/Doc/library/textwrap.rst @@ -268,6 +268,8 @@ hyphenated words; only then will long words be broken if necessary, unless .. versionadded:: 3.4 + .. index:: single: ...; placeholder + .. attribute:: placeholder (default: ``' [...]'``) String that will appear at the end of the output From 7a0d964afb41bde846771c81ba746238339cdd8c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 20 Nov 2018 11:02:49 -0800 Subject: [PATCH 2004/2287] bpo-35021: Fix assertion failures in _datetimemodule.c. (GH-10039) Fixes assertion failures in _datetimemodule.c introduced in the previous fix (see bpo-31752). Rather of trying to handle an int subclass as exact int, let it to use overridden special methods, but check the result of divmod(). (cherry picked from commit 3ec0f495163da3b7a15deb2805cec48aed432f58) Co-authored-by: Serhiy Storchaka --- Lib/test/datetimetester.py | 43 ++++++++++++++--- Modules/_datetimemodule.c | 99 ++++++++++++++++++++------------------ 2 files changed, 88 insertions(+), 54 deletions(-) diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 40a457c9c53830..54035ab57f8d55 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -872,19 +872,50 @@ def test_issue31752(self): class BadInt(int): def __mul__(self, other): return Prod() + def __rmul__(self, other): + return Prod() + def __floordiv__(self, other): + return Prod() + def __rfloordiv__(self, other): + return Prod() class Prod: + def __add__(self, other): + return Sum() def __radd__(self, other): return Sum() class Sum(int): def __divmod__(self, other): - # negative remainder - return (0, -1) - - timedelta(microseconds=BadInt(1)) - timedelta(hours=BadInt(1)) - timedelta(weeks=BadInt(1)) + return divmodresult + + for divmodresult in [None, (), (0, 1, 2), (0, -1)]: + with self.subTest(divmodresult=divmodresult): + # The following examples should not crash. + try: + timedelta(microseconds=BadInt(1)) + except TypeError: + pass + try: + timedelta(hours=BadInt(1)) + except TypeError: + pass + try: + timedelta(weeks=BadInt(1)) + except (TypeError, ValueError): + pass + try: + timedelta(1) * BadInt(1) + except (TypeError, ValueError): + pass + try: + BadInt(1) * timedelta(1) + except TypeError: + pass + try: + timedelta(1) // BadInt(1) + except TypeError: + pass ############################################################################# diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index b2e0176b323223..2edaf1b319c4e3 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -1542,6 +1542,29 @@ delta_to_microseconds(PyDateTime_Delta *self) return result; } +static PyObject * +checked_divmod(PyObject *a, PyObject *b) +{ + PyObject *result = PyNumber_Divmod(a, b); + if (result != NULL) { + if (!PyTuple_Check(result)) { + PyErr_Format(PyExc_TypeError, + "divmod() returned non-tuple (type %.200s)", + result->ob_type->tp_name); + Py_DECREF(result); + return NULL; + } + if (PyTuple_GET_SIZE(result) != 2) { + PyErr_Format(PyExc_TypeError, + "divmod() returned a tuple of size %zd", + PyTuple_GET_SIZE(result)); + Py_DECREF(result); + return NULL; + } + } + return result; +} + /* Convert a number of us (as a Python int) to a timedelta. */ static PyObject * @@ -1550,70 +1573,49 @@ microseconds_to_delta_ex(PyObject *pyus, PyTypeObject *type) int us; int s; int d; - long temp; PyObject *tuple = NULL; PyObject *num = NULL; PyObject *result = NULL; - assert(PyLong_CheckExact(pyus)); - tuple = PyNumber_Divmod(pyus, us_per_second); - if (tuple == NULL) + tuple = checked_divmod(pyus, us_per_second); + if (tuple == NULL) { goto Done; + } - num = PyTuple_GetItem(tuple, 1); /* us */ - if (num == NULL) - goto Done; - temp = PyLong_AsLong(num); + num = PyTuple_GET_ITEM(tuple, 1); /* us */ + us = _PyLong_AsInt(num); num = NULL; - if (temp == -1 && PyErr_Occurred()) - goto Done; - assert(0 <= temp && temp < 1000000); - us = (int)temp; - if (us < 0) { - /* The divisor was positive, so this must be an error. */ - assert(PyErr_Occurred()); + if (us == -1 && PyErr_Occurred()) { goto Done; } + if (!(0 <= us && us < 1000000)) { + goto BadDivmod; + } - num = PyTuple_GetItem(tuple, 0); /* leftover seconds */ - if (num == NULL) - goto Done; + num = PyTuple_GET_ITEM(tuple, 0); /* leftover seconds */ Py_INCREF(num); Py_DECREF(tuple); - tuple = PyNumber_Divmod(num, seconds_per_day); + tuple = checked_divmod(num, seconds_per_day); if (tuple == NULL) goto Done; Py_DECREF(num); - num = PyTuple_GetItem(tuple, 1); /* seconds */ - if (num == NULL) - goto Done; - temp = PyLong_AsLong(num); + num = PyTuple_GET_ITEM(tuple, 1); /* seconds */ + s = _PyLong_AsInt(num); num = NULL; - if (temp == -1 && PyErr_Occurred()) - goto Done; - assert(0 <= temp && temp < 24*3600); - s = (int)temp; - - if (s < 0) { - /* The divisor was positive, so this must be an error. */ - assert(PyErr_Occurred()); + if (s == -1 && PyErr_Occurred()) { goto Done; } + if (!(0 <= s && s < 24*3600)) { + goto BadDivmod; + } - num = PyTuple_GetItem(tuple, 0); /* leftover days */ - if (num == NULL) - goto Done; + num = PyTuple_GET_ITEM(tuple, 0); /* leftover days */ Py_INCREF(num); - temp = PyLong_AsLong(num); - if (temp == -1 && PyErr_Occurred()) - goto Done; - d = (int)temp; - if ((long)d != temp) { - PyErr_SetString(PyExc_OverflowError, "normalized days too " - "large to fit in a C int"); + d = _PyLong_AsInt(num); + if (d == -1 && PyErr_Occurred()) { goto Done; } result = new_delta_ex(d, s, us, 0, type); @@ -1622,6 +1624,11 @@ microseconds_to_delta_ex(PyObject *pyus, PyTypeObject *type) Py_XDECREF(tuple); Py_XDECREF(num); return result; + +BadDivmod: + PyErr_SetString(PyExc_TypeError, + "divmod() returned a value out of range"); + goto Done; } #define microseconds_to_delta(pymicros) \ @@ -1638,7 +1645,7 @@ multiply_int_timedelta(PyObject *intobj, PyDateTime_Delta *delta) if (pyus_in == NULL) return NULL; - pyus_out = PyNumber_Multiply(pyus_in, intobj); + pyus_out = PyNumber_Multiply(intobj, pyus_in); Py_DECREF(pyus_in); if (pyus_out == NULL) return NULL; @@ -2073,13 +2080,12 @@ delta_divmod(PyObject *left, PyObject *right) return NULL; } - divmod = PyNumber_Divmod(pyus_left, pyus_right); + divmod = checked_divmod(pyus_left, pyus_right); Py_DECREF(pyus_left); Py_DECREF(pyus_right); if (divmod == NULL) return NULL; - assert(PyTuple_Size(divmod) == 2); delta = microseconds_to_delta(PyTuple_GET_ITEM(divmod, 1)); if (delta == NULL) { Py_DECREF(divmod); @@ -2110,13 +2116,11 @@ accum(const char* tag, PyObject *sofar, PyObject *num, PyObject *factor, assert(num != NULL); if (PyLong_Check(num)) { - prod = PyNumber_Multiply(factor, num); + prod = PyNumber_Multiply(num, factor); if (prod == NULL) return NULL; - assert(PyLong_CheckExact(prod)); sum = PyNumber_Add(sofar, prod); Py_DECREF(prod); - assert(sum == NULL || PyLong_CheckExact(sum)); return sum; } @@ -2174,7 +2178,6 @@ accum(const char* tag, PyObject *sofar, PyObject *num, PyObject *factor, Py_DECREF(sum); Py_DECREF(x); *leftover += fracpart; - assert(y == NULL || PyLong_CheckExact(y)); return y; } From df3051b53fd7f2862a4087f5449e811d8421347a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 20 Nov 2018 22:36:15 +0100 Subject: [PATCH 2005/2287] bpo-28604: Fix localeconv() for different LC_MONETARY (GH-10606) (GH-10619) (GH-10621) locale.localeconv() now sets temporarily the LC_CTYPE locale to the LC_MONETARY locale if the two locales are different and monetary strings are non-ASCII. This temporary change affects other threads. Changes: * locale.localeconv() can now set LC_CTYPE to LC_MONETARY to decode monetary fields. * Add LocaleInfo.grouping_buffer: copy localeconv() grouping string since it can be replaced anytime if a different thread calls localeconv(). (cherry picked from commit 02e6bf7f2025cddcbde6432f6b6396198ab313f4) (cherry picked from commit 6eff6b8eecd7a8eccad16419269fa18ec820922e) --- Doc/library/locale.rst | 6 +- .../2018-11-20-13-34-01.bpo-28604.iiih5h.rst | 3 + Modules/_localemodule.c | 91 +++++++++++++++++-- Python/fileutils.c | 4 +- Python/formatter_unicode.c | 17 +++- 5 files changed, 107 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-11-20-13-34-01.bpo-28604.iiih5h.rst diff --git a/Doc/library/locale.rst b/Doc/library/locale.rst index 9a0c570533a177..2addc0ea66220f 100644 --- a/Doc/library/locale.rst +++ b/Doc/library/locale.rst @@ -148,10 +148,8 @@ The :mod:`locale` module defines the following exception and functions: +--------------+-----------------------------------------+ The function sets temporarily the ``LC_CTYPE`` locale to the ``LC_NUMERIC`` - locale to decode ``decimal_point`` and ``thousands_sep`` byte strings if - they are non-ASCII or longer than 1 byte, and the ``LC_NUMERIC`` locale is - different than the ``LC_CTYPE`` locale. This temporary change affects other - threads. + locale or the ``LC_MONETARY`` locale if locales are different and numeric or + monetary strings are non-ASCII. This temporary change affects other threads. .. versionchanged:: 3.6.5 The function now sets temporarily the ``LC_CTYPE`` locale to the diff --git a/Misc/NEWS.d/next/Library/2018-11-20-13-34-01.bpo-28604.iiih5h.rst b/Misc/NEWS.d/next/Library/2018-11-20-13-34-01.bpo-28604.iiih5h.rst new file mode 100644 index 00000000000000..289e484c35d646 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-11-20-13-34-01.bpo-28604.iiih5h.rst @@ -0,0 +1,3 @@ +:func:`locale.localeconv` now sets temporarily the ``LC_CTYPE`` locale to the +``LC_MONETARY`` locale if the two locales are different and monetary strings +are non-ASCII. This temporary change affects other threads. diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index 95b370b1ad087a..f3421af65f3d1f 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -128,6 +128,82 @@ PyLocale_setlocale(PyObject* self, PyObject* args) return result_object; } +static int +locale_is_ascii(const char *str) +{ + return (strlen(str) == 1 && ((unsigned char)str[0]) <= 127); +} + +static int +locale_decode_monetary(PyObject *dict, struct lconv *lc) +{ + int change_locale; + change_locale = (!locale_is_ascii(lc->int_curr_symbol) + || !locale_is_ascii(lc->currency_symbol) + || !locale_is_ascii(lc->mon_decimal_point) + || !locale_is_ascii(lc->mon_thousands_sep)); + + /* Keep a copy of the LC_CTYPE locale */ + char *oldloc = NULL, *loc = NULL; + if (change_locale) { + oldloc = setlocale(LC_CTYPE, NULL); + if (!oldloc) { + PyErr_SetString(PyExc_RuntimeWarning, + "failed to get LC_CTYPE locale"); + return -1; + } + + oldloc = _PyMem_Strdup(oldloc); + if (!oldloc) { + PyErr_NoMemory(); + return -1; + } + + loc = setlocale(LC_MONETARY, NULL); + if (loc != NULL && strcmp(loc, oldloc) == 0) { + loc = NULL; + } + + if (loc != NULL) { + /* Only set the locale temporarily the LC_CTYPE locale + to the LC_MONETARY locale if the two locales are different and + at least one string is non-ASCII. */ + setlocale(LC_CTYPE, loc); + } + } + + int res = -1; + +#define RESULT_STRING(ATTR) \ + do { \ + PyObject *obj; \ + obj = PyUnicode_DecodeLocale(lc->ATTR, NULL); \ + if (obj == NULL) { \ + goto done; \ + } \ + if (PyDict_SetItemString(dict, Py_STRINGIFY(ATTR), obj) < 0) { \ + Py_DECREF(obj); \ + goto done; \ + } \ + Py_DECREF(obj); \ + } while (0) + + RESULT_STRING(int_curr_symbol); + RESULT_STRING(currency_symbol); + RESULT_STRING(mon_decimal_point); + RESULT_STRING(mon_thousands_sep); +#undef RESULT_STRING + + res = 0; + +done: + if (loc != NULL) { + setlocale(LC_CTYPE, oldloc); + } + PyMem_Free(oldloc); + return res; +} + PyDoc_STRVAR(localeconv__doc__, "() -> dict. Returns numeric and monetary locale-specific parameters."); @@ -171,11 +247,10 @@ PyLocale_localeconv(PyObject* self) RESULT(#i, x); \ } while (0) - /* Monetary information */ - RESULT_STRING(int_curr_symbol); - RESULT_STRING(currency_symbol); - RESULT_STRING(mon_decimal_point); - RESULT_STRING(mon_thousands_sep); + /* Monetary information: LC_MONETARY encoding */ + if (locale_decode_monetary(result, l) < 0) { + goto failed; + } x = copy_grouping(l->mon_grouping); RESULT("mon_grouping", x); @@ -190,7 +265,7 @@ PyLocale_localeconv(PyObject* self) RESULT_INT(p_sign_posn); RESULT_INT(n_sign_posn); - /* Numeric information */ + /* Numeric information: LC_NUMERIC encoding */ PyObject *decimal_point, *thousands_sep; const char *grouping; if (_Py_GetLocaleconvNumeric(&decimal_point, @@ -220,6 +295,10 @@ PyLocale_localeconv(PyObject* self) failed: Py_XDECREF(result); return NULL; + +#undef RESULT +#undef RESULT_STRING +#undef RESULT_INT } #if defined(HAVE_WCSCOLL) diff --git a/Python/fileutils.c b/Python/fileutils.c index 306838ecce44d7..d1a9ca03a1348a 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1687,7 +1687,7 @@ _Py_GetLocaleconvNumeric(PyObject **decimal_point, PyObject **thousands_sep, if (change_locale) { oldloc = setlocale(LC_CTYPE, NULL); if (!oldloc) { - PyErr_SetString(PyExc_RuntimeWarning, "faild to get LC_CTYPE locale"); + PyErr_SetString(PyExc_RuntimeWarning, "failed to get LC_CTYPE locale"); return -1; } @@ -1703,7 +1703,7 @@ _Py_GetLocaleconvNumeric(PyObject **decimal_point, PyObject **thousands_sep, } if (loc != NULL) { - /* Only set the locale temporarilty the LC_CTYPE locale + /* Only set the locale temporarily the LC_CTYPE locale if LC_NUMERIC locale is different than LC_CTYPE locale and decimal_point and/or thousands_sep are non-ASCII or longer than 1 byte */ diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c index d6772c593877cd..c9a2c99dd2570e 100644 --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -397,9 +397,10 @@ typedef struct { PyObject *decimal_point; PyObject *thousands_sep; const char *grouping; + char *grouping_buffer; } LocaleInfo; -#define STATIC_LOCALE_INFO_INIT {0, 0, 0} +#define STATIC_LOCALE_INFO_INIT {0, 0, 0, 0} /* describes the layout for an integer, see the comment in calc_number_widths() for details */ @@ -708,11 +709,22 @@ get_locale_info(enum LocaleType type, LocaleInfo *locale_info) { switch (type) { case LT_CURRENT_LOCALE: { + const char *grouping; if (_Py_GetLocaleconvNumeric(&locale_info->decimal_point, &locale_info->thousands_sep, - &locale_info->grouping) < 0) { + &grouping) < 0) { return -1; } + + /* localeconv() grouping can become a dangling pointer or point + to a different string if another thread calls localeconv() during + the string formatting. Copy the string to avoid this risk. */ + locale_info->grouping_buffer = _PyMem_Strdup(grouping); + if (locale_info->grouping_buffer == NULL) { + PyErr_NoMemory(); + return -1; + } + locale_info->grouping = locale_info->grouping_buffer; break; } case LT_DEFAULT_LOCALE: @@ -746,6 +758,7 @@ free_locale_info(LocaleInfo *locale_info) { Py_XDECREF(locale_info->decimal_point); Py_XDECREF(locale_info->thousands_sep); + PyMem_Free(locale_info->grouping_buffer); } /************************************************************************/ From 7af2144e558a0268b1aa20bb88046716c89f987d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 Nov 2018 00:48:42 -0800 Subject: [PATCH 2006/2287] bpo-35221: Additional hint that the placeholder is to be replaced. (GH-10604) (GH-10630) (cherry picked from commit d936a8f8e0964de1147656f1435532f0170f8b6c) Co-authored-by: Julien Palard --- Doc/using/venv-create.inc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/using/venv-create.inc b/Doc/using/venv-create.inc index 4c7795ad801964..7e8ae4a85f8af7 100644 --- a/Doc/using/venv-create.inc +++ b/Doc/using/venv-create.inc @@ -87,7 +87,8 @@ path. Once a virtual environment has been created, it can be "activated" using a script in the virtual environment's binary directory. The invocation of the -script is platform-specific: +script is platform-specific (`` must be replaced by the path of the +directory containing the virtual environment): +-------------+-----------------+-----------------------------------------+ | Platform | Shell | Command to activate virtual environment | From 27c16e33b1acac55641a27faa5a11508ee605adc Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 Nov 2018 04:51:26 -0800 Subject: [PATCH 2007/2287] bpo-35035: Rename email.utils documentation to email.utils.rst (GH-10023) I'll watch for 404 on the old URL and will setup an HTTP redirection if needed. (cherry picked from commit 361e8683e7340c600b22f4a514b81448ccec66dc) Co-authored-by: Zhiming Wang --- Doc/library/email.rst | 2 +- Doc/library/{email.util.rst => email.utils.rst} | 0 .../next/Documentation/2018-10-21-02-20-36.bpo-35035.4zBObK.rst | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) rename Doc/library/{email.util.rst => email.utils.rst} (100%) create mode 100644 Misc/NEWS.d/next/Documentation/2018-10-21-02-20-36.bpo-35035.4zBObK.rst diff --git a/Doc/library/email.rst b/Doc/library/email.rst index 07d455ba39d3cc..fae99cf3e6abbe 100644 --- a/Doc/library/email.rst +++ b/Doc/library/email.rst @@ -126,7 +126,7 @@ Legacy API: email.header.rst email.charset.rst email.encoders.rst - email.util.rst + email.utils.rst email.iterators.rst diff --git a/Doc/library/email.util.rst b/Doc/library/email.utils.rst similarity index 100% rename from Doc/library/email.util.rst rename to Doc/library/email.utils.rst diff --git a/Misc/NEWS.d/next/Documentation/2018-10-21-02-20-36.bpo-35035.4zBObK.rst b/Misc/NEWS.d/next/Documentation/2018-10-21-02-20-36.bpo-35035.4zBObK.rst new file mode 100644 index 00000000000000..46436f1b979b86 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-10-21-02-20-36.bpo-35035.4zBObK.rst @@ -0,0 +1 @@ +Rename documentation for :mod:`email.utils` to ``email.utils.rst``. From c487cf9261c61f0db4e5d1df3c83a60384b330db Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 21 Nov 2018 14:46:57 -0800 Subject: [PATCH 2008/2287] bpo-31146: Don't fallback switcher to english on not-yet pusblished languages. (GH-10558) (cherry picked from commit 6b73bb523a176123a819e4ebac3727d31d861515) Co-authored-by: Julien Palard --- Doc/tools/static/switchers.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Doc/tools/static/switchers.js b/Doc/tools/static/switchers.js index d885ff2bbf2166..20dad93d6a5edf 100644 --- a/Doc/tools/static/switchers.js +++ b/Doc/tools/static/switchers.js @@ -49,6 +49,12 @@ else buf.push(''); }); + if (!(current_language in all_languages)) { + // In case we're browsing a language that is not yet in all_languages. + buf.push(''); + all_languages[current_language] = current_language; + } buf.push(''); return buf.join(''); } From 0c15e508baec7e542933db2b31ea950a646cd968 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 22 Nov 2018 06:25:25 -0800 Subject: [PATCH 2009/2287] bpo-24658: os.read() reuses _PY_READ_MAX (GH-10657) os_read_impl() now also truncates the size to _PY_READ_MAX on macOS, to avoid to allocate a larger buffer even if _Py_read() is limited to _PY_READ_MAX bytes (ex: INT_MAX on macOS). (cherry picked from commit 9a0d7a7648547ffb77144bf2480155f6d7940dea) Co-authored-by: Victor Stinner --- Modules/posixmodule.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index f5642d26729924..b7091ca4c2346f 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -7912,11 +7912,7 @@ os_read_impl(PyObject *module, int fd, Py_ssize_t length) return posix_error(); } -#ifdef MS_WINDOWS - /* On Windows, the count parameter of read() is an int */ - if (length > INT_MAX) - length = INT_MAX; -#endif + length = Py_MIN(length, _PY_READ_MAX); buffer = PyBytes_FromStringAndSize((char *)NULL, length); if (buffer == NULL) From c9b3fc6b59b625c36c31ad437253e7140938af1a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 22 Nov 2018 17:40:53 +0100 Subject: [PATCH 2010/2287] bpo-9263: _PyObject_Dump() detects freed memory (GH-10061) (GH-10662) (GH-10663) * bpo-9263: _PyObject_Dump() detects freed memory (GH-10061) _PyObject_Dump() now uses an heuristic to check if the object memory has been freed: log "" in that case. The heuristic rely on the debug hooks on Python memory allocators which fills the memory with DEADBYTE (0xDB) when memory is deallocated. Use PYTHONMALLOC=debug to always enable these debug hooks. (cherry picked from commit 82af0b63b07aa8d92b50098e382b458143cfc677) * bpo-9263: Fix _PyObject_Dump() for freed object (#10661) If _PyObject_Dump() detects that the object is freed, don't try to dump it (exit immediately). Enhance also _PyObject_IsFreed(): it now detects if the pointer itself looks like freed memory. (cherry picked from commit 2cf5d32fd9e61488e8b0be55a2e92a752ba8b06b) (cherry picked from commit 95036ea25d47f0081bda2ba96ea327f3375cb6a4) --- Include/object.h | 1 + Include/pymem.h | 4 ++- Objects/object.c | 85 +++++++++++++++++++++++++++++++--------------- Objects/obmalloc.c | 17 ++++++++++ 4 files changed, 79 insertions(+), 28 deletions(-) diff --git a/Include/object.h b/Include/object.h index 63e37b8d33a68c..deac94097244f8 100644 --- a/Include/object.h +++ b/Include/object.h @@ -520,6 +520,7 @@ struct _Py_Identifier; PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int); PyAPI_FUNC(void) _Py_BreakPoint(void); PyAPI_FUNC(void) _PyObject_Dump(PyObject *); +PyAPI_FUNC(int) _PyObject_IsFreed(PyObject *); #endif PyAPI_FUNC(PyObject *) PyObject_Repr(PyObject *); PyAPI_FUNC(PyObject *) PyObject_Str(PyObject *); diff --git a/Include/pymem.h b/Include/pymem.h index a7eb4d2e59439e..a9f0186bd972fb 100644 --- a/Include/pymem.h +++ b/Include/pymem.h @@ -59,7 +59,9 @@ PyAPI_FUNC(int) _PyTraceMalloc_Untrack( PyAPI_FUNC(PyObject*) _PyTraceMalloc_GetTraceback( _PyTraceMalloc_domain_t domain, uintptr_t ptr); -#endif /* !Py_LIMITED_API */ + +PyAPI_FUNC(int) _PyMem_IsFreed(void *ptr, size_t size); +#endif /* !defined(Py_LIMITED_API) */ /* BEWARE: diff --git a/Objects/object.c b/Objects/object.c index fdd41a61681f64..e1a0569ab9f14f 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -422,40 +422,71 @@ _Py_BreakPoint(void) } +/* Heuristic checking if the object memory has been deallocated. + Rely on the debug hooks on Python memory allocators which fills the memory + with DEADBYTE (0xDB) when memory is deallocated. + + The function can be used to prevent segmentation fault on dereferencing + pointers like 0xdbdbdbdbdbdbdbdb. Such pointer is very unlikely to be mapped + in memory. */ +int +_PyObject_IsFreed(PyObject *op) +{ + uintptr_t ptr = (uintptr_t)op; + if (_PyMem_IsFreed(&ptr, sizeof(ptr))) { + return 1; + } + int freed = _PyMem_IsFreed(&op->ob_type, sizeof(op->ob_type)); + /* ignore op->ob_ref: the value can have be modified + by Py_INCREF() and Py_DECREF(). */ +#ifdef Py_TRACE_REFS + freed &= _PyMem_IsFreed(&op->_ob_next, sizeof(op->_ob_next)); + freed &= _PyMem_IsFreed(&op->_ob_prev, sizeof(op->_ob_prev)); +#endif + return freed; +} + + /* For debugging convenience. See Misc/gdbinit for some useful gdb hooks */ void _PyObject_Dump(PyObject* op) { - if (op == NULL) - fprintf(stderr, "NULL\n"); - else { -#ifdef WITH_THREAD - PyGILState_STATE gil; -#endif - PyObject *error_type, *error_value, *error_traceback; + if (op == NULL) { + fprintf(stderr, "\n"); + fflush(stderr); + return; + } - fprintf(stderr, "object : "); -#ifdef WITH_THREAD - gil = PyGILState_Ensure(); -#endif + if (_PyObject_IsFreed(op)) { + /* It seems like the object memory has been freed: + don't access it to prevent a segmentation fault. */ + fprintf(stderr, "\n"); + return; + } - PyErr_Fetch(&error_type, &error_value, &error_traceback); - (void)PyObject_Print(op, stderr, 0); - PyErr_Restore(error_type, error_value, error_traceback); + PyGILState_STATE gil; + PyObject *error_type, *error_value, *error_traceback; -#ifdef WITH_THREAD - PyGILState_Release(gil); -#endif - /* XXX(twouters) cast refcount to long until %zd is - universally available */ - fprintf(stderr, "\n" - "type : %s\n" - "refcount: %ld\n" - "address : %p\n", - Py_TYPE(op)==NULL ? "NULL" : Py_TYPE(op)->tp_name, - (long)op->ob_refcnt, - op); - } + fprintf(stderr, "object : "); + fflush(stderr); + gil = PyGILState_Ensure(); + + PyErr_Fetch(&error_type, &error_value, &error_traceback); + (void)PyObject_Print(op, stderr, 0); + fflush(stderr); + PyErr_Restore(error_type, error_value, error_traceback); + + PyGILState_Release(gil); + /* XXX(twouters) cast refcount to long until %zd is + universally available */ + fprintf(stderr, "\n" + "type : %s\n" + "refcount: %ld\n" + "address : %p\n", + Py_TYPE(op)==NULL ? "NULL" : Py_TYPE(op)->tp_name, + (long)op->ob_refcnt, + op); + fflush(stderr); } PyObject * diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index dca186801a6c78..d46d149311041f 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -1907,6 +1907,23 @@ _PyMem_DebugRawCalloc(void *ctx, size_t nelem, size_t elsize) return _PyMem_DebugRawAlloc(1, ctx, nbytes); } + +/* Heuristic checking if the memory has been freed. Rely on the debug hooks on + Python memory allocators which fills the memory with DEADBYTE (0xDB) when + memory is deallocated. */ +int +_PyMem_IsFreed(void *ptr, size_t size) +{ + unsigned char *bytes = ptr; + for (size_t i=0; i < size; i++) { + if (bytes[i] != DEADBYTE) { + return 0; + } + } + return 1; +} + + /* The debug free first checks the 2*SST bytes on each end for sanity (in particular, that the FORBIDDENBYTEs with the api ID are still intact). Then fills the original bytes with DEADBYTE. From 832da879a62a2cbda758edf1a357da63aad94276 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 23 Nov 2018 09:00:20 -0800 Subject: [PATCH 2011/2287] Linkify SMTP.quit() in smtplib documentation. (GH-9785) (cherry picked from commit ba57963a95a994947b8bec6869e810a74a751278) Co-authored-by: takey --- Doc/library/smtplib.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst index 6fb0934218a603..f59c1840941160 100644 --- a/Doc/library/smtplib.rst +++ b/Doc/library/smtplib.rst @@ -41,7 +41,7 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). the OS default behavior will be used. For normal use, you should only require the initialization/connect, - :meth:`sendmail`, and :meth:`~smtplib.quit` methods. + :meth:`sendmail`, and :meth:`SMTP.quit` methods. An example is included below. The :class:`SMTP` class supports the :keyword:`with` statement. When used From 879f5f3d9c1f5b66e2a080c712e2323e9c03d558 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 23 Nov 2018 09:53:17 -0800 Subject: [PATCH 2012/2287] bpo-29877: compileall: import ProcessPoolExecutor only when needed (GH-4856) Importing ProcessPoolExecutor may hang or cause an error when the import accesses urandom on a low resource platform https://bugs.python.org/issue29877 (cherry picked from commit 1d817e4c8259f49602eefe9729743f6d9d748e8d) Co-authored-by: Dustin Spicuzza --- Lib/compileall.py | 18 +++++++++++------- Lib/test/test_compileall.py | 8 ++++---- .../2017-12-16-11-40-52.bpo-29877.SfWhmz.rst | 2 ++ 3 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2017-12-16-11-40-52.bpo-29877.SfWhmz.rst diff --git a/Lib/compileall.py b/Lib/compileall.py index 1c9ceb693096a7..39210464b3422d 100644 --- a/Lib/compileall.py +++ b/Lib/compileall.py @@ -16,10 +16,6 @@ import py_compile import struct -try: - from concurrent.futures import ProcessPoolExecutor -except ImportError: - ProcessPoolExecutor = None from functools import partial __all__ = ["compile_dir","compile_file","compile_path"] @@ -68,9 +64,17 @@ def compile_dir(dir, maxlevels=10, ddir=None, force=False, rx=None, optimize: optimization level or -1 for level of the interpreter workers: maximum number of parallel workers """ - if workers is not None and workers < 0: - raise ValueError('workers must be greater or equal to 0') - + ProcessPoolExecutor = None + if workers is not None: + if workers < 0: + raise ValueError('workers must be greater or equal to 0') + elif workers != 1: + try: + # Only import when needed, as low resource platforms may + # fail to import it + from concurrent.futures import ProcessPoolExecutor + except ImportError: + workers = 1 files = _walk_dir(dir, quiet=quiet, maxlevels=maxlevels, ddir=ddir) success = True diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py index 2356efcaec78be..66a2004833fbf4 100644 --- a/Lib/test/test_compileall.py +++ b/Lib/test/test_compileall.py @@ -161,7 +161,7 @@ def test_compile_dir_pathlike(self): self.assertRegex(line, r'Listing ([^WindowsPath|PosixPath].*)') self.assertTrue(os.path.isfile(self.bc_path)) - @mock.patch('compileall.ProcessPoolExecutor') + @mock.patch('concurrent.futures.ProcessPoolExecutor') def test_compile_pool_called(self, pool_mock): compileall.compile_dir(self.directory, quiet=True, workers=5) self.assertTrue(pool_mock.called) @@ -171,19 +171,19 @@ def test_compile_workers_non_positive(self): "workers must be greater or equal to 0"): compileall.compile_dir(self.directory, workers=-1) - @mock.patch('compileall.ProcessPoolExecutor') + @mock.patch('concurrent.futures.ProcessPoolExecutor') def test_compile_workers_cpu_count(self, pool_mock): compileall.compile_dir(self.directory, quiet=True, workers=0) self.assertEqual(pool_mock.call_args[1]['max_workers'], None) - @mock.patch('compileall.ProcessPoolExecutor') + @mock.patch('concurrent.futures.ProcessPoolExecutor') @mock.patch('compileall.compile_file') def test_compile_one_worker(self, compile_file_mock, pool_mock): compileall.compile_dir(self.directory, quiet=True) self.assertFalse(pool_mock.called) self.assertTrue(compile_file_mock.called) - @mock.patch('compileall.ProcessPoolExecutor', new=None) + @mock.patch('concurrent.futures.ProcessPoolExecutor', new=None) @mock.patch('compileall.compile_file') def test_compile_missing_multiprocessing(self, compile_file_mock): compileall.compile_dir(self.directory, quiet=True, workers=5) diff --git a/Misc/NEWS.d/next/Library/2017-12-16-11-40-52.bpo-29877.SfWhmz.rst b/Misc/NEWS.d/next/Library/2017-12-16-11-40-52.bpo-29877.SfWhmz.rst new file mode 100644 index 00000000000000..cc09533b71247c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-12-16-11-40-52.bpo-29877.SfWhmz.rst @@ -0,0 +1,2 @@ +compileall: import ProcessPoolExecutor only when needed, preventing hangs on +low resource platforms From eef813b1091f4baaaa7411aa58d2746a9761ee99 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 23 Nov 2018 19:00:16 +0100 Subject: [PATCH 2013/2287] [3.7] bpo-35189: Retry fnctl calls on EINTR (GH-10413) (GH-10678) (GH-10685) * bpo-35189: Fix eintr_tester.py (GH-10637) Call setitimer() before each test method, instead of once per test case, to ensure that signals are sent in each test method. Previously, only the first method of a testcase class got signals. Changes: * Replace setUpClass() with setUp() and replace tearDownClass() with tearDown(). * tearDown() now ensures that at least one signal has been sent. * Replace support.run_unittest() with unittest.main() which has a nicer CLI and automatically discover test cases. (cherry picked from commit aac1f81eef971876ba5b1673db9ce6620311c469) * bpo-35189: Retry fnctl calls on EINTR (GH-10413) Modify the following fnctl function to retry if interrupted by a signal (EINTR): flock, lockf, fnctl. (cherry picked from commit b409ffa848b280c1db1b4f450bfae14f263099ac) Co-Authored-By: nierob (cherry picked from commit 56742f1eb05401a27499af0ccdcb4e4214859fd1) --- Lib/test/eintrdata/eintr_tester.py | 75 ++++++++++++++----- .../2018-11-09-13-35-36.bpo-35189.gog-sl.rst | 2 + Modules/fcntlmodule.c | 55 ++++++++------ 3 files changed, 89 insertions(+), 43 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-11-09-13-35-36.bpo-35189.gog-sl.rst diff --git a/Lib/test/eintrdata/eintr_tester.py b/Lib/test/eintrdata/eintr_tester.py index 1caeafe25d9b72..c2eaf0128a5f93 100644 --- a/Lib/test/eintrdata/eintr_tester.py +++ b/Lib/test/eintrdata/eintr_tester.py @@ -10,6 +10,7 @@ import contextlib import faulthandler +import fcntl import os import select import signal @@ -44,27 +45,32 @@ class EINTRBaseTest(unittest.TestCase): # sleep_time > signal_period sleep_time = 0.2 - @classmethod - def setUpClass(cls): - cls.orig_handler = signal.signal(signal.SIGALRM, lambda *args: None) - signal.setitimer(signal.ITIMER_REAL, cls.signal_delay, - cls.signal_period) + def sighandler(self, signum, frame): + self.signals += 1 - # Issue #25277: Use faulthandler to try to debug a hang on FreeBSD + def setUp(self): + self.signals = 0 + self.orig_handler = signal.signal(signal.SIGALRM, self.sighandler) + signal.setitimer(signal.ITIMER_REAL, self.signal_delay, + self.signal_period) + + # Use faulthandler as watchdog to debug when a test hangs + # (timeout of 10 minutes) if hasattr(faulthandler, 'dump_traceback_later'): faulthandler.dump_traceback_later(10 * 60, exit=True, file=sys.__stderr__) - @classmethod - def stop_alarm(cls): + @staticmethod + def stop_alarm(): signal.setitimer(signal.ITIMER_REAL, 0, 0) - @classmethod - def tearDownClass(cls): - cls.stop_alarm() - signal.signal(signal.SIGALRM, cls.orig_handler) + def tearDown(self): + self.stop_alarm() + signal.signal(signal.SIGALRM, self.orig_handler) if hasattr(faulthandler, 'cancel_dump_traceback_later'): faulthandler.cancel_dump_traceback_later() + # make sure that at least one signal has been received + self.assertGreater(self.signals, 0) def subprocess(self, *args, **kw): cmd_args = (sys.executable, '-c') + args @@ -481,14 +487,43 @@ def test_devpoll(self): self.assertGreaterEqual(dt, self.sleep_time) -def test_main(): - support.run_unittest( - OSEINTRTest, - SocketEINTRTest, - TimeEINTRTest, - SignalEINTRTest, - SelectEINTRTest) +class FNTLEINTRTest(EINTRBaseTest): + def _lock(self, lock_func, lock_name): + self.addCleanup(support.unlink, support.TESTFN) + code = '\n'.join(( + "import fcntl, time", + "with open('%s', 'wb') as f:" % support.TESTFN, + " fcntl.%s(f, fcntl.LOCK_EX)" % lock_name, + " time.sleep(%s)" % self.sleep_time)) + start_time = time.monotonic() + proc = self.subprocess(code) + with kill_on_error(proc): + with open(support.TESTFN, 'wb') as f: + while True: # synchronize the subprocess + dt = time.monotonic() - start_time + if dt > 60.0: + raise Exception("failed to sync child in %.1f sec" % dt) + try: + lock_func(f, fcntl.LOCK_EX | fcntl.LOCK_NB) + lock_func(f, fcntl.LOCK_UN) + time.sleep(0.01) + except BlockingIOError: + break + # the child locked the file just a moment ago for 'sleep_time' seconds + # that means that the lock below will block for 'sleep_time' minus some + # potential context switch delay + lock_func(f, fcntl.LOCK_EX) + dt = time.monotonic() - start_time + self.assertGreaterEqual(dt, self.sleep_time) + self.stop_alarm() + proc.wait() + + def test_lockf(self): + self._lock(fcntl.lockf, "lockf") + + def test_flock(self): + self._lock(fcntl.flock, "flock") if __name__ == "__main__": - test_main() + unittest.main() diff --git a/Misc/NEWS.d/next/Library/2018-11-09-13-35-36.bpo-35189.gog-sl.rst b/Misc/NEWS.d/next/Library/2018-11-09-13-35-36.bpo-35189.gog-sl.rst new file mode 100644 index 00000000000000..3408ca4eec4422 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-11-09-13-35-36.bpo-35189.gog-sl.rst @@ -0,0 +1,2 @@ +Modify the following fnctl function to retry if interrupted by a signal +(EINTR): flock, lockf, fnctl diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c index 8875b264b50754..b5eea4986e0a8d 100644 --- a/Modules/fcntlmodule.c +++ b/Modules/fcntlmodule.c @@ -64,6 +64,7 @@ fcntl_fcntl_impl(PyObject *module, int fd, int code, PyObject *arg) char *str; Py_ssize_t len; char buf[1024]; + int async_err = 0; if (arg != NULL) { int parse_result; @@ -75,12 +76,13 @@ fcntl_fcntl_impl(PyObject *module, int fd, int code, PyObject *arg) return NULL; } memcpy(buf, str, len); - Py_BEGIN_ALLOW_THREADS - ret = fcntl(fd, code, buf); - Py_END_ALLOW_THREADS + do { + Py_BEGIN_ALLOW_THREADS + ret = fcntl(fd, code, buf); + Py_END_ALLOW_THREADS + } while (ret == -1 && errno == EINTR && !(async_err = PyErr_CheckSignals())); if (ret < 0) { - PyErr_SetFromErrno(PyExc_IOError); - return NULL; + return !async_err ? PyErr_SetFromErrno(PyExc_IOError) : NULL; } return PyBytes_FromStringAndSize(buf, len); } @@ -95,12 +97,13 @@ fcntl_fcntl_impl(PyObject *module, int fd, int code, PyObject *arg) } } - Py_BEGIN_ALLOW_THREADS - ret = fcntl(fd, code, (int)int_arg); - Py_END_ALLOW_THREADS + do { + Py_BEGIN_ALLOW_THREADS + ret = fcntl(fd, code, (int)int_arg); + Py_END_ALLOW_THREADS + } while (ret == -1 && errno == EINTR && !(async_err = PyErr_CheckSignals())); if (ret < 0) { - PyErr_SetFromErrno(PyExc_IOError); - return NULL; + return !async_err ? PyErr_SetFromErrno(PyExc_IOError) : NULL; } return PyLong_FromLong((long)ret); } @@ -283,11 +286,14 @@ fcntl_flock_impl(PyObject *module, int fd, int code) /*[clinic end generated code: output=84059e2b37d2fc64 input=b70a0a41ca22a8a0]*/ { int ret; + int async_err = 0; #ifdef HAVE_FLOCK - Py_BEGIN_ALLOW_THREADS - ret = flock(fd, code); - Py_END_ALLOW_THREADS + do { + Py_BEGIN_ALLOW_THREADS + ret = flock(fd, code); + Py_END_ALLOW_THREADS + } while (ret == -1 && errno == EINTR && !(async_err = PyErr_CheckSignals())); #else #ifndef LOCK_SH @@ -310,14 +316,15 @@ fcntl_flock_impl(PyObject *module, int fd, int code) return NULL; } l.l_whence = l.l_start = l.l_len = 0; - Py_BEGIN_ALLOW_THREADS - ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l); - Py_END_ALLOW_THREADS + do { + Py_BEGIN_ALLOW_THREADS + ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l); + Py_END_ALLOW_THREADS + } while (ret == -1 && errno == EINTR && !(async_err = PyErr_CheckSignals())); } #endif /* HAVE_FLOCK */ if (ret < 0) { - PyErr_SetFromErrno(PyExc_IOError); - return NULL; + return !async_err ? PyErr_SetFromErrno(PyExc_IOError) : NULL; } Py_RETURN_NONE; } @@ -363,6 +370,7 @@ fcntl_lockf_impl(PyObject *module, int fd, int code, PyObject *lenobj, /*[clinic end generated code: output=4985e7a172e7461a input=3a5dc01b04371f1a]*/ { int ret; + int async_err = 0; #ifndef LOCK_SH #define LOCK_SH 1 /* shared lock */ @@ -407,13 +415,14 @@ fcntl_lockf_impl(PyObject *module, int fd, int code, PyObject *lenobj, return NULL; } l.l_whence = whence; - Py_BEGIN_ALLOW_THREADS - ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l); - Py_END_ALLOW_THREADS + do { + Py_BEGIN_ALLOW_THREADS + ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l); + Py_END_ALLOW_THREADS + } while (ret == -1 && errno == EINTR && !(async_err = PyErr_CheckSignals())); } if (ret < 0) { - PyErr_SetFromErrno(PyExc_IOError); - return NULL; + return !async_err ? PyErr_SetFromErrno(PyExc_IOError) : NULL; } Py_RETURN_NONE; } From cc0e0a2214d6515cf6ba4c7b164902a87e321b45 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 23 Nov 2018 19:02:26 +0100 Subject: [PATCH 2014/2287] bpo-34812: subprocess._args_from_interpreter_flags(): add isolated (GH-10675) (GH-10688) The "-I" command line option (run Python in isolated mode) and -X options (like -X faulthandler) are now also copied by the multiprocessing and distutils modules when spawning child processes. Previously, only -E and -s options (enabled by -I) were copied. subprocess._args_from_interpreter_flags() now copies the -I flag and options from sys._xoptions like -X dev. (cherry picked from commit 9de363271519e0616f4a7b59427057c4810d3acc) --- Lib/subprocess.py | 26 ++++++- Lib/test/test_support.py | 69 +++++++++++++++++-- .../2018-11-23-15-00-23.bpo-34812.84VQnb.rst | 4 ++ 3 files changed, 91 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2018-11-23-15-00-23.bpo-34812.84VQnb.rst diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 290ae44f03d761..8c3fa1bf9c8efd 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -232,15 +232,13 @@ def _optim_args_from_interpreter_flags(): def _args_from_interpreter_flags(): """Return a list of command-line arguments reproducing the current - settings in sys.flags and sys.warnoptions.""" + settings in sys.flags, sys.warnoptions and sys._xoptions.""" flag_opt_map = { 'debug': 'd', # 'inspect': 'i', # 'interactive': 'i', 'dont_write_bytecode': 'B', - 'no_user_site': 's', 'no_site': 'S', - 'ignore_environment': 'E', 'verbose': 'v', 'bytes_warning': 'b', 'quiet': 'q', @@ -251,8 +249,30 @@ def _args_from_interpreter_flags(): v = getattr(sys.flags, flag) if v > 0: args.append('-' + opt * v) + + if sys.flags.isolated: + args.append('-I') + else: + if sys.flags.ignore_environment: + args.append('-E') + if sys.flags.no_user_site: + args.append('-s') + for opt in sys.warnoptions: args.append('-W' + opt) + + # -X options + xoptions = getattr(sys, '_xoptions', {}) + for opt in ('faulthandler', 'tracemalloc', + 'showalloccount', 'showrefcount', 'utf8'): + if opt in xoptions: + value = xoptions[opt] + if value is True: + arg = opt + else: + arg = '%s=%s' % (opt, value) + args.extend(('-X', arg)) + return args diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index 45cdc94393eb64..adc59b6229989c 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -1,13 +1,14 @@ +import errno import importlib +import os import shutil +import socket import stat +import subprocess import sys -import os -import unittest -import socket import tempfile import textwrap -import errno +import unittest from test import support from test.support import script_helper @@ -394,6 +395,65 @@ def test_check__all__(self): self.assertRaises(AssertionError, support.check__all__, self, unittest) + def check_options(self, args, func, expected=None): + code = f'from test.support import {func}; print(repr({func}()))' + cmd = [sys.executable, *args, '-c', code] + env = {key: value for key, value in os.environ.items() + if not key.startswith('PYTHON')} + proc = subprocess.run(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL, + universal_newlines=True, + env=env) + if expected is None: + expected = args + self.assertEqual(proc.stdout.rstrip(), repr(expected)) + self.assertEqual(proc.returncode, 0) + + def test_args_from_interpreter_flags(self): + # Test test.support.args_from_interpreter_flags() + for opts in ( + # no option + [], + # single option + ['-B'], + ['-s'], + ['-S'], + ['-E'], + ['-v'], + ['-b'], + ['-q'], + ['-I'], + # same option multiple times + ['-bb'], + ['-vvv'], + # -W options + ['-Wignore'], + # -X options + ['-X', 'faulthandler'], + ['-X', 'showalloccount'], + ['-X', 'showrefcount'], + ['-X', 'tracemalloc'], + ['-X', 'tracemalloc=3'], + ): + with self.subTest(opts=opts): + self.check_options(opts, 'args_from_interpreter_flags') + + self.check_options(['-I', '-E', '-s'], 'args_from_interpreter_flags', + ['-I']) + + def test_optim_args_from_interpreter_flags(self): + # Test test.support.optim_args_from_interpreter_flags() + for opts in ( + # no option + [], + ['-O'], + ['-OO'], + ['-OOOO'], + ): + with self.subTest(opts=opts): + self.check_options(opts, 'optim_args_from_interpreter_flags') + def test_match_test(self): class Test: def __init__(self, test_id): @@ -485,7 +545,6 @@ def test_fd_count(self): # reap_threads # reap_children # strip_python_stderr - # args_from_interpreter_flags # can_symlink # skip_unless_symlink # SuppressCrashReport diff --git a/Misc/NEWS.d/next/Security/2018-11-23-15-00-23.bpo-34812.84VQnb.rst b/Misc/NEWS.d/next/Security/2018-11-23-15-00-23.bpo-34812.84VQnb.rst new file mode 100644 index 00000000000000..860404f019d2b3 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2018-11-23-15-00-23.bpo-34812.84VQnb.rst @@ -0,0 +1,4 @@ +The :option:`-I` command line option (run Python in isolated mode) is now +also copied by the :mod:`multiprocessing` and :mod:`distutils` modules when +spawning child processes. Previously, only :option:`-E` and :option:`-s` options +(enabled by :option:`-I`) were copied. From 8c70c08f0fb5795904442e95a2987ea18aed2899 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 23 Nov 2018 11:58:25 -0800 Subject: [PATCH 2015/2287] bpo-35303: Fix a reference leak in _operator.c's methodcaller_repr(). (GH-10689) (cherry picked from commit 5b83ef71d3060e1651d3680e805f13a1049c7d6d) Co-authored-by: Zackery Spytz --- Modules/_operator.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/_operator.c b/Modules/_operator.c index fb8eafc6793d70..af05f1c296bdb3 100644 --- a/Modules/_operator.c +++ b/Modules/_operator.c @@ -1057,6 +1057,7 @@ methodcaller_repr(methodcallerobject *mc) goto done; if (i >= numtotalargs) { i = -1; + Py_DECREF(onerepr); break; } PyTuple_SET_ITEM(argreprs, i, onerepr); From af009fbcdb00fffced653792eb7af6b72f2521e3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 25 Nov 2018 01:30:45 -0800 Subject: [PATCH 2016/2287] bpo-32035: Fix words about strings and bytes in zipfile documentation. (GH-10592) (cherry picked from commit 4bb186d7e253ad4def875305e06690181e923dfd) Co-authored-by: Serhiy Storchaka --- Doc/library/zipfile.rst | 24 ++++++++++-------------- Lib/zipfile.py | 4 ++-- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index b7563f662ddb92..b65b61d8dad829 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -360,13 +360,6 @@ ZipFile Objects the new entry. The archive must be open with mode ``'w'``, ``'x'`` or ``'a'``. - .. note:: - - There is no official file name encoding for ZIP files. If you have unicode file - names, you must convert them to byte strings in your desired encoding before - passing them to :meth:`write`. WinZip interprets all file names as encoded in - CP437, also known as DOS Latin. - .. note:: Archive names should be relative to the archive root, that is, they should not @@ -385,7 +378,9 @@ ZipFile Objects .. method:: ZipFile.writestr(zinfo_or_arcname, data[, compress_type]) - Write the string *data* to the archive; *zinfo_or_arcname* is either the file + Write a file into the archive. The contents is *data*, which may be either + a :class:`str` or a :class:`bytes` instance; if it is a :class:`str`, + it is encoded as UTF-8 first. *zinfo_or_arcname* is either the file name it will be given in the archive, or a :class:`ZipInfo` instance. If it's an instance, at least the filename, date, and time must be given. If it's a name, the date and time is set to the current date and time. @@ -425,11 +420,11 @@ The following data attributes are also available: .. attribute:: ZipFile.comment - The comment text associated with the ZIP file. If assigning a comment to a + The comment associated with the ZIP file as a :class:`bytes` object. + If assigning a comment to a :class:`ZipFile` instance created with mode ``'w'``, ``'x'`` or ``'a'``, - this should be a - string no longer than 65535 bytes. Comments longer than this will be - truncated in the written archive when :meth:`close` is called. + it should be no longer than 65535 bytes. Comments longer than this will be + truncated. .. _pyzipfile-objects: @@ -583,13 +578,14 @@ Instances have the following methods and attributes: .. attribute:: ZipInfo.comment - Comment for the individual archive member. + Comment for the individual archive member as a :class:`bytes` object. .. attribute:: ZipInfo.extra Expansion field data. The `PKZIP Application Note`_ contains - some comments on the internal structure of the data contained in this string. + some comments on the internal structure of the data contained in this + :class:`bytes` object. .. attribute:: ZipInfo.create_system diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 5bb35870a68970..edde0c5fd4a59f 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -405,7 +405,7 @@ def __repr__(self): return ''.join(result) def FileHeader(self, zip64=None): - """Return the per-file header as a string.""" + """Return the per-file header as a bytes object.""" dt = self.date_time dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2] dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2) @@ -1333,7 +1333,7 @@ def comment(self, comment): self._didModify = True def read(self, name, pwd=None): - """Return file bytes (as a string) for name.""" + """Return file bytes for name.""" with self.open(name, "r", pwd) as fp: return fp.read() From 8c1592e53a8981451f59050198da34a584160b4e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 25 Nov 2018 12:50:46 -0800 Subject: [PATCH 2017/2287] closes bpo-35309: cpath should be capath (GH-10702) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 158695817d736df8b18682866033c87e46252309) Co-authored-by: Boštjan Mejak --- Lib/urllib/request.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 96921440edea11..d28f2f8369c746 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -199,7 +199,7 @@ def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, global _opener if cafile or capath or cadefault: import warnings - warnings.warn("cafile, cpath and cadefault are deprecated, use a " + warnings.warn("cafile, capath and cadefault are deprecated, use a " "custom context instead.", DeprecationWarning, 2) if context is not None: raise ValueError( From 6c12091ca67e8ec2960652ef7a763d0de772f799 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 25 Nov 2018 17:01:09 -0800 Subject: [PATCH 2018/2287] bpo-35300: Add usage note to the lru_cache() docs (GH-10707) (GH-10709) --- Doc/library/functools.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index b221a8584a12aa..41c06c647b7824 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -80,6 +80,11 @@ The :mod:`functools` module defines the following functions: The cache's size limit assures that the cache does not grow without bound on long-running processes such as web servers. + In general, the LRU cache should only be used when you want to reuse + previously computed values. Accordingly, it doesn't make sense to cache + functions with side-effects, functions that need to create distinct mutable + objects on each call, or impure functions such as time() or random(). + Example of an LRU cache for static web content:: @lru_cache(maxsize=32) From fc4a44b0c3a69390eca4680d89c2ae5fe967f882 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 26 Nov 2018 17:03:31 +0100 Subject: [PATCH 2019/2287] bpo-33954: Fix _PyUnicode_InsertThousandsGrouping() (GH-10623) (GH-10718) (GH-10720) Fix str.format(), float.__format__() and complex.__format__() methods for non-ASCII decimal point when using the "n" formatter. Rewrite _PyUnicode_InsertThousandsGrouping(): it now requires a _PyUnicodeWriter object for the buffer and a Python str object for digits. (cherry picked from commit 59423e3ddd736387cef8f7632c71954c1859bed0) (cherry picked from commit 6f5fa1b4be735159e964906ab608dc467476e47c) --- Include/unicodeobject.h | 6 +- .../2018-11-20-22-33-38.bpo-33954.RzSngM.rst | 3 + Objects/stringlib/localeutil.h | 168 +++--------- Objects/unicodeobject.c | 245 +++++++++++------- Python/formatter_unicode.c | 40 +-- 5 files changed, 215 insertions(+), 247 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-11-20-22-33-38.bpo-33954.RzSngM.rst diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index f498873870082f..c81a38181e4952 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -2143,10 +2143,10 @@ PyAPI_FUNC(PyObject *) _PyUnicode_XStrip( see Objects/stringlib/localeutil.h */ #ifndef Py_LIMITED_API PyAPI_FUNC(Py_ssize_t) _PyUnicode_InsertThousandsGrouping( - PyObject *unicode, - Py_ssize_t index, + _PyUnicodeWriter *writer, Py_ssize_t n_buffer, - void *digits, + PyObject *digits, + Py_ssize_t d_pos, Py_ssize_t n_digits, Py_ssize_t min_width, const char *grouping, diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-11-20-22-33-38.bpo-33954.RzSngM.rst b/Misc/NEWS.d/next/Core and Builtins/2018-11-20-22-33-38.bpo-33954.RzSngM.rst new file mode 100644 index 00000000000000..9bfbe1644e16ac --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-11-20-22-33-38.bpo-33954.RzSngM.rst @@ -0,0 +1,3 @@ +For :meth:`str.format`, :meth:`float.__format__` and +:meth:`complex.__format__` methods for non-ASCII decimal point when using +the "n" formatter. diff --git a/Objects/stringlib/localeutil.h b/Objects/stringlib/localeutil.h index df501ed05c7e97..31fed349caa57b 100644 --- a/Objects/stringlib/localeutil.h +++ b/Objects/stringlib/localeutil.h @@ -1,28 +1,24 @@ -/* stringlib: locale related helpers implementation */ - -#include - -#if !STRINGLIB_IS_UNICODE -# error "localeutil.h is specific to Unicode" -#endif +/* _PyUnicode_InsertThousandsGrouping() helper functions */ typedef struct { const char *grouping; char previous; Py_ssize_t i; /* Where we're currently pointing in grouping. */ -} STRINGLIB(GroupGenerator); +} GroupGenerator; + static void -STRINGLIB(GroupGenerator_init)(STRINGLIB(GroupGenerator) *self, const char *grouping) +GroupGenerator_init(GroupGenerator *self, const char *grouping) { self->grouping = grouping; self->i = 0; self->previous = 0; } + /* Returns the next grouping, or 0 to signify end. */ static Py_ssize_t -STRINGLIB(GroupGenerator_next)(STRINGLIB(GroupGenerator) *self) +GroupGenerator_next(GroupGenerator *self) { /* Note that we don't really do much error checking here. If a grouping string contains just CHAR_MAX, for example, then just @@ -43,138 +39,44 @@ STRINGLIB(GroupGenerator_next)(STRINGLIB(GroupGenerator) *self) } } + /* Fill in some digits, leading zeros, and thousands separator. All are optional, depending on when we're called. */ static void -STRINGLIB(fill)(STRINGLIB_CHAR **digits_end, STRINGLIB_CHAR **buffer_end, - Py_ssize_t n_chars, Py_ssize_t n_zeros, STRINGLIB_CHAR* thousands_sep, - Py_ssize_t thousands_sep_len) +InsertThousandsGrouping_fill(_PyUnicodeWriter *writer, Py_ssize_t *buffer_pos, + PyObject *digits, Py_ssize_t *digits_pos, + Py_ssize_t n_chars, Py_ssize_t n_zeros, + PyObject *thousands_sep, Py_ssize_t thousands_sep_len, + Py_UCS4 *maxchar) { - Py_ssize_t i; + if (!writer) { + /* if maxchar > 127, maxchar is already set */ + if (*maxchar == 127 && thousands_sep) { + Py_UCS4 maxchar2 = PyUnicode_MAX_CHAR_VALUE(thousands_sep); + *maxchar = Py_MAX(*maxchar, maxchar2); + } + return; + } if (thousands_sep) { - *buffer_end -= thousands_sep_len; + *buffer_pos -= thousands_sep_len; /* Copy the thousands_sep chars into the buffer. */ - memcpy(*buffer_end, thousands_sep, - thousands_sep_len * STRINGLIB_SIZEOF_CHAR); - } - - *buffer_end -= n_chars; - *digits_end -= n_chars; - memcpy(*buffer_end, *digits_end, n_chars * sizeof(STRINGLIB_CHAR)); - - *buffer_end -= n_zeros; - for (i = 0; i < n_zeros; i++) - (*buffer_end)[i] = '0'; -} - -/** - * InsertThousandsGrouping: - * @buffer: A pointer to the start of a string. - * @n_buffer: Number of characters in @buffer. - * @digits: A pointer to the digits we're reading from. If count - * is non-NULL, this is unused. - * @n_digits: The number of digits in the string, in which we want - * to put the grouping chars. - * @min_width: The minimum width of the digits in the output string. - * Output will be zero-padded on the left to fill. - * @grouping: see definition in localeconv(). - * @thousands_sep: see definition in localeconv(). - * - * There are 2 modes: counting and filling. If @buffer is NULL, - * we are in counting mode, else filling mode. - * If counting, the required buffer size is returned. - * If filling, we know the buffer will be large enough, so we don't - * need to pass in the buffer size. - * Inserts thousand grouping characters (as defined by grouping and - * thousands_sep) into the string between buffer and buffer+n_digits. - * - * Return value: 0 on error, else 1. Note that no error can occur if - * count is non-NULL. - * - * This name won't be used, the includer of this file should define - * it to be the actual function name, based on unicode or string. - * - * As closely as possible, this code mimics the logic in decimal.py's - _insert_thousands_sep(). - **/ -static Py_ssize_t -STRINGLIB(InsertThousandsGrouping)( - STRINGLIB_CHAR *buffer, - Py_ssize_t n_buffer, - STRINGLIB_CHAR *digits, - Py_ssize_t n_digits, - Py_ssize_t min_width, - const char *grouping, - STRINGLIB_CHAR *thousands_sep, - Py_ssize_t thousands_sep_len) -{ - Py_ssize_t count = 0; - Py_ssize_t n_zeros; - int loop_broken = 0; - int use_separator = 0; /* First time through, don't append the - separator. They only go between - groups. */ - STRINGLIB_CHAR *buffer_end = NULL; - STRINGLIB_CHAR *digits_end = NULL; - Py_ssize_t l; - Py_ssize_t n_chars; - Py_ssize_t remaining = n_digits; /* Number of chars remaining to - be looked at */ - /* A generator that returns all of the grouping widths, until it - returns 0. */ - STRINGLIB(GroupGenerator) groupgen; - STRINGLIB(GroupGenerator_init)(&groupgen, grouping); - - if (buffer) { - buffer_end = buffer + n_buffer; - digits_end = digits + n_digits; - } - - while ((l = STRINGLIB(GroupGenerator_next)(&groupgen)) > 0) { - l = Py_MIN(l, Py_MAX(Py_MAX(remaining, min_width), 1)); - n_zeros = Py_MAX(0, l - remaining); - n_chars = Py_MAX(0, Py_MIN(remaining, l)); - - /* Use n_zero zero's and n_chars chars */ - - /* Count only, don't do anything. */ - count += (use_separator ? thousands_sep_len : 0) + n_zeros + n_chars; - - if (buffer) { - /* Copy into the output buffer. */ - STRINGLIB(fill)(&digits_end, &buffer_end, n_chars, n_zeros, - use_separator ? thousands_sep : NULL, thousands_sep_len); - } - - /* Use a separator next time. */ - use_separator = 1; - - remaining -= n_chars; - min_width -= l; - - if (remaining <= 0 && min_width <= 0) { - loop_broken = 1; - break; - } - min_width -= thousands_sep_len; + _PyUnicode_FastCopyCharacters(writer->buffer, *buffer_pos, + thousands_sep, 0, + thousands_sep_len); } - if (!loop_broken) { - /* We left the loop without using a break statement. */ - l = Py_MAX(Py_MAX(remaining, min_width), 1); - n_zeros = Py_MAX(0, l - remaining); - n_chars = Py_MAX(0, Py_MIN(remaining, l)); - - /* Use n_zero zero's and n_chars chars */ - count += (use_separator ? thousands_sep_len : 0) + n_zeros + n_chars; - if (buffer) { - /* Copy into the output buffer. */ - STRINGLIB(fill)(&digits_end, &buffer_end, n_chars, n_zeros, - use_separator ? thousands_sep : NULL, thousands_sep_len); - } + *buffer_pos -= n_chars; + *digits_pos -= n_chars; + _PyUnicode_FastCopyCharacters(writer->buffer, *buffer_pos, + digits, *digits_pos, + n_chars); + + if (n_zeros) { + *buffer_pos -= n_zeros; + enum PyUnicode_Kind kind = PyUnicode_KIND(writer->buffer); + void *data = PyUnicode_DATA(writer->buffer); + FILL(kind, data, '0', *buffer_pos, n_zeros); } - return count; } - diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 1f342bd199c788..6bfcddaa64e444 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -203,6 +203,31 @@ static PyObject *unicode_empty = NULL; return unicode_empty; \ } while (0) +#define FILL(kind, data, value, start, length) \ + do { \ + Py_ssize_t i_ = 0; \ + assert(kind != PyUnicode_WCHAR_KIND); \ + switch ((kind)) { \ + case PyUnicode_1BYTE_KIND: { \ + unsigned char * to_ = (unsigned char *)((data)) + (start); \ + memset(to_, (unsigned char)value, (length)); \ + break; \ + } \ + case PyUnicode_2BYTE_KIND: { \ + Py_UCS2 * to_ = (Py_UCS2 *)((data)) + (start); \ + for (; i_ < (length); ++i_, ++to_) *to_ = (value); \ + break; \ + } \ + case PyUnicode_4BYTE_KIND: { \ + Py_UCS4 * to_ = (Py_UCS4 *)((data)) + (start); \ + for (; i_ < (length); ++i_, ++to_) *to_ = (value); \ + break; \ + } \ + default: assert(0); \ + } \ + } while (0) + + /* Forward declaration */ static inline int _PyUnicodeWriter_WriteCharInline(_PyUnicodeWriter *writer, Py_UCS4 ch); @@ -779,7 +804,6 @@ ensure_unicode(PyObject *obj) #include "stringlib/count.h" #include "stringlib/find.h" #include "stringlib/find_max_char.h" -#include "stringlib/localeutil.h" #include "stringlib/undef.h" #include "stringlib/ucs1lib.h" @@ -790,7 +814,6 @@ ensure_unicode(PyObject *obj) #include "stringlib/find.h" #include "stringlib/replace.h" #include "stringlib/find_max_char.h" -#include "stringlib/localeutil.h" #include "stringlib/undef.h" #include "stringlib/ucs2lib.h" @@ -801,7 +824,6 @@ ensure_unicode(PyObject *obj) #include "stringlib/find.h" #include "stringlib/replace.h" #include "stringlib/find_max_char.h" -#include "stringlib/localeutil.h" #include "stringlib/undef.h" #include "stringlib/ucs4lib.h" @@ -812,7 +834,6 @@ ensure_unicode(PyObject *obj) #include "stringlib/find.h" #include "stringlib/replace.h" #include "stringlib/find_max_char.h" -#include "stringlib/localeutil.h" #include "stringlib/undef.h" #include "stringlib/unicodedefs.h" @@ -9407,87 +9428,149 @@ any_find_slice(PyObject* s1, PyObject* s2, return result; } +/* _PyUnicode_InsertThousandsGrouping() helper functions */ +#include "stringlib/localeutil.h" + +/** + * InsertThousandsGrouping: + * @writer: Unicode writer. + * @n_buffer: Number of characters in @buffer. + * @digits: Digits we're reading from. If count is non-NULL, this is unused. + * @d_pos: Start of digits string. + * @n_digits: The number of digits in the string, in which we want + * to put the grouping chars. + * @min_width: The minimum width of the digits in the output string. + * Output will be zero-padded on the left to fill. + * @grouping: see definition in localeconv(). + * @thousands_sep: see definition in localeconv(). + * + * There are 2 modes: counting and filling. If @writer is NULL, + * we are in counting mode, else filling mode. + * If counting, the required buffer size is returned. + * If filling, we know the buffer will be large enough, so we don't + * need to pass in the buffer size. + * Inserts thousand grouping characters (as defined by grouping and + * thousands_sep) into @writer. + * + * Return value: -1 on error, number of characters otherwise. + **/ Py_ssize_t _PyUnicode_InsertThousandsGrouping( - PyObject *unicode, Py_ssize_t index, + _PyUnicodeWriter *writer, Py_ssize_t n_buffer, - void *digits, Py_ssize_t n_digits, + PyObject *digits, + Py_ssize_t d_pos, + Py_ssize_t n_digits, Py_ssize_t min_width, - const char *grouping, PyObject *thousands_sep, + const char *grouping, + PyObject *thousands_sep, Py_UCS4 *maxchar) { - unsigned int kind, thousands_sep_kind; - char *data, *thousands_sep_data; - Py_ssize_t thousands_sep_len; - Py_ssize_t len; - - if (unicode != NULL) { - kind = PyUnicode_KIND(unicode); - data = (char *) PyUnicode_DATA(unicode) + index * kind; + if (writer) { + assert(digits != NULL); + assert(maxchar == NULL); } else { - kind = PyUnicode_1BYTE_KIND; - data = NULL; - } - thousands_sep_kind = PyUnicode_KIND(thousands_sep); - thousands_sep_data = PyUnicode_DATA(thousands_sep); - thousands_sep_len = PyUnicode_GET_LENGTH(thousands_sep); - if (unicode != NULL && thousands_sep_kind != kind) { - if (thousands_sep_kind < kind) { - thousands_sep_data = _PyUnicode_AsKind(thousands_sep, kind); - if (!thousands_sep_data) - return -1; - } - else { - data = _PyUnicode_AsKind(unicode, thousands_sep_kind); - if (!data) - return -1; - } + assert(digits == NULL); + assert(maxchar != NULL); } + assert(0 <= d_pos); + assert(0 <= n_digits); + assert(0 <= min_width); + assert(grouping != NULL); - switch (kind) { - case PyUnicode_1BYTE_KIND: - if (unicode != NULL && PyUnicode_IS_ASCII(unicode)) - len = asciilib_InsertThousandsGrouping( - (Py_UCS1 *) data, n_buffer, (Py_UCS1 *) digits, n_digits, - min_width, grouping, - (Py_UCS1 *) thousands_sep_data, thousands_sep_len); - else - len = ucs1lib_InsertThousandsGrouping( - (Py_UCS1*)data, n_buffer, (Py_UCS1*)digits, n_digits, - min_width, grouping, - (Py_UCS1 *) thousands_sep_data, thousands_sep_len); - break; - case PyUnicode_2BYTE_KIND: - len = ucs2lib_InsertThousandsGrouping( - (Py_UCS2 *) data, n_buffer, (Py_UCS2 *) digits, n_digits, - min_width, grouping, - (Py_UCS2 *) thousands_sep_data, thousands_sep_len); - break; - case PyUnicode_4BYTE_KIND: - len = ucs4lib_InsertThousandsGrouping( - (Py_UCS4 *) data, n_buffer, (Py_UCS4 *) digits, n_digits, - min_width, grouping, - (Py_UCS4 *) thousands_sep_data, thousands_sep_len); - break; - default: - assert(0); + if (digits != NULL) { + if (PyUnicode_READY(digits) == -1) { + return -1; + } + } + if (PyUnicode_READY(thousands_sep) == -1) { return -1; } - if (unicode != NULL && thousands_sep_kind != kind) { - if (thousands_sep_kind < kind) - PyMem_Free(thousands_sep_data); - else - PyMem_Free(data); + + Py_ssize_t count = 0; + Py_ssize_t n_zeros; + int loop_broken = 0; + int use_separator = 0; /* First time through, don't append the + separator. They only go between + groups. */ + Py_ssize_t buffer_pos; + Py_ssize_t digits_pos; + Py_ssize_t len; + Py_ssize_t n_chars; + Py_ssize_t remaining = n_digits; /* Number of chars remaining to + be looked at */ + /* A generator that returns all of the grouping widths, until it + returns 0. */ + GroupGenerator groupgen; + GroupGenerator_init(&groupgen, grouping); + const Py_ssize_t thousands_sep_len = PyUnicode_GET_LENGTH(thousands_sep); + + /* if digits are not grouped, thousands separator + should be an empty string */ + assert(!(grouping[0] == CHAR_MAX && thousands_sep_len != 0)); + + digits_pos = d_pos + n_digits; + if (writer) { + buffer_pos = writer->pos + n_buffer; + assert(buffer_pos <= PyUnicode_GET_LENGTH(writer->buffer)); + assert(digits_pos <= PyUnicode_GET_LENGTH(digits)); } - if (unicode == NULL) { + else { + buffer_pos = n_buffer; + } + + if (!writer) { *maxchar = 127; - if (len != n_digits) { - *maxchar = Py_MAX(*maxchar, - PyUnicode_MAX_CHAR_VALUE(thousands_sep)); + } + + while ((len = GroupGenerator_next(&groupgen)) > 0) { + len = Py_MIN(len, Py_MAX(Py_MAX(remaining, min_width), 1)); + n_zeros = Py_MAX(0, len - remaining); + n_chars = Py_MAX(0, Py_MIN(remaining, len)); + + /* Use n_zero zero's and n_chars chars */ + + /* Count only, don't do anything. */ + count += (use_separator ? thousands_sep_len : 0) + n_zeros + n_chars; + + /* Copy into the writer. */ + InsertThousandsGrouping_fill(writer, &buffer_pos, + digits, &digits_pos, + n_chars, n_zeros, + use_separator ? thousands_sep : NULL, + thousands_sep_len, maxchar); + + /* Use a separator next time. */ + use_separator = 1; + + remaining -= n_chars; + min_width -= len; + + if (remaining <= 0 && min_width <= 0) { + loop_broken = 1; + break; } + min_width -= thousands_sep_len; + } + if (!loop_broken) { + /* We left the loop without using a break statement. */ + + len = Py_MAX(Py_MAX(remaining, min_width), 1); + n_zeros = Py_MAX(0, len - remaining); + n_chars = Py_MAX(0, Py_MIN(remaining, len)); + + /* Use n_zero zero's and n_chars chars */ + count += (use_separator ? thousands_sep_len : 0) + n_zeros + n_chars; + + /* Copy into the writer. */ + InsertThousandsGrouping_fill(writer, &buffer_pos, + digits, &digits_pos, + n_chars, n_zeros, + use_separator ? thousands_sep : NULL, + thousands_sep_len, maxchar); } - return len; + return count; } @@ -10174,30 +10257,6 @@ _PyUnicode_JoinArray(PyObject *separator, PyObject **items, Py_ssize_t seqlen) return NULL; } -#define FILL(kind, data, value, start, length) \ - do { \ - Py_ssize_t i_ = 0; \ - assert(kind != PyUnicode_WCHAR_KIND); \ - switch ((kind)) { \ - case PyUnicode_1BYTE_KIND: { \ - unsigned char * to_ = (unsigned char *)((data)) + (start); \ - memset(to_, (unsigned char)value, (length)); \ - break; \ - } \ - case PyUnicode_2BYTE_KIND: { \ - Py_UCS2 * to_ = (Py_UCS2 *)((data)) + (start); \ - for (; i_ < (length); ++i_, ++to_) *to_ = (value); \ - break; \ - } \ - case PyUnicode_4BYTE_KIND: { \ - Py_UCS4 * to_ = (Py_UCS4 *)((data)) + (start); \ - for (; i_ < (length); ++i_, ++to_) *to_ = (value); \ - break; \ - } \ - default: assert(0); \ - } \ - } while (0) - void _PyUnicode_FastFill(PyObject *unicode, Py_ssize_t start, Py_ssize_t length, Py_UCS4 fill_char) diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c index c9a2c99dd2570e..4a38f7a305096f 100644 --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -462,7 +462,8 @@ parse_number(PyObject *s, Py_ssize_t pos, Py_ssize_t end, /* not all fields of format are used. for example, precision is unused. should this take discrete params in order to be more clear about what it does? or is passing a single format parameter easier - and more efficient enough to justify a little obfuscation? */ + and more efficient enough to justify a little obfuscation? + Return -1 on error. */ static Py_ssize_t calc_number_widths(NumberFieldWidths *spec, Py_ssize_t n_prefix, Py_UCS4 sign_char, PyObject *number, Py_ssize_t n_start, @@ -541,9 +542,12 @@ calc_number_widths(NumberFieldWidths *spec, Py_ssize_t n_prefix, Py_UCS4 grouping_maxchar; spec->n_grouped_digits = _PyUnicode_InsertThousandsGrouping( NULL, 0, - 0, NULL, - spec->n_digits, spec->n_min_width, + NULL, 0, spec->n_digits, + spec->n_min_width, locale->grouping, locale->thousands_sep, &grouping_maxchar); + if (spec->n_grouped_digits == -1) { + return -1; + } *maxchar = Py_MAX(*maxchar, grouping_maxchar); } @@ -637,26 +641,14 @@ fill_number(_PyUnicodeWriter *writer, const NumberFieldWidths *spec, /* Only for type 'c' special case, it has no digits. */ if (spec->n_digits != 0) { /* Fill the digits with InsertThousandsGrouping. */ - char *pdigits; - if (PyUnicode_READY(digits)) - return -1; - pdigits = PyUnicode_DATA(digits); - if (PyUnicode_KIND(digits) < kind) { - pdigits = _PyUnicode_AsKind(digits, kind); - if (pdigits == NULL) - return -1; - } r = _PyUnicode_InsertThousandsGrouping( - writer->buffer, writer->pos, - spec->n_grouped_digits, - pdigits + kind * d_pos, - spec->n_digits, spec->n_min_width, + writer, spec->n_grouped_digits, + digits, d_pos, spec->n_digits, + spec->n_min_width, locale->grouping, locale->thousands_sep, NULL); if (r == -1) return -1; assert(r == spec->n_grouped_digits); - if (PyUnicode_KIND(digits) < kind) - PyMem_Free(pdigits); d_pos += spec->n_digits; } if (toupper) { @@ -996,6 +988,9 @@ format_long_internal(PyObject *value, const InternalFormatSpec *format, n_total = calc_number_widths(&spec, n_prefix, sign_char, tmp, inumeric_chars, inumeric_chars + n_digits, n_remainder, 0, &locale, format, &maxchar); + if (n_total == -1) { + goto done; + } /* Allocate the memory. */ if (_PyUnicodeWriter_Prepare(writer, n_total, maxchar) == -1) @@ -1141,6 +1136,9 @@ format_float_internal(PyObject *value, n_total = calc_number_widths(&spec, 0, sign_char, unicode_tmp, index, index + n_digits, n_remainder, has_decimal, &locale, format, &maxchar); + if (n_total == -1) { + goto done; + } /* Allocate the memory. */ if (_PyUnicodeWriter_Prepare(writer, n_total, maxchar) == -1) @@ -1324,6 +1322,9 @@ format_complex_internal(PyObject *value, i_re, i_re + n_re_digits, n_re_remainder, re_has_decimal, &locale, &tmp_format, &maxchar); + if (n_re_total == -1) { + goto done; + } /* Same formatting, but always include a sign, unless the real part is * going to be omitted, in which case we use whatever sign convention was @@ -1334,6 +1335,9 @@ format_complex_internal(PyObject *value, i_im, i_im + n_im_digits, n_im_remainder, im_has_decimal, &locale, &tmp_format, &maxchar); + if (n_im_total == -1) { + goto done; + } if (skip_re) n_re_total = 0; From 7f93f93fa68f54c1bc128d58fa17536245396de3 Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Mon, 26 Nov 2018 18:16:13 +0100 Subject: [PATCH 2020/2287] [3.6] bpo-35255: Doc: Delete now useless Windows FAQ section (GH-10557) (GH-10725) (cherry picked from commit 5719f275b7153a00a800f5481271a6fc26659c65) Co-authored-by: Mathieu Dupuy https://bugs.python.org/issue35255 --- Doc/faq/windows.rst | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/Doc/faq/windows.rst b/Doc/faq/windows.rst index bcfd7f4f1fde22..772b8c2012c302 100644 --- a/Doc/faq/windows.rst +++ b/Doc/faq/windows.rst @@ -301,14 +301,3 @@ In 2.7 and 3.2, :func:`os.kill` is implemented similar to the above function, with the additional feature of being able to send :kbd:`Ctrl+C` and :kbd:`Ctrl+Break` to console subprocesses which are designed to handle those signals. See :func:`os.kill` for further details. - -How do I extract the downloaded documentation on Windows? ---------------------------------------------------------- - -Sometimes, when you download the documentation package to a Windows machine -using a web browser, the file extension of the saved file ends up being .EXE. -This is a mistake; the extension should be .TGZ. - -Simply rename the downloaded file to have the .TGZ extension, and WinZip will be -able to handle it. (If your copy of WinZip doesn't, get a newer one from -https://www.winzip.com.) From b59fc311609aadaafaae68240127b4997b85859d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 27 Nov 2018 04:01:00 -0800 Subject: [PATCH 2021/2287] bpo-35317: Fix mktime() error in test_email (GH-10721) Fix mktime() overflow error in test_email: run test_localtime_daylight_true_dst_true() and test_localtime_daylight_false_dst_true() with a specific timezone. (cherry picked from commit cfaafda8e3e19764682abb4bd4c574accb784c42) Co-authored-by: Victor Stinner --- Lib/test/test_email/test_utils.py | 2 ++ .../NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst diff --git a/Lib/test/test_email/test_utils.py b/Lib/test/test_email/test_utils.py index 6dcb3bbe7aab8c..4e3c3f3a195fc4 100644 --- a/Lib/test/test_email/test_utils.py +++ b/Lib/test/test_email/test_utils.py @@ -75,6 +75,7 @@ def test_localtime_daylight_false_dst_false(self): t2 = utils.localtime(t1) self.assertEqual(t1, t2) + @test.support.run_with_tz('Europe/Minsk') def test_localtime_daylight_true_dst_true(self): test.support.patch(self, time, 'daylight', True) t0 = datetime.datetime(2012, 3, 12, 1, 1) @@ -82,6 +83,7 @@ def test_localtime_daylight_true_dst_true(self): t2 = utils.localtime(t1) self.assertEqual(t1, t2) + @test.support.run_with_tz('Europe/Minsk') def test_localtime_daylight_false_dst_true(self): test.support.patch(self, time, 'daylight', False) t0 = datetime.datetime(2012, 3, 12, 1, 1) diff --git a/Misc/NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst b/Misc/NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst new file mode 100644 index 00000000000000..73a30f71927f1a --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst @@ -0,0 +1,3 @@ +Fix ``mktime()`` overflow error in ``test_email``: run +``test_localtime_daylight_true_dst_true()`` and +``test_localtime_daylight_false_dst_true()`` with a specific timezone. From 54fa83e0a3f3b077763cb50705d7a7dbe4a40a4a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 27 Nov 2018 14:30:55 +0100 Subject: [PATCH 2022/2287] bpo-33954: Rewrite FILL() macro of unicodeobject.c (GH-10740) Copy code from master: add assertions on start and value, replace 'i' iterator with 'end' pointer for the loop stop condition. _PyUnicode_FastFill(): fix type of 'data', it must not be constant, since data is modified by FILL(). --- Objects/unicodeobject.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 6bfcddaa64e444..29b019887ac0f9 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -205,22 +205,30 @@ static PyObject *unicode_empty = NULL; #define FILL(kind, data, value, start, length) \ do { \ - Py_ssize_t i_ = 0; \ + assert(0 <= start); \ assert(kind != PyUnicode_WCHAR_KIND); \ - switch ((kind)) { \ + switch (kind) { \ case PyUnicode_1BYTE_KIND: { \ - unsigned char * to_ = (unsigned char *)((data)) + (start); \ - memset(to_, (unsigned char)value, (length)); \ + assert(value <= 0xff); \ + Py_UCS1 ch = (unsigned char)value; \ + Py_UCS1 *to = (Py_UCS1 *)data + start; \ + memset(to, ch, length); \ break; \ } \ case PyUnicode_2BYTE_KIND: { \ - Py_UCS2 * to_ = (Py_UCS2 *)((data)) + (start); \ - for (; i_ < (length); ++i_, ++to_) *to_ = (value); \ + assert(value <= 0xffff); \ + Py_UCS2 ch = (Py_UCS2)value; \ + Py_UCS2 *to = (Py_UCS2 *)data + start; \ + const Py_UCS2 *end = to + length; \ + for (; to < end; ++to) *to = ch; \ break; \ } \ case PyUnicode_4BYTE_KIND: { \ - Py_UCS4 * to_ = (Py_UCS4 *)((data)) + (start); \ - for (; i_ < (length); ++i_, ++to_) *to_ = (value); \ + assert(value <= MAX_UNICODE); \ + Py_UCS4 ch = value; \ + Py_UCS4 * to = (Py_UCS4 *)data + start; \ + const Py_UCS4 *end = to + length; \ + for (; to < end; ++to) *to = ch; \ break; \ } \ default: assert(0); \ @@ -10262,7 +10270,7 @@ _PyUnicode_FastFill(PyObject *unicode, Py_ssize_t start, Py_ssize_t length, Py_UCS4 fill_char) { const enum PyUnicode_Kind kind = PyUnicode_KIND(unicode); - const void *data = PyUnicode_DATA(unicode); + void *data = PyUnicode_DATA(unicode); assert(PyUnicode_IS_READY(unicode)); assert(unicode_modifiable(unicode)); assert(fill_char <= PyUnicode_MAX_CHAR_VALUE(unicode)); From 29d2f3c47280f05795c9d4d70f4018cb1488f0ab Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 27 Nov 2018 20:38:36 +0200 Subject: [PATCH 2023/2287] [3.6] bpo-33029: Fix signatures of getter and setter functions. (GH-10746) (GH-10749) Fix also return type for few other functions (clear, releasebuffer). (cherry picked from commit d4f9cf5545d6d8844e0726552ef2e366f5cc3abd) --- Modules/_asynciomodule.c | 32 ++++++++++++++-------------- Modules/_collectionsmodule.c | 2 +- Modules/_csv.c | 10 ++++----- Modules/_ctypes/_ctypes.c | 34 +++++++++++++++--------------- Modules/_cursesmodule.c | 2 +- Modules/_io/bytesio.c | 2 +- Modules/_pickle.c | 16 +++++++------- Modules/_sqlite/connection.c | 7 +++--- Modules/_sqlite/row.c | 3 ++- Modules/_sre.c | 8 +++---- Modules/_testbuffer.c | 4 +--- Modules/_tkinter.c | 4 ++-- Modules/cjkcodecs/multibytecodec.c | 2 +- Modules/mmapmodule.c | 2 +- Modules/selectmodule.c | 6 +++--- Modules/xxsubtype.c | 2 +- Objects/descrobject.c | 14 ++++++------ Objects/exceptions.c | 30 ++++++++++++++------------ Objects/frameobject.c | 7 +++--- Objects/funcobject.c | 24 ++++++++++----------- Objects/genobject.c | 12 +++++------ Objects/memoryobject.c | 18 ++++++++-------- Python/traceback.c | 3 ++- 23 files changed, 125 insertions(+), 119 deletions(-) diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 2a6c16da85b41e..39786cc5f66460 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -625,7 +625,7 @@ _asyncio_Future_done_impl(FutureObj *self) } static PyObject * -FutureObj_get_blocking(FutureObj *fut) +FutureObj_get_blocking(FutureObj *fut, void *Py_UNUSED(ignored)) { if (fut->fut_blocking) { Py_RETURN_TRUE; @@ -636,7 +636,7 @@ FutureObj_get_blocking(FutureObj *fut) } static int -FutureObj_set_blocking(FutureObj *fut, PyObject *val) +FutureObj_set_blocking(FutureObj *fut, PyObject *val, void *Py_UNUSED(ignored)) { int is_true = PyObject_IsTrue(val); if (is_true < 0) { @@ -647,7 +647,7 @@ FutureObj_set_blocking(FutureObj *fut, PyObject *val) } static PyObject * -FutureObj_get_log_traceback(FutureObj *fut) +FutureObj_get_log_traceback(FutureObj *fut, void *Py_UNUSED(ignored)) { if (fut->fut_log_tb) { Py_RETURN_TRUE; @@ -658,7 +658,7 @@ FutureObj_get_log_traceback(FutureObj *fut) } static int -FutureObj_set_log_traceback(FutureObj *fut, PyObject *val) +FutureObj_set_log_traceback(FutureObj *fut, PyObject *val, void *Py_UNUSED(ignored)) { int is_true = PyObject_IsTrue(val); if (is_true < 0) { @@ -669,7 +669,7 @@ FutureObj_set_log_traceback(FutureObj *fut, PyObject *val) } static PyObject * -FutureObj_get_loop(FutureObj *fut) +FutureObj_get_loop(FutureObj *fut, void *Py_UNUSED(ignored)) { if (fut->fut_loop == NULL) { Py_RETURN_NONE; @@ -679,7 +679,7 @@ FutureObj_get_loop(FutureObj *fut) } static PyObject * -FutureObj_get_callbacks(FutureObj *fut) +FutureObj_get_callbacks(FutureObj *fut, void *Py_UNUSED(ignored)) { if (fut->fut_callbacks == NULL) { Py_RETURN_NONE; @@ -689,7 +689,7 @@ FutureObj_get_callbacks(FutureObj *fut) } static PyObject * -FutureObj_get_result(FutureObj *fut) +FutureObj_get_result(FutureObj *fut, void *Py_UNUSED(ignored)) { if (fut->fut_result == NULL) { Py_RETURN_NONE; @@ -699,7 +699,7 @@ FutureObj_get_result(FutureObj *fut) } static PyObject * -FutureObj_get_exception(FutureObj *fut) +FutureObj_get_exception(FutureObj *fut, void *Py_UNUSED(ignored)) { if (fut->fut_exception == NULL) { Py_RETURN_NONE; @@ -709,7 +709,7 @@ FutureObj_get_exception(FutureObj *fut) } static PyObject * -FutureObj_get_source_traceback(FutureObj *fut) +FutureObj_get_source_traceback(FutureObj *fut, void *Py_UNUSED(ignored)) { if (fut->fut_source_tb == NULL) { Py_RETURN_NONE; @@ -719,7 +719,7 @@ FutureObj_get_source_traceback(FutureObj *fut) } static PyObject * -FutureObj_get_state(FutureObj *fut) +FutureObj_get_state(FutureObj *fut, void *Py_UNUSED(ignored)) { _Py_IDENTIFIER(PENDING); _Py_IDENTIFIER(CANCELLED); @@ -1207,7 +1207,7 @@ TaskStepMethWrapper_traverse(TaskStepMethWrapper *o, } static PyObject * -TaskStepMethWrapper_get___self__(TaskStepMethWrapper *o) +TaskStepMethWrapper_get___self__(TaskStepMethWrapper *o, void *Py_UNUSED(ignored)) { if (o->sw_task) { Py_INCREF(o->sw_task); @@ -1387,7 +1387,7 @@ TaskObj_traverse(TaskObj *task, visitproc visit, void *arg) } static PyObject * -TaskObj_get_log_destroy_pending(TaskObj *task) +TaskObj_get_log_destroy_pending(TaskObj *task, void *Py_UNUSED(ignored)) { if (task->task_log_destroy_pending) { Py_RETURN_TRUE; @@ -1398,7 +1398,7 @@ TaskObj_get_log_destroy_pending(TaskObj *task) } static int -TaskObj_set_log_destroy_pending(TaskObj *task, PyObject *val) +TaskObj_set_log_destroy_pending(TaskObj *task, PyObject *val, void *Py_UNUSED(ignored)) { int is_true = PyObject_IsTrue(val); if (is_true < 0) { @@ -1409,7 +1409,7 @@ TaskObj_set_log_destroy_pending(TaskObj *task, PyObject *val) } static PyObject * -TaskObj_get_must_cancel(TaskObj *task) +TaskObj_get_must_cancel(TaskObj *task, void *Py_UNUSED(ignored)) { if (task->task_must_cancel) { Py_RETURN_TRUE; @@ -1420,7 +1420,7 @@ TaskObj_get_must_cancel(TaskObj *task) } static PyObject * -TaskObj_get_coro(TaskObj *task) +TaskObj_get_coro(TaskObj *task, void *Py_UNUSED(ignored)) { if (task->task_coro) { Py_INCREF(task->task_coro); @@ -1431,7 +1431,7 @@ TaskObj_get_coro(TaskObj *task) } static PyObject * -TaskObj_get_fut_waiter(TaskObj *task) +TaskObj_get_fut_waiter(TaskObj *task, void *Py_UNUSED(ignored)) { if (task->task_fut_waiter) { Py_INCREF(task->task_fut_waiter); diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 85037d00270329..4fbf3bdb1463e5 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1539,7 +1539,7 @@ deque_bool(dequeobject *deque) } static PyObject * -deque_get_maxlen(dequeobject *deque) +deque_get_maxlen(dequeobject *deque, void *Py_UNUSED(ignored)) { if (deque->maxlen < 0) Py_RETURN_NONE; diff --git a/Modules/_csv.c b/Modules/_csv.c index 5d0044a2377a80..5324fa6bb65783 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -160,31 +160,31 @@ get_nullchar_as_None(Py_UCS4 c) } static PyObject * -Dialect_get_lineterminator(DialectObj *self) +Dialect_get_lineterminator(DialectObj *self, void *Py_UNUSED(ignored)) { return get_string(self->lineterminator); } static PyObject * -Dialect_get_delimiter(DialectObj *self) +Dialect_get_delimiter(DialectObj *self, void *Py_UNUSED(ignored)) { return get_nullchar_as_None(self->delimiter); } static PyObject * -Dialect_get_escapechar(DialectObj *self) +Dialect_get_escapechar(DialectObj *self, void *Py_UNUSED(ignored)) { return get_nullchar_as_None(self->escapechar); } static PyObject * -Dialect_get_quotechar(DialectObj *self) +Dialect_get_quotechar(DialectObj *self, void *Py_UNUSED(ignored)) { return get_nullchar_as_None(self->quotechar); } static PyObject * -Dialect_get_quoting(DialectObj *self) +Dialect_get_quoting(DialectObj *self, void *Py_UNUSED(ignored)) { return PyLong_FromLong(self->quoting); } diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 69d73f5a958f0e..c5b499c7aac20c 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -1163,7 +1163,7 @@ PyTypeObject PyCPointerType_Type = { */ static int -CharArray_set_raw(CDataObject *self, PyObject *value) +CharArray_set_raw(CDataObject *self, PyObject *value, void *Py_UNUSED(ignored)) { char *ptr; Py_ssize_t size; @@ -1189,13 +1189,13 @@ CharArray_set_raw(CDataObject *self, PyObject *value) } static PyObject * -CharArray_get_raw(CDataObject *self) +CharArray_get_raw(CDataObject *self, void *Py_UNUSED(ignored)) { return PyBytes_FromStringAndSize(self->b_ptr, self->b_size); } static PyObject * -CharArray_get_value(CDataObject *self) +CharArray_get_value(CDataObject *self, void *Py_UNUSED(ignored)) { Py_ssize_t i; char *ptr = self->b_ptr; @@ -1206,7 +1206,7 @@ CharArray_get_value(CDataObject *self) } static int -CharArray_set_value(CDataObject *self, PyObject *value) +CharArray_set_value(CDataObject *self, PyObject *value, void *Py_UNUSED(ignored)) { char *ptr; Py_ssize_t size; @@ -1251,7 +1251,7 @@ static PyGetSetDef CharArray_getsets[] = { #ifdef CTYPES_UNICODE static PyObject * -WCharArray_get_value(CDataObject *self) +WCharArray_get_value(CDataObject *self, void *Py_UNUSED(ignored)) { Py_ssize_t i; wchar_t *ptr = (wchar_t *)self->b_ptr; @@ -1262,7 +1262,7 @@ WCharArray_get_value(CDataObject *self) } static int -WCharArray_set_value(CDataObject *self, PyObject *value) +WCharArray_set_value(CDataObject *self, PyObject *value, void *Py_UNUSED(ignored)) { Py_ssize_t result = 0; Py_UNICODE *wstr; @@ -3049,7 +3049,7 @@ GenericPyCData_new(PyTypeObject *type, PyObject *args, PyObject *kwds) */ static int -PyCFuncPtr_set_errcheck(PyCFuncPtrObject *self, PyObject *ob) +PyCFuncPtr_set_errcheck(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) { if (ob && !PyCallable_Check(ob)) { PyErr_SetString(PyExc_TypeError, @@ -3062,7 +3062,7 @@ PyCFuncPtr_set_errcheck(PyCFuncPtrObject *self, PyObject *ob) } static PyObject * -PyCFuncPtr_get_errcheck(PyCFuncPtrObject *self) +PyCFuncPtr_get_errcheck(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) { if (self->errcheck) { Py_INCREF(self->errcheck); @@ -3073,7 +3073,7 @@ PyCFuncPtr_get_errcheck(PyCFuncPtrObject *self) } static int -PyCFuncPtr_set_restype(PyCFuncPtrObject *self, PyObject *ob) +PyCFuncPtr_set_restype(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) { if (ob == NULL) { Py_CLEAR(self->restype); @@ -3094,7 +3094,7 @@ PyCFuncPtr_set_restype(PyCFuncPtrObject *self, PyObject *ob) } static PyObject * -PyCFuncPtr_get_restype(PyCFuncPtrObject *self) +PyCFuncPtr_get_restype(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) { StgDictObject *dict; if (self->restype) { @@ -3113,7 +3113,7 @@ PyCFuncPtr_get_restype(PyCFuncPtrObject *self) } static int -PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob) +PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) { PyObject *converters; @@ -3132,7 +3132,7 @@ PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob) } static PyObject * -PyCFuncPtr_get_argtypes(PyCFuncPtrObject *self) +PyCFuncPtr_get_argtypes(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) { StgDictObject *dict; if (self->argtypes) { @@ -4678,7 +4678,7 @@ PyCArrayType_from_ctype(PyObject *itemtype, Py_ssize_t length) */ static int -Simple_set_value(CDataObject *self, PyObject *value) +Simple_set_value(CDataObject *self, PyObject *value, void *Py_UNUSED(ignored)) { PyObject *result; StgDictObject *dict = PyObject_stgdict((PyObject *)self); @@ -4705,12 +4705,12 @@ Simple_init(CDataObject *self, PyObject *args, PyObject *kw) if (!PyArg_UnpackTuple(args, "__init__", 0, 1, &value)) return -1; if (value) - return Simple_set_value(self, value); + return Simple_set_value(self, value, NULL); return 0; } static PyObject * -Simple_get_value(CDataObject *self) +Simple_get_value(CDataObject *self, void *Py_UNUSED(ignored)) { StgDictObject *dict; dict = PyObject_stgdict((PyObject *)self); @@ -4733,7 +4733,7 @@ Simple_from_outparm(PyObject *self, PyObject *args) return self; } /* call stgdict->getfunc */ - return Simple_get_value((CDataObject *)self); + return Simple_get_value((CDataObject *)self, NULL); } static PyMethodDef Simple_methods[] = { @@ -4770,7 +4770,7 @@ Simple_repr(CDataObject *self) Py_TYPE(self)->tp_name, self); } - val = Simple_get_value(self); + val = Simple_get_value(self, NULL); if (val == NULL) return NULL; diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 4ac702aa2f828c..8b46466d6f0058 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -1976,7 +1976,7 @@ PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure) } static int -PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value) +PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value, void *Py_UNUSED(ignored)) { PyObject *ascii; char *encoding; diff --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c index 6c54de733b95be..d5884fa533deb3 100644 --- a/Modules/_io/bytesio.c +++ b/Modules/_io/bytesio.c @@ -201,7 +201,7 @@ write_bytes(bytesio *self, const char *bytes, Py_ssize_t len) } static PyObject * -bytesio_get_closed(bytesio *self) +bytesio_get_closed(bytesio *self, void *Py_UNUSED(ignored)) { if (self->buf == NULL) { Py_RETURN_TRUE; diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 6830d93f503ef3..389bb6701c5f52 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -4476,13 +4476,13 @@ PicklerMemoProxy_New(PicklerObject *pickler) /*****************************************************************************/ static PyObject * -Pickler_get_memo(PicklerObject *self) +Pickler_get_memo(PicklerObject *self, void *Py_UNUSED(ignored)) { return PicklerMemoProxy_New(self); } static int -Pickler_set_memo(PicklerObject *self, PyObject *obj) +Pickler_set_memo(PicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored)) { PyMemoTable *new_memo = NULL; @@ -4544,7 +4544,7 @@ Pickler_set_memo(PicklerObject *self, PyObject *obj) } static PyObject * -Pickler_get_persid(PicklerObject *self) +Pickler_get_persid(PicklerObject *self, void *Py_UNUSED(ignored)) { if (self->pers_func == NULL) { PyErr_SetString(PyExc_AttributeError, "persistent_id"); @@ -4554,7 +4554,7 @@ Pickler_get_persid(PicklerObject *self) } static int -Pickler_set_persid(PicklerObject *self, PyObject *value) +Pickler_set_persid(PicklerObject *self, PyObject *value, void *Py_UNUSED(ignored)) { if (value == NULL) { PyErr_SetString(PyExc_TypeError, @@ -6908,13 +6908,13 @@ UnpicklerMemoProxy_New(UnpicklerObject *unpickler) static PyObject * -Unpickler_get_memo(UnpicklerObject *self) +Unpickler_get_memo(UnpicklerObject *self, void *Py_UNUSED(ignored)) { return UnpicklerMemoProxy_New(self); } static int -Unpickler_set_memo(UnpicklerObject *self, PyObject *obj) +Unpickler_set_memo(UnpicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored)) { PyObject **new_memo; size_t new_memo_size = 0; @@ -6991,7 +6991,7 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj) } static PyObject * -Unpickler_get_persload(UnpicklerObject *self) +Unpickler_get_persload(UnpicklerObject *self, void *Py_UNUSED(ignored)) { if (self->pers_func == NULL) { PyErr_SetString(PyExc_AttributeError, "persistent_load"); @@ -7001,7 +7001,7 @@ Unpickler_get_persload(UnpicklerObject *self) } static int -Unpickler_set_persload(UnpicklerObject *self, PyObject *value) +Unpickler_set_persload(UnpicklerObject *self, PyObject *value, void *Py_UNUSED(ignored)) { if (value == NULL) { PyErr_SetString(PyExc_TypeError, diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index f503288336d08d..d86caef7ab6052 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -51,7 +51,7 @@ static const char * const begin_statements[] = { NULL }; -static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* isolation_level); +static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* isolation_level, void *Py_UNUSED(ignored)); static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self); @@ -136,7 +136,7 @@ int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject Py_INCREF(isolation_level); } self->isolation_level = NULL; - if (pysqlite_connection_set_isolation_level(self, isolation_level) < 0) { + if (pysqlite_connection_set_isolation_level(self, isolation_level, NULL) < 0) { Py_DECREF(isolation_level); return -1; } @@ -1162,7 +1162,8 @@ static PyObject* pysqlite_connection_get_in_transaction(pysqlite_Connection* sel Py_RETURN_FALSE; } -static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* isolation_level) +static int +pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* isolation_level, void *Py_UNUSED(ignored)) { if (isolation_level == Py_None) { PyObject *res = pysqlite_connection_commit(self, NULL); diff --git a/Modules/_sqlite/row.c b/Modules/_sqlite/row.c index 53342f3444c097..8c53f89f1bc53c 100644 --- a/Modules/_sqlite/row.c +++ b/Modules/_sqlite/row.c @@ -150,7 +150,8 @@ PyObject* pysqlite_row_subscript(pysqlite_Row* self, PyObject* idx) } } -Py_ssize_t pysqlite_row_length(pysqlite_Row* self, PyObject* args, PyObject* kwargs) +static Py_ssize_t +pysqlite_row_length(pysqlite_Row* self) { return PyTuple_GET_SIZE(self->data); } diff --git a/Modules/_sre.c b/Modules/_sre.c index d09249672f8bc3..a4b7e72153aea1 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -1424,7 +1424,7 @@ PyDoc_STRVAR(pattern_doc, "Compiled regular expression objects"); /* PatternObject's 'groupindex' method. */ static PyObject * -pattern_groupindex(PatternObject *self) +pattern_groupindex(PatternObject *self, void *Py_UNUSED(ignored)) { return PyDictProxy_New(self->groupindex); } @@ -2426,7 +2426,7 @@ PyDoc_STRVAR(match_group_doc, For 0 returns the entire match."); static PyObject * -match_lastindex_get(MatchObject *self) +match_lastindex_get(MatchObject *self, void *Py_UNUSED(ignored)) { if (self->lastindex >= 0) return PyLong_FromSsize_t(self->lastindex); @@ -2435,7 +2435,7 @@ match_lastindex_get(MatchObject *self) } static PyObject * -match_lastgroup_get(MatchObject *self) +match_lastgroup_get(MatchObject *self, void *Py_UNUSED(ignored)) { if (self->pattern->indexgroup && self->lastindex >= 0) { PyObject* result = PySequence_GetItem( @@ -2450,7 +2450,7 @@ match_lastgroup_get(MatchObject *self) } static PyObject * -match_regs_get(MatchObject *self) +match_regs_get(MatchObject *self, void *Py_UNUSED(ignored)) { if (self->regs) { Py_INCREF(self->regs); diff --git a/Modules/_testbuffer.c b/Modules/_testbuffer.c index 669794df012c18..a16b96db048afc 100644 --- a/Modules/_testbuffer.c +++ b/Modules/_testbuffer.c @@ -1531,7 +1531,7 @@ ndarray_getbuf(NDArrayObject *self, Py_buffer *view, int flags) return 0; } -static int +static void ndarray_releasebuf(NDArrayObject *self, Py_buffer *view) { if (!ND_IS_CONSUMER(self)) { @@ -1539,8 +1539,6 @@ ndarray_releasebuf(NDArrayObject *self, Py_buffer *view) if (--ndbuf->exports == 0 && ndbuf != self->head) ndbuf_delete(self, ndbuf); } - - return 0; } static PyBufferProcs ndarray_as_buffer = { diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index 080b44f78562a7..473e601556f6eb 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -864,7 +864,7 @@ PyTclObject_string(PyTclObject *self, void *ignored) } static PyObject * -PyTclObject_str(PyTclObject *self, void *ignored) +PyTclObject_str(PyTclObject *self) { if (self->string) { Py_INCREF(self->string); @@ -877,7 +877,7 @@ PyTclObject_str(PyTclObject *self, void *ignored) static PyObject * PyTclObject_repr(PyTclObject *self) { - PyObject *repr, *str = PyTclObject_str(self, NULL); + PyObject *repr, *str = PyTclObject_str(self); if (str == NULL) return NULL; repr = PyUnicode_FromFormat("<%s object: %R>", diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index d6efc77d20c883..e85ec56e0acfa8 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -108,7 +108,7 @@ call_error_callback(PyObject *errors, PyObject *exc) } static PyObject * -codecctx_errors_get(MultibyteStatefulCodecContext *self) +codecctx_errors_get(MultibyteStatefulCodecContext *self, void *Py_UNUSED(ignored)) { const char *errors; diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 721e5ed32ea2f7..dec670fa0b43a2 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -681,7 +681,7 @@ mmap_move_method(mmap_object *self, PyObject *args) } static PyObject * -mmap_closed_get(mmap_object *self) +mmap_closed_get(mmap_object *self, void *Py_UNUSED(ignored)) { #ifdef MS_WINDOWS return PyBool_FromLong(self->map_handle == NULL ? 1 : 0); diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 5438b697ddcddc..f02f5ae4e10c8e 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -1026,7 +1026,7 @@ Close the devpoll file descriptor. Further operations on the devpoll\n\ object will raise an exception."); static PyObject* -devpoll_get_closed(devpollObject *self) +devpoll_get_closed(devpollObject *self, void *Py_UNUSED(ignored)) { if (self->fd_devpoll < 0) Py_RETURN_TRUE; @@ -1345,7 +1345,7 @@ Close the epoll control file descriptor. Further operations on the epoll\n\ object will raise an exception."); static PyObject* -pyepoll_get_closed(pyEpoll_Object *self) +pyepoll_get_closed(pyEpoll_Object *self, void *Py_UNUSED(ignored)) { if (self->epfd < 0) Py_RETURN_TRUE; @@ -2091,7 +2091,7 @@ Close the kqueue control file descriptor. Further operations on the kqueue\n\ object will raise an exception."); static PyObject* -kqueue_queue_get_closed(kqueue_queue_Object *self) +kqueue_queue_get_closed(kqueue_queue_Object *self, void *Py_UNUSED(ignored)) { if (self->kqfd < 0) Py_RETURN_TRUE; diff --git a/Modules/xxsubtype.c b/Modules/xxsubtype.c index 11242d73913812..d2593b12d602ca 100644 --- a/Modules/xxsubtype.c +++ b/Modules/xxsubtype.c @@ -89,7 +89,7 @@ spamlist_init(spamlistobject *self, PyObject *args, PyObject *kwds) } static PyObject * -spamlist_state_get(spamlistobject *self) +spamlist_state_get(spamlistobject *self, void *Py_UNUSED(ignored)) { return PyLong_FromLong(self->state); } diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 9020ccd3254792..9d258cf111d166 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -378,7 +378,7 @@ calculate_qualname(PyDescrObject *descr) } static PyObject * -descr_get_qualname(PyDescrObject *descr) +descr_get_qualname(PyDescrObject *descr, void *Py_UNUSED(ignored)) { if (descr->d_qualname == NULL) descr->d_qualname = calculate_qualname(descr); @@ -1118,7 +1118,7 @@ static PyMemberDef wrapper_members[] = { }; static PyObject * -wrapper_objclass(wrapperobject *wp) +wrapper_objclass(wrapperobject *wp, void *Py_UNUSED(ignored)) { PyObject *c = (PyObject *)PyDescr_TYPE(wp->descr); @@ -1127,7 +1127,7 @@ wrapper_objclass(wrapperobject *wp) } static PyObject * -wrapper_name(wrapperobject *wp) +wrapper_name(wrapperobject *wp, void *Py_UNUSED(ignored)) { const char *s = wp->descr->d_base->name; @@ -1135,21 +1135,21 @@ wrapper_name(wrapperobject *wp) } static PyObject * -wrapper_doc(wrapperobject *wp, void *closure) +wrapper_doc(wrapperobject *wp, void *Py_UNUSED(ignored)) { return _PyType_GetDocFromInternalDoc(wp->descr->d_base->name, wp->descr->d_base->doc); } static PyObject * -wrapper_text_signature(wrapperobject *wp, void *closure) +wrapper_text_signature(wrapperobject *wp, void *Py_UNUSED(ignored)) { return _PyType_GetTextSignatureFromInternalDoc(wp->descr->d_base->name, wp->descr->d_base->doc); } static PyObject * -wrapper_qualname(wrapperobject *wp) +wrapper_qualname(wrapperobject *wp, void *Py_UNUSED(ignored)) { - return descr_get_qualname((PyDescrObject *)wp->descr); + return descr_get_qualname((PyDescrObject *)wp->descr, NULL); } static PyGetSetDef wrapper_getsets[] = { diff --git a/Objects/exceptions.c b/Objects/exceptions.c index 3bec50ea69e46d..6f3b986d324745 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -181,7 +181,7 @@ static PyMethodDef BaseException_methods[] = { }; static PyObject * -BaseException_get_args(PyBaseExceptionObject *self) +BaseException_get_args(PyBaseExceptionObject *self, void *Py_UNUSED(ignored)) { if (self->args == NULL) { Py_INCREF(Py_None); @@ -192,7 +192,7 @@ BaseException_get_args(PyBaseExceptionObject *self) } static int -BaseException_set_args(PyBaseExceptionObject *self, PyObject *val) +BaseException_set_args(PyBaseExceptionObject *self, PyObject *val, void *Py_UNUSED(ignored)) { PyObject *seq; if (val == NULL) { @@ -207,7 +207,7 @@ BaseException_set_args(PyBaseExceptionObject *self, PyObject *val) } static PyObject * -BaseException_get_tb(PyBaseExceptionObject *self) +BaseException_get_tb(PyBaseExceptionObject *self, void *Py_UNUSED(ignored)) { if (self->traceback == NULL) { Py_INCREF(Py_None); @@ -218,7 +218,7 @@ BaseException_get_tb(PyBaseExceptionObject *self) } static int -BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb) +BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb, void *Py_UNUSED(ignored)) { if (tb == NULL) { PyErr_SetString(PyExc_TypeError, "__traceback__ may not be deleted"); @@ -236,7 +236,8 @@ BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb) } static PyObject * -BaseException_get_context(PyObject *self) { +BaseException_get_context(PyObject *self, void *Py_UNUSED(ignored)) +{ PyObject *res = PyException_GetContext(self); if (res) return res; /* new reference already returned above */ @@ -244,7 +245,8 @@ BaseException_get_context(PyObject *self) { } static int -BaseException_set_context(PyObject *self, PyObject *arg) { +BaseException_set_context(PyObject *self, PyObject *arg, void *Py_UNUSED(ignored)) +{ if (arg == NULL) { PyErr_SetString(PyExc_TypeError, "__context__ may not be deleted"); return -1; @@ -263,7 +265,8 @@ BaseException_set_context(PyObject *self, PyObject *arg) { } static PyObject * -BaseException_get_cause(PyObject *self) { +BaseException_get_cause(PyObject *self, void *Py_UNUSED(ignored)) +{ PyObject *res = PyException_GetCause(self); if (res) return res; /* new reference already returned above */ @@ -271,7 +274,8 @@ BaseException_get_cause(PyObject *self) { } static int -BaseException_set_cause(PyObject *self, PyObject *arg) { +BaseException_set_cause(PyObject *self, PyObject *arg, void *Py_UNUSED(ignored)) +{ if (arg == NULL) { PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted"); return -1; @@ -294,10 +298,10 @@ static PyGetSetDef BaseException_getset[] = { {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict}, {"args", (getter)BaseException_get_args, (setter)BaseException_set_args}, {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb}, - {"__context__", (getter)BaseException_get_context, - (setter)BaseException_set_context, PyDoc_STR("exception context")}, - {"__cause__", (getter)BaseException_get_cause, - (setter)BaseException_set_cause, PyDoc_STR("exception cause")}, + {"__context__", BaseException_get_context, + BaseException_set_context, PyDoc_STR("exception context")}, + {"__cause__", BaseException_get_cause, + BaseException_set_cause, PyDoc_STR("exception cause")}, {NULL}, }; @@ -312,7 +316,7 @@ PyException_GetTraceback(PyObject *self) { int PyException_SetTraceback(PyObject *self, PyObject *tb) { - return BaseException_set_tb((PyBaseExceptionObject *)self, tb); + return BaseException_set_tb((PyBaseExceptionObject *)self, tb, NULL); } PyObject * diff --git a/Objects/frameobject.c b/Objects/frameobject.c index b7a16ad05966a1..535ec46ee02776 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -61,7 +61,7 @@ frame_getlineno(PyFrameObject *f, void *closure) * that time. */ static int -frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno) +frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignored)) { int new_lineno = 0; /* The new value of f_lineno */ long l_new_lineno; @@ -521,7 +521,7 @@ frame_traverse(PyFrameObject *f, visitproc visit, void *arg) return 0; } -static void +static int frame_tp_clear(PyFrameObject *f) { PyObject **fastlocals, **p, **oldtop; @@ -552,6 +552,7 @@ frame_tp_clear(PyFrameObject *f) for (p = f->f_valuestack; p < oldtop; p++) Py_CLEAR(*p); } + return 0; } static PyObject * @@ -566,7 +567,7 @@ frame_clear(PyFrameObject *f) _PyGen_Finalize(f->f_gen); assert(f->f_gen == NULL); } - frame_tp_clear(f); + (void)frame_tp_clear(f); Py_RETURN_NONE; } diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 6ce0cb43e5e929..e66fda369217a2 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -240,14 +240,14 @@ static PyMemberDef func_memberlist[] = { }; static PyObject * -func_get_code(PyFunctionObject *op) +func_get_code(PyFunctionObject *op, void *Py_UNUSED(ignored)) { Py_INCREF(op->func_code); return op->func_code; } static int -func_set_code(PyFunctionObject *op, PyObject *value) +func_set_code(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored)) { Py_ssize_t nfree, nclosure; @@ -275,14 +275,14 @@ func_set_code(PyFunctionObject *op, PyObject *value) } static PyObject * -func_get_name(PyFunctionObject *op) +func_get_name(PyFunctionObject *op, void *Py_UNUSED(ignored)) { Py_INCREF(op->func_name); return op->func_name; } static int -func_set_name(PyFunctionObject *op, PyObject *value) +func_set_name(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored)) { /* Not legal to del f.func_name or to set it to anything * other than a string object. */ @@ -297,14 +297,14 @@ func_set_name(PyFunctionObject *op, PyObject *value) } static PyObject * -func_get_qualname(PyFunctionObject *op) +func_get_qualname(PyFunctionObject *op, void *Py_UNUSED(ignored)) { Py_INCREF(op->func_qualname); return op->func_qualname; } static int -func_set_qualname(PyFunctionObject *op, PyObject *value) +func_set_qualname(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored)) { /* Not legal to del f.__qualname__ or to set it to anything * other than a string object. */ @@ -319,7 +319,7 @@ func_set_qualname(PyFunctionObject *op, PyObject *value) } static PyObject * -func_get_defaults(PyFunctionObject *op) +func_get_defaults(PyFunctionObject *op, void *Py_UNUSED(ignored)) { if (op->func_defaults == NULL) { Py_INCREF(Py_None); @@ -330,7 +330,7 @@ func_get_defaults(PyFunctionObject *op) } static int -func_set_defaults(PyFunctionObject *op, PyObject *value) +func_set_defaults(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored)) { /* Legal to del f.func_defaults. * Can only set func_defaults to NULL or a tuple. */ @@ -347,7 +347,7 @@ func_set_defaults(PyFunctionObject *op, PyObject *value) } static PyObject * -func_get_kwdefaults(PyFunctionObject *op) +func_get_kwdefaults(PyFunctionObject *op, void *Py_UNUSED(ignored)) { if (op->func_kwdefaults == NULL) { Py_INCREF(Py_None); @@ -358,7 +358,7 @@ func_get_kwdefaults(PyFunctionObject *op) } static int -func_set_kwdefaults(PyFunctionObject *op, PyObject *value) +func_set_kwdefaults(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored)) { if (value == Py_None) value = NULL; @@ -375,7 +375,7 @@ func_set_kwdefaults(PyFunctionObject *op, PyObject *value) } static PyObject * -func_get_annotations(PyFunctionObject *op) +func_get_annotations(PyFunctionObject *op, void *Py_UNUSED(ignored)) { if (op->func_annotations == NULL) { op->func_annotations = PyDict_New(); @@ -387,7 +387,7 @@ func_get_annotations(PyFunctionObject *op) } static int -func_set_annotations(PyFunctionObject *op, PyObject *value) +func_set_annotations(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored)) { if (value == Py_None) value = NULL; diff --git a/Objects/genobject.c b/Objects/genobject.c index f226dbebaf4abf..d1136301f0187c 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -665,14 +665,14 @@ gen_repr(PyGenObject *gen) } static PyObject * -gen_get_name(PyGenObject *op) +gen_get_name(PyGenObject *op, void *Py_UNUSED(ignored)) { Py_INCREF(op->gi_name); return op->gi_name; } static int -gen_set_name(PyGenObject *op, PyObject *value) +gen_set_name(PyGenObject *op, PyObject *value, void *Py_UNUSED(ignored)) { /* Not legal to del gen.gi_name or to set it to anything * other than a string object. */ @@ -687,14 +687,14 @@ gen_set_name(PyGenObject *op, PyObject *value) } static PyObject * -gen_get_qualname(PyGenObject *op) +gen_get_qualname(PyGenObject *op, void *Py_UNUSED(ignored)) { Py_INCREF(op->gi_qualname); return op->gi_qualname; } static int -gen_set_qualname(PyGenObject *op, PyObject *value) +gen_set_qualname(PyGenObject *op, PyObject *value, void *Py_UNUSED(ignored)) { /* Not legal to del gen.__qualname__ or to set it to anything * other than a string object. */ @@ -709,7 +709,7 @@ gen_set_qualname(PyGenObject *op, PyObject *value) } static PyObject * -gen_getyieldfrom(PyGenObject *gen) +gen_getyieldfrom(PyGenObject *gen, void *Py_UNUSED(ignored)) { PyObject *yf = _PyGen_yf(gen); if (yf == NULL) @@ -944,7 +944,7 @@ coro_await(PyCoroObject *coro) } static PyObject * -coro_get_cr_await(PyCoroObject *coro) +coro_get_cr_await(PyCoroObject *coro, void *Py_UNUSED(ignored)) { PyObject *yf = _PyGen_yf((PyGenObject *) coro); if (yf == NULL) diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index e1ac7281783f38..30e00554794ea1 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -2903,7 +2903,7 @@ _IntTupleFromSsizet(int len, Py_ssize_t *vals) } static PyObject * -memory_obj_get(PyMemoryViewObject *self) +memory_obj_get(PyMemoryViewObject *self, void *Py_UNUSED(ignored)) { Py_buffer *view = &self->view; @@ -2916,56 +2916,56 @@ memory_obj_get(PyMemoryViewObject *self) } static PyObject * -memory_nbytes_get(PyMemoryViewObject *self) +memory_nbytes_get(PyMemoryViewObject *self, void *Py_UNUSED(ignored)) { CHECK_RELEASED(self); return PyLong_FromSsize_t(self->view.len); } static PyObject * -memory_format_get(PyMemoryViewObject *self) +memory_format_get(PyMemoryViewObject *self, void *Py_UNUSED(ignored)) { CHECK_RELEASED(self); return PyUnicode_FromString(self->view.format); } static PyObject * -memory_itemsize_get(PyMemoryViewObject *self) +memory_itemsize_get(PyMemoryViewObject *self, void *Py_UNUSED(ignored)) { CHECK_RELEASED(self); return PyLong_FromSsize_t(self->view.itemsize); } static PyObject * -memory_shape_get(PyMemoryViewObject *self) +memory_shape_get(PyMemoryViewObject *self, void *Py_UNUSED(ignored)) { CHECK_RELEASED(self); return _IntTupleFromSsizet(self->view.ndim, self->view.shape); } static PyObject * -memory_strides_get(PyMemoryViewObject *self) +memory_strides_get(PyMemoryViewObject *self, void *Py_UNUSED(ignored)) { CHECK_RELEASED(self); return _IntTupleFromSsizet(self->view.ndim, self->view.strides); } static PyObject * -memory_suboffsets_get(PyMemoryViewObject *self) +memory_suboffsets_get(PyMemoryViewObject *self, void *Py_UNUSED(ignored)) { CHECK_RELEASED(self); return _IntTupleFromSsizet(self->view.ndim, self->view.suboffsets); } static PyObject * -memory_readonly_get(PyMemoryViewObject *self) +memory_readonly_get(PyMemoryViewObject *self, void *Py_UNUSED(ignored)) { CHECK_RELEASED(self); return PyBool_FromLong(self->view.readonly); } static PyObject * -memory_ndim_get(PyMemoryViewObject *self) +memory_ndim_get(PyMemoryViewObject *self, void *Py_UNUSED(ignored)) { CHECK_RELEASED(self); return PyLong_FromLong(self->view.ndim); diff --git a/Python/traceback.c b/Python/traceback.c index 145d028ba353fd..f489a4727643c2 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -65,11 +65,12 @@ tb_traverse(PyTracebackObject *tb, visitproc visit, void *arg) return 0; } -static void +static int tb_clear(PyTracebackObject *tb) { Py_CLEAR(tb->tb_next); Py_CLEAR(tb->tb_frame); + return 0; } PyTypeObject PyTraceBack_Type = { From d5c8bd8e4cc04873254f0bd38895a6479c23c8aa Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 27 Nov 2018 10:51:07 -0800 Subject: [PATCH 2024/2287] bpo-33012: Fix signatures of METH_NOARGS functions. (GH-10736) (GH-10748) (cherry picked from commit 81524022d0c0df7a41f9b2b2df41e2ebe140e610) (cherry picked from commit ad8ac54aa3d2323bdb5feb5e858a922840358187) Co-authored-by: Serhiy Storchaka --- Modules/_collectionsmodule.c | 2 +- Modules/_cursesmodule.c | 12 ++++++------ Modules/_testcapimodule.c | 10 +++++----- Objects/odictobject.c | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 4fbf3bdb1463e5..25006fa2c97581 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1341,7 +1341,7 @@ deque_traverse(dequeobject *deque, visitproc visit, void *arg) } static PyObject * -deque_reduce(dequeobject *deque) +deque_reduce(dequeobject *deque, PyObject *Py_UNUSED(ignored)) { PyObject *dict, *it; _Py_IDENTIFIER(__dict__); diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 8b46466d6f0058..c048a7ddf2da3a 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -414,27 +414,27 @@ PyTypeObject PyCursesWindow_Type; PARSESTR - format string for argument parsing */ -#define Window_NoArgNoReturnFunction(X) \ - static PyObject *PyCursesWindow_ ## X \ - (PyCursesWindowObject *self, PyObject *args) \ +#define Window_NoArgNoReturnFunction(X) \ + static PyObject *PyCursesWindow_ ## X \ + (PyCursesWindowObject *self, PyObject *Py_UNUSED(ignored)) \ { return PyCursesCheckERR(X(self->win), # X); } #define Window_NoArgTrueFalseFunction(X) \ static PyObject * PyCursesWindow_ ## X \ - (PyCursesWindowObject *self) \ + (PyCursesWindowObject *self, PyObject *Py_UNUSED(ignored)) \ { \ if (X (self->win) == FALSE) { Py_INCREF(Py_False); return Py_False; } \ else { Py_INCREF(Py_True); return Py_True; } } #define Window_NoArgNoReturnVoidFunction(X) \ static PyObject * PyCursesWindow_ ## X \ - (PyCursesWindowObject *self) \ + (PyCursesWindowObject *self, PyObject *Py_UNUSED(ignored)) \ { \ X(self->win); Py_INCREF(Py_None); return Py_None; } #define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \ static PyObject * PyCursesWindow_ ## X \ - (PyCursesWindowObject *self) \ + (PyCursesWindowObject *self, PyObject *Py_UNUSED(ignored)) \ { \ TYPE arg1, arg2; \ X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); } diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 556d49bb3c8399..067d46346a68d2 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -952,7 +952,7 @@ test_buildvalue_N_error(const char *fmt) } static PyObject * -test_buildvalue_N(PyObject *self, PyObject *noargs) +test_buildvalue_N(PyObject *self, PyObject *Py_UNUSED(ignored)) { PyObject *arg, *res; @@ -2351,7 +2351,7 @@ pending_threadfunc(PyObject *self, PyObject *arg) /* Some tests of PyUnicode_FromFormat(). This needs more tests. */ static PyObject * -test_string_from_format(PyObject *self, PyObject *args) +test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored)) { PyObject *result; char *msg; @@ -2491,7 +2491,7 @@ typedef struct { } known_capsule; static PyObject * -test_capsule(PyObject *self, PyObject *args) +test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored)) { PyObject *object; const char *error = NULL; @@ -2863,7 +2863,7 @@ make_memoryview_from_NULL_pointer(PyObject *self) } static PyObject * -test_from_contiguous(PyObject* self, PyObject *noargs) +test_from_contiguous(PyObject* self, PyObject *Py_UNUSED(ignored)) { int data[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1}; int init[5] = {0, 1, 2, 3, 4}; @@ -2916,7 +2916,7 @@ test_from_contiguous(PyObject* self, PyObject *noargs) extern PyTypeObject _PyBytesIOBuffer_Type; static PyObject * -test_pep3118_obsolete_write_locks(PyObject* self, PyObject *noargs) +test_pep3118_obsolete_write_locks(PyObject* self, PyObject *Py_UNUSED(ignored)) { PyTypeObject *type = &_PyBytesIOBuffer_Type; PyObject *b; diff --git a/Objects/odictobject.c b/Objects/odictobject.c index f433cd2f4cec67..fdeda43bbd81f0 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -1889,7 +1889,7 @@ odictiter_iternext(odictiterobject *di) PyDoc_STRVAR(reduce_doc, "Return state information for pickling"); static PyObject * -odictiter_reduce(odictiterobject *di) +odictiter_reduce(odictiterobject *di, PyObject *Py_UNUSED(ignored)) { /* copy the iterator state */ odictiterobject tmp = *di; From dd5293871703e6a12ffdde14eeaa86a73b7b0d99 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 27 Nov 2018 16:37:23 -0800 Subject: [PATCH 2025/2287] bpo-33676: Fix dangling thread in _test_multiprocessing (GH-10755) Fix WithThreadsTestPool.test_wrapped_exception() of test_multiprocessing_fork: join the pool. WithThreadsTestPool.test_del_pool() is now also decorated with @support.reap_threads. (cherry picked from commit b7278736b3ae158a7738057e3045bc767ced019e) Co-authored-by: Victor Stinner --- Lib/test/_test_multiprocessing.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 6667f117857482..59f9a2e1e2eb62 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -2250,6 +2250,7 @@ def test_wrapped_exception(self): with self.Pool(1) as p: with self.assertRaises(RuntimeError): p.apply(self._test_wrapped_exception) + p.join() def test_map_no_failfast(self): # Issue #23992: the fail-fast behaviour when an exception is raised @@ -2285,6 +2286,7 @@ def test_release_task_refs(self): # they were released too. self.assertEqual(CountedObject.n_instances, 0) + @support.reap_threads def test_del_pool(self): p = self.Pool(1) wr = weakref.ref(p) From a181411f13c5dccdba9c918f86c945e8f6ab9757 Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Wed, 28 Nov 2018 17:09:18 +0100 Subject: [PATCH 2026/2287] [3.6] Doc: Delete "how do I emulate os.kill" section in Windows FAQ (GH-10487) (GH-10768) That section is a tip on how to kill process on Windows for Python prior to 2.7 and 3.2. 3.1 end of support was April 2012 and 2.6 was October 2013, so that hasn't been need for supported versions of Python for more than 5 years. Beside not being needed anymore for a long time, when I read it with the eyes of a Python profane, it makes Python looks bad, like a language from the parts with warts you need to circumvent. Let's delete that :). (cherry picked from commit a1c40014085d5cc6c12064577e8c10e7182ee9f9) Co-authored-by: Mathieu Dupuy --- Doc/faq/windows.rst | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/Doc/faq/windows.rst b/Doc/faq/windows.rst index 772b8c2012c302..2b44f65692b85c 100644 --- a/Doc/faq/windows.rst +++ b/Doc/faq/windows.rst @@ -280,24 +280,3 @@ How do I check for a keypress without blocking? Use the msvcrt module. This is a standard Windows-specific extension module. It defines a function ``kbhit()`` which checks whether a keyboard hit is present, and ``getch()`` which gets one character without echoing it. - - -How do I emulate os.kill() in Windows? --------------------------------------- - -Prior to Python 2.7 and 3.2, to terminate a process, you can use :mod:`ctypes`: - -.. code-block:: python - - import ctypes - - def kill(pid): - """kill function for Win32""" - kernel32 = ctypes.windll.kernel32 - handle = kernel32.OpenProcess(1, 0, pid) - return (0 != kernel32.TerminateProcess(handle, 0)) - -In 2.7 and 3.2, :func:`os.kill` is implemented similar to the above function, -with the additional feature of being able to send :kbd:`Ctrl+C` and :kbd:`Ctrl+Break` -to console subprocesses which are designed to handle those signals. See -:func:`os.kill` for further details. From b14d3f2fe608effed9a3bffcb4d5aa08e69efcf8 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 28 Nov 2018 18:04:51 +0100 Subject: [PATCH 2027/2287] pythoninfo: log more environment variable (GH-10719) (GH-10770) Log TZ to debug a timezone issue... and a few more :-) (cherry picked from commit 282c03d45d2d766c55904a4eb766923a2c459124) --- Lib/test/pythoninfo.py | 49 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index 4a563e9baae292..606d511433cfcf 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -199,32 +199,73 @@ def format_groups(groups): call_func(info_add, 'os.cpu_count', os, 'cpu_count') call_func(info_add, 'os.loadavg', os, 'getloadavg') - # Get environment variables: filter to list - # to not leak sensitive information - ENV_VARS = ( + # Environment variables used by the stdlib and tests. Don't log the full + # environment: filter to list to not leak sensitive information. + # + # HTTP_PROXY is not logged because it can contain a password. + ENV_VARS = frozenset(( + "APPDATA", + "AR", + "ARCHFLAGS", + "ARFLAGS", + "AUDIODEV", "CC", + "CFLAGS", + "COLUMNS", + "COMPUTERNAME", "COMSPEC", + "CPP", + "CPPFLAGS", "DISPLAY", + "DISTUTILS_DEBUG", "DISTUTILS_USE_SDK", "DYLD_LIBRARY_PATH", + "ENSUREPIP_OPTIONS", + "HISTORY_FILE", "HOME", "HOMEDRIVE", "HOMEPATH", + "IDLESTARTUP", "LANG", + "LDFLAGS", + "LDSHARED", "LD_LIBRARY_PATH", + "LINES", "MACOSX_DEPLOYMENT_TARGET", + "MAILCAPS", "MAKEFLAGS", + "MIXERDEV", "MSSDK", "PATH", + "PATHEXT", + "PIP_CONFIG_FILE", + "PLAT", + "POSIXLY_CORRECT", + "PY_SAX_PARSER", + "ProgramFiles", + "ProgramFiles(x86)", + "RUNNING_ON_VALGRIND", "SDK_TOOLS_BIN", + "SERVER_SOFTWARE", "SHELL", + "SOURCE_DATE_EPOCH", + "SYSTEMROOT", "TEMP", "TERM", + "TILE_LIBRARY", + "TIX_LIBRARY", "TMP", "TMPDIR", + "TZ", "USERPROFILE", + "VIRTUAL_ENV", "WAYLAND_DISPLAY", - ) + "WINDIR", + "_PYTHON_HOST_PLATFORM", + "_PYTHON_PROJECT_BASE", + "_PYTHON_SYSCONFIGDATA_NAME", + "__PYVENV_LAUNCHER__", + )) for name, value in os.environ.items(): uname = name.upper() if (uname in ENV_VARS From 833a7067a4d5621d024511d9166db7331c4650c9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 28 Nov 2018 16:57:18 -0800 Subject: [PATCH 2028/2287] bpo-35189, bpo-35316: Make test_eintr less strict (GH-10782) test_eintr no longer fails if the signal handler has not been called. (cherry picked from commit 2956bffbc00127af65f69e04d7979021a21d1288) Co-authored-by: Victor Stinner --- Lib/test/eintrdata/eintr_tester.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/Lib/test/eintrdata/eintr_tester.py b/Lib/test/eintrdata/eintr_tester.py index c2eaf0128a5f93..aa7cfd14d9f9c1 100644 --- a/Lib/test/eintrdata/eintr_tester.py +++ b/Lib/test/eintrdata/eintr_tester.py @@ -69,8 +69,6 @@ def tearDown(self): signal.signal(signal.SIGALRM, self.orig_handler) if hasattr(faulthandler, 'cancel_dump_traceback_later'): faulthandler.cancel_dump_traceback_later() - # make sure that at least one signal has been received - self.assertGreater(self.signals, 0) def subprocess(self, *args, **kw): cmd_args = (sys.executable, '-c') + args From 2a852a2b122cf9545909234cdc8fca564dc8f805 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 29 Nov 2018 03:07:38 -0800 Subject: [PATCH 2029/2287] bpo-16086: Fix PyType_GetFlags() documentation (GH-10758) (GH-10790) PyType_GetFlags() return type is unsigned long, not long. (cherry picked from commit 9fbcfc08e5814d7aa9287740187e461425a99f67) Co-authored-by: Eddie Elizondo --- Doc/c-api/type.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index 60c5e73960b3a1..4dfd53fb9f076f 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -35,7 +35,7 @@ Type Objects Clear the internal lookup cache. Return the current version tag. -.. c:function:: long PyType_GetFlags(PyTypeObject* type) +.. c:function:: unsigned long PyType_GetFlags(PyTypeObject* type) Return the :c:member:`~PyTypeObject.tp_flags` member of *type*. This function is primarily meant for use with `Py_LIMITED_API`; the individual flag bits are @@ -44,6 +44,9 @@ Type Objects .. versionadded:: 3.2 + .. versionchanged:: 3.4 + The return type is now ``unsigned long`` rather than ``long``. + .. c:function:: void PyType_Modified(PyTypeObject *type) From cbf57674e257617977b35c016e861a52b5f65359 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 29 Nov 2018 03:53:19 -0800 Subject: [PATCH 2030/2287] bpo-27903: Fix ResourceWarning in platform.dist() (GH-10792) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix ResourceWarning in platform.dist() and platform.linux_distribution() on SuSE and Caldera OpenLinux. Patch by Ville Skyttä. (cherry picked from commit 7eeab87263b831adbe617a4af7ec5b5d9296962a) Co-authored-by: Victor Stinner --- Lib/platform.py | 36 ++++++++++--------- .../2018-11-29-12-14-04.bpo-27903.ia8xgT.rst | 2 ++ 2 files changed, 21 insertions(+), 17 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-11-29-12-14-04.bpo-27903.ia8xgT.rst diff --git a/Lib/platform.py b/Lib/platform.py index 4205abde038866..fa56d4114ce51a 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -243,27 +243,29 @@ def _dist_try_harder(distname, version, id): if os.path.exists('/var/adm/inst-log/info'): # SuSE Linux stores distribution information in that file distname = 'SuSE' - for line in open('/var/adm/inst-log/info'): - tv = line.split() - if len(tv) == 2: - tag, value = tv - else: - continue - if tag == 'MIN_DIST_VERSION': - version = value.strip() - elif tag == 'DIST_IDENT': - values = value.split('-') - id = values[2] + with open('/var/adm/inst-log/info') as f: + for line in f: + tv = line.split() + if len(tv) == 2: + tag, value = tv + else: + continue + if tag == 'MIN_DIST_VERSION': + version = value.strip() + elif tag == 'DIST_IDENT': + values = value.split('-') + id = values[2] return distname, version, id if os.path.exists('/etc/.installed'): # Caldera OpenLinux has some infos in that file (thanks to Colin Kong) - for line in open('/etc/.installed'): - pkg = line.split('-') - if len(pkg) >= 2 and pkg[0] == 'OpenLinux': - # XXX does Caldera support non Intel platforms ? If yes, - # where can we find the needed id ? - return 'OpenLinux', pkg[1], id + with open('/etc/.installed') as f: + for line in f: + pkg = line.split('-') + if len(pkg) >= 2 and pkg[0] == 'OpenLinux': + # XXX does Caldera support non Intel platforms ? If yes, + # where can we find the needed id ? + return 'OpenLinux', pkg[1], id if os.path.isdir('/usr/lib/setup'): # Check for slackware version tag file (thanks to Greg Andruk) diff --git a/Misc/NEWS.d/next/Library/2018-11-29-12-14-04.bpo-27903.ia8xgT.rst b/Misc/NEWS.d/next/Library/2018-11-29-12-14-04.bpo-27903.ia8xgT.rst new file mode 100644 index 00000000000000..8cdf75bc10c93d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-11-29-12-14-04.bpo-27903.ia8xgT.rst @@ -0,0 +1,2 @@ +Fix ``ResourceWarning`` in :func:`platform.dist` on SuSE and Caldera +OpenLinux. Patch by Ville Skyttä. From e1b210342fa08685bf9b24eb449a2f079f1b50f5 Mon Sep 17 00:00:00 2001 From: stratakis Date: Thu, 29 Nov 2018 15:43:24 +0100 Subject: [PATCH 2031/2287] [3.6] bpo-31625: Stop using ranlib (GH-10417) * stop using ranlib (closes bpo-31625) (#3815) Instead, simply pass 's' to ar. * explicitly list objects for the ar command (#3824) $^ is not portable. closes bpo-31625 --- Makefile.pre.in | 11 +-- .../2017-09-28-23-21-20.bpo-31625.Bb2NXr.rst | 1 + configure | 96 +------------------ configure.ac | 3 +- 4 files changed, 4 insertions(+), 107 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2017-09-28-23-21-20.bpo-31625.Bb2NXr.rst diff --git a/Makefile.pre.in b/Makefile.pre.in index 82f7edd1014cff..258236d3645096 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -37,7 +37,6 @@ CXX= @CXX@ MAINCC= @MAINCC@ LINKCC= @LINKCC@ AR= @AR@ -RANLIB= @RANLIB@ READELF= @READELF@ SOABI= @SOABI@ LDVERSION= @LDVERSION@ @@ -593,16 +592,9 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o # Build static library -# avoid long command lines, same as LIBRARY_OBJS $(LIBRARY): $(LIBRARY_OBJS) -rm -f $@ - $(AR) $(ARFLAGS) $@ Modules/getbuildinfo.o - $(AR) $(ARFLAGS) $@ $(PARSER_OBJS) - $(AR) $(ARFLAGS) $@ $(OBJECT_OBJS) - $(AR) $(ARFLAGS) $@ $(PYTHON_OBJS) Python/frozen.o - $(AR) $(ARFLAGS) $@ $(MODULE_OBJS) - $(AR) $(ARFLAGS) $@ $(MODOBJS) - $(RANLIB) $@ + $(AR) $(ARFLAGS) $@ $(LIBRARY_OBJS) libpython$(LDVERSION).so: $(LIBRARY_OBJS) if test $(INSTSONAME) != $(LDLIBRARY); then \ @@ -1435,7 +1427,6 @@ libainstall: @DEF_MAKE_RULE@ python-config $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \ else \ $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \ - $(RANLIB) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \ fi; \ else \ echo Skip install of $(LIBRARY) - use make frameworkinstall; \ diff --git a/Misc/NEWS.d/next/Build/2017-09-28-23-21-20.bpo-31625.Bb2NXr.rst b/Misc/NEWS.d/next/Build/2017-09-28-23-21-20.bpo-31625.Bb2NXr.rst new file mode 100644 index 00000000000000..dbd078f00308fe --- /dev/null +++ b/Misc/NEWS.d/next/Build/2017-09-28-23-21-20.bpo-31625.Bb2NXr.rst @@ -0,0 +1 @@ +Stop using ranlib on static libraries. Instead, we assume ar supports the 's' flag. diff --git a/configure b/configure index 9b137c72603a2e..ac29d65a6c0885 100755 --- a/configure +++ b/configure @@ -694,8 +694,6 @@ READELF ARFLAGS ac_ct_AR AR -RANLIB -USE_INLINE GNULD LINKCC LDVERSION @@ -6029,98 +6027,6 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LDLIBRARY" >&5 $as_echo "$LDLIBRARY" >&6; } -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - if test -n "$ac_tool_prefix"; then for ac_prog in ar aal @@ -6227,7 +6133,7 @@ fi if test -z "$ARFLAGS" then - ARFLAGS="rc" + ARFLAGS="rcs" fi if test -n "$ac_tool_prefix"; then diff --git a/configure.ac b/configure.ac index f9d406e5e812e5..c003025e3d9b5b 100644 --- a/configure.ac +++ b/configure.ac @@ -1196,7 +1196,6 @@ fi AC_MSG_RESULT($LDLIBRARY) -AC_PROG_RANLIB AC_SUBST(AR) AC_CHECK_TOOLS(AR, ar aal, ar) @@ -1204,7 +1203,7 @@ AC_CHECK_TOOLS(AR, ar aal, ar) AC_SUBST(ARFLAGS) if test -z "$ARFLAGS" then - ARFLAGS="rc" + ARFLAGS="rcs" fi AC_CHECK_TOOLS([READELF], [readelf], [:]) From 77000bbb104021b89368b9f7cab6f1417794e348 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 29 Nov 2018 15:49:20 +0100 Subject: [PATCH 2032/2287] bpo-33012: Fix more invalid function cast warnings with gcc 8. (GH-10751) (GH-10796) Fix warnings with gcc 8 for wrapperfunc <-> wrapperfunc_kwds casts. (cherry picked from commit 1c607155c9e363489036ae6258b165a3fae75134) --- Objects/typeobject.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index ed2d40064adc4f..a811eaa208de29 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -6596,7 +6596,7 @@ static slotdef slotdefs[] = { "__repr__($self, /)\n--\n\nReturn repr(self)."), TPSLOT("__hash__", tp_hash, slot_tp_hash, wrap_hashfunc, "__hash__($self, /)\n--\n\nReturn hash(self)."), - FLSLOT("__call__", tp_call, slot_tp_call, (wrapperfunc)wrap_call, + FLSLOT("__call__", tp_call, slot_tp_call, (wrapperfunc)(void(*)(void))wrap_call, "__call__($self, /, *args, **kwargs)\n--\n\nCall self as a function.", PyWrapperFlag_KEYWORDS), TPSLOT("__str__", tp_str, slot_tp_str, wrap_unaryfunc, @@ -6632,7 +6632,7 @@ static slotdef slotdefs[] = { TPSLOT("__delete__", tp_descr_set, slot_tp_descr_set, wrap_descr_delete, "__delete__($self, instance, /)\n--\n\nDelete an attribute of instance."), - FLSLOT("__init__", tp_init, slot_tp_init, (wrapperfunc)wrap_init, + FLSLOT("__init__", tp_init, slot_tp_init, (wrapperfunc)(void(*)(void))wrap_init, "__init__($self, /, *args, **kwargs)\n--\n\n" "Initialize self. See help(type(self)) for accurate signature.", PyWrapperFlag_KEYWORDS), From 43d812692f9207520e1169ff88cd8d6c59cc4804 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 29 Nov 2018 12:39:04 -0800 Subject: [PATCH 2033/2287] [3.7] bpo-34279: Synchronize regrtest with master (GH-10800) * bpo-34605, libregrtest: Rename --slaveargs to --worker-args (GH-9099) Rename also run_tests_slave() to run_tests_worker(). (cherry picked from commit 012f5b968a738b15ae9b40c499a1c0778b0615a9) * bpo-34279, regrtest: Issue a warning if no tests have been executed (GH-10150) (cherry picked from commit 9724348b43a9005a449ba532ccd3c6726f031097) * test_regrtest: remove unused threading import (cherry picked from commit 8a73cac618a050f4e74eb38ff43e48d9957a6dec) Co-authored-by: Victor Stinner --- Lib/test/libregrtest/cmdline.py | 2 +- Lib/test/libregrtest/main.py | 19 +++- Lib/test/libregrtest/runtest.py | 5 + Lib/test/libregrtest/runtest_mp.py | 14 +-- Lib/test/support/__init__.py | 7 +- Lib/test/test_regrtest.py | 94 +++++++++++++++++-- .../2018-10-27-13-41-55.bpo-34279.v0Xqxe.rst | 3 + 7 files changed, 122 insertions(+), 22 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2018-10-27-13-41-55.bpo-34279.v0Xqxe.rst diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index 2af839a182dbdb..538ff05489ea9a 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -170,7 +170,7 @@ def _create_parser(): group.add_argument('--wait', action='store_true', help='wait for user input, e.g., allow a debugger ' 'to be attached') - group.add_argument('--slaveargs', metavar='ARGS') + group.add_argument('--worker-args', metavar='ARGS') group.add_argument('-S', '--start', metavar='START', help='the name of the test at which to start.' + more_details) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index b491a08c2424ef..b6d05f63d32dca 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -14,7 +14,7 @@ from test.libregrtest.runtest import ( findtests, runtest, get_abs_module, STDTESTS, NOTTESTS, PASSED, FAILED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED, - INTERRUPTED, CHILD_ERROR, + INTERRUPTED, CHILD_ERROR, TEST_DID_NOT_RUN, PROGRESS_MIN_TIME, format_test_result) from test.libregrtest.setup import setup_tests from test.libregrtest.utils import removepy, count, format_duration, printlist @@ -79,6 +79,7 @@ def __init__(self): self.resource_denieds = [] self.environment_changed = [] self.rerun = [] + self.run_no_tests = [] self.first_result = None self.interrupted = False @@ -118,6 +119,8 @@ def accumulate_result(self, test, result): elif ok == RESOURCE_DENIED: self.skipped.append(test) self.resource_denieds.append(test) + elif ok == TEST_DID_NOT_RUN: + self.run_no_tests.append(test) elif ok != INTERRUPTED: raise ValueError("invalid test result: %r" % ok) @@ -368,6 +371,11 @@ def display_result(self): print("%s:" % count(len(self.rerun), "re-run test")) printlist(self.rerun) + if self.run_no_tests: + print() + print(count(len(self.run_no_tests), "test"), "run no tests:") + printlist(self.run_no_tests) + def run_tests_sequential(self): if self.ns.trace: import trace @@ -458,6 +466,9 @@ def get_tests_result(self): result.append("FAILURE") elif self.ns.fail_env_changed and self.environment_changed: result.append("ENV CHANGED") + elif not any((self.good, self.bad, self.skipped, self.interrupted, + self.environment_changed)): + result.append("NO TEST RUN") if self.interrupted: result.append("INTERRUPTED") @@ -582,9 +593,9 @@ def _main(self, tests, kwargs): print(msg, file=sys.stderr, flush=True) sys.exit(2) - if self.ns.slaveargs is not None: - from test.libregrtest.runtest_mp import run_tests_slave - run_tests_slave(self.ns.slaveargs) + if self.ns.worker_args is not None: + from test.libregrtest.runtest_mp import run_tests_worker + run_tests_worker(self.ns.worker_args) if self.ns.wait: input("Press any key to continue...") diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index 4f41080d37b998..466b522db9ed0d 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -19,6 +19,7 @@ RESOURCE_DENIED = -3 INTERRUPTED = -4 CHILD_ERROR = -5 # error in a child process +TEST_DID_NOT_RUN = -6 # error in a child process _FORMAT_TEST_RESULT = { PASSED: '%s passed', @@ -28,6 +29,7 @@ RESOURCE_DENIED: '%s skipped (resource denied)', INTERRUPTED: '%s interrupted', CHILD_ERROR: '%s crashed', + TEST_DID_NOT_RUN: '%s run no tests', } # Minimum duration of a test to display its duration or to mention that @@ -94,6 +96,7 @@ def runtest(ns, test): ENV_CHANGED test failed because it changed the execution environment FAILED test failed PASSED test passed + EMPTY_TEST_SUITE test ran no subtests. If ns.xmlpath is not None, xml_data is a list containing each generated testsuite element. @@ -197,6 +200,8 @@ def test_runner(): else: print("test", test, "failed", file=sys.stderr, flush=True) return FAILED, test_time + except support.TestDidNotRun: + return TEST_DID_NOT_RUN, test_time except: msg = traceback.format_exc() if not ns.pgo: diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index e5e808a6aa53da..fdbd73313bc0dd 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -28,23 +28,23 @@ def run_test_in_subprocess(testname, ns): - """Run the given test in a subprocess with --slaveargs. + """Run the given test in a subprocess with --worker-args. ns is the option Namespace parsed from command-line arguments. regrtest - is invoked in a subprocess with the --slaveargs argument; when the + is invoked in a subprocess with the --worker-args argument; when the subprocess exits, its return code, stdout and stderr are returned as a 3-tuple. """ from subprocess import Popen, PIPE ns_dict = vars(ns) - slaveargs = (ns_dict, testname) - slaveargs = json.dumps(slaveargs) + worker_args = (ns_dict, testname) + worker_args = json.dumps(worker_args) cmd = [sys.executable, *support.args_from_interpreter_flags(), '-u', # Unbuffered stdout and stderr '-m', 'test.regrtest', - '--slaveargs', slaveargs] + '--worker-args', worker_args] if ns.pgo: cmd += ['--pgo'] @@ -62,8 +62,8 @@ def run_test_in_subprocess(testname, ns): return retcode, stdout, stderr -def run_tests_slave(slaveargs): - ns_dict, testname = json.loads(slaveargs) +def run_tests_worker(worker_args): + ns_dict, testname = json.loads(worker_args) ns = types.SimpleNamespace(**ns_dict) setup_tests(ns) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 7c16c985db28ea..c0627dc14ef067 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -74,7 +74,7 @@ # globals "PIPE_MAX_SIZE", "verbose", "max_memuse", "use_resources", "failfast", # exceptions - "Error", "TestFailed", "ResourceDenied", + "Error", "TestFailed", "TestDidNotRun", "ResourceDenied", # imports "import_module", "import_fresh_module", "CleanImport", # modules @@ -120,6 +120,9 @@ class Error(Exception): class TestFailed(Error): """Test failed.""" +class TestDidNotRun(Error): + """Test did not run any subtests.""" + class ResourceDenied(unittest.SkipTest): """Test skipped because it requested a disallowed resource. @@ -1916,6 +1919,8 @@ def _run_suite(suite): if junit_xml_list is not None: junit_xml_list.append(result.get_xml_element()) + if not result.testsRun: + raise TestDidNotRun if not result.wasSuccessful(): if len(result.errors) == 1 and not result.failures: err = result.errors[0][1] diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 0b590ad8f188cf..5347bb171839f4 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -66,10 +66,10 @@ def test_wait(self): ns = libregrtest._parse_args(['--wait']) self.assertTrue(ns.wait) - def test_slaveargs(self): - ns = libregrtest._parse_args(['--slaveargs', '[[], {}]']) - self.assertEqual(ns.slaveargs, '[[], {}]') - self.checkError(['--slaveargs'], 'expected one argument') + def test_worker_args(self): + ns = libregrtest._parse_args(['--worker-args', '[[], {}]']) + self.assertEqual(ns.worker_args, '[[], {}]') + self.checkError(['--worker-args'], 'expected one argument') def test_start(self): for opt in '-S', '--start': @@ -351,11 +351,20 @@ def setUp(self): self.tmptestdir = tempfile.mkdtemp() self.addCleanup(support.rmtree, self.tmptestdir) - def create_test(self, name=None, code=''): + def create_test(self, name=None, code=None): if not name: name = 'noop%s' % BaseTestCase.TEST_UNIQUE_ID BaseTestCase.TEST_UNIQUE_ID += 1 + if code is None: + code = textwrap.dedent(""" + import unittest + + class Tests(unittest.TestCase): + def test_empty_test(self): + pass + """) + # test_regrtest cannot be run twice in parallel because # of setUp() and create_test() name = self.TESTNAME_PREFIX + name @@ -390,7 +399,7 @@ def parse_executed_tests(self, output): def check_executed_tests(self, output, tests, skipped=(), failed=(), env_changed=(), omitted=(), - rerun=(), + rerun=(), no_test_ran=(), randomize=False, interrupted=False, fail_env_changed=False): if isinstance(tests, str): @@ -405,6 +414,8 @@ def check_executed_tests(self, output, tests, skipped=(), failed=(), omitted = [omitted] if isinstance(rerun, str): rerun = [rerun] + if isinstance(no_test_ran, str): + no_test_ran = [no_test_ran] executed = self.parse_executed_tests(output) if randomize: @@ -447,8 +458,12 @@ def list_regex(line_format, tests): regex = "Re-running test %r in verbose mode" % name self.check_line(output, regex) + if no_test_ran: + regex = list_regex('%s test%s run no tests', no_test_ran) + self.check_line(output, regex) + good = (len(tests) - len(skipped) - len(failed) - - len(omitted) - len(env_changed)) + - len(omitted) - len(env_changed) - len(no_test_ran)) if good: regex = r'%s test%s OK\.$' % (good, plural(good)) if not skipped and not failed and good > 1: @@ -465,12 +480,16 @@ def list_regex(line_format, tests): result.append('ENV CHANGED') if interrupted: result.append('INTERRUPTED') - if not result: + if not any((good, result, failed, interrupted, skipped, + env_changed, fail_env_changed)): + result.append("NO TEST RUN") + elif not result: result.append('SUCCESS') result = ', '.join(result) if rerun: self.check_line(output, 'Tests result: %s' % result) result = 'FAILURE then %s' % result + self.check_line(output, 'Tests result: %s' % result) def parse_random_seed(self, output): @@ -649,7 +668,14 @@ def test_resources(self): # test -u command line option tests = {} for resource in ('audio', 'network'): - code = 'from test import support\nsupport.requires(%r)' % resource + code = textwrap.dedent(""" + from test import support; support.requires(%r) + import unittest + class PassingTest(unittest.TestCase): + def test_pass(self): + pass + """ % resource) + tests[resource] = self.create_test(resource, code) test_names = sorted(tests.values()) @@ -983,6 +1009,56 @@ def test_bug(self): output = self.run_tests("-w", testname, exitcode=2) self.check_executed_tests(output, [testname], failed=testname, rerun=testname) + def test_no_tests_ran(self): + code = textwrap.dedent(""" + import unittest + + class Tests(unittest.TestCase): + def test_bug(self): + pass + """) + testname = self.create_test(code=code) + + output = self.run_tests(testname, "-m", "nosuchtest", exitcode=0) + self.check_executed_tests(output, [testname], no_test_ran=testname) + + def test_no_tests_ran_multiple_tests_nonexistent(self): + code = textwrap.dedent(""" + import unittest + + class Tests(unittest.TestCase): + def test_bug(self): + pass + """) + testname = self.create_test(code=code) + testname2 = self.create_test(code=code) + + output = self.run_tests(testname, testname2, "-m", "nosuchtest", exitcode=0) + self.check_executed_tests(output, [testname, testname2], + no_test_ran=[testname, testname2]) + + def test_no_test_ran_some_test_exist_some_not(self): + code = textwrap.dedent(""" + import unittest + + class Tests(unittest.TestCase): + def test_bug(self): + pass + """) + testname = self.create_test(code=code) + other_code = textwrap.dedent(""" + import unittest + + class Tests(unittest.TestCase): + def test_other_bug(self): + pass + """) + testname2 = self.create_test(code=other_code) + + output = self.run_tests(testname, testname2, "-m", "nosuchtest", + "-m", "test_other_bug", exitcode=0) + self.check_executed_tests(output, [testname, testname2], + no_test_ran=[testname]) class TestUtils(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Tests/2018-10-27-13-41-55.bpo-34279.v0Xqxe.rst b/Misc/NEWS.d/next/Tests/2018-10-27-13-41-55.bpo-34279.v0Xqxe.rst new file mode 100644 index 00000000000000..a82fa6b304ac1b --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2018-10-27-13-41-55.bpo-34279.v0Xqxe.rst @@ -0,0 +1,3 @@ +regrtest issue a warning when no tests have been executed in a particular +test file. Also, a new final result state is issued if no test have been +executed across all test files. Patch by Pablo Galindo. From 3473ca424142cb8f1453ba802ba642060b5ce779 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 29 Nov 2018 23:59:41 -0800 Subject: [PATCH 2034/2287] bpo-35356: Fix a possible reference leak in nis.maps(). (GH-10808) (cherry picked from commit a2e3585e79c93b2372dbad46a744e28fcc6dad6d) Co-authored-by: Zackery Spytz --- Modules/nismodule.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/nismodule.c b/Modules/nismodule.c index a9028bbfe54c6c..11df679b745b86 100644 --- a/Modules/nismodule.c +++ b/Modules/nismodule.c @@ -412,6 +412,7 @@ nis_maps (PyObject *self, PyObject *args, PyObject *kwdict) PyObject *str = PyUnicode_FromString(maps->map); if (!str || PyList_Append(list, str) < 0) { + Py_XDECREF(str); Py_DECREF(list); list = NULL; break; From af7e81f71858519de8d2bafcb38fce8cca86aa0a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 30 Nov 2018 03:51:42 -0800 Subject: [PATCH 2035/2287] bpo-35347: Fix test_socket.NonBlockingTCPTests (GH-10791) testAccept() and testRecv() of test_socket.NonBlockingTCPTests have a race condition: time.sleep() is used as a weak synchronization primitive and the tests fail randomly on slow buildbots. Use a reliable threading.Event to fix these tests. Other changes: * Replace send() with sendall() * Expect specific BlockingIOError rather than generic OSError * Add a timeout to select() in testAccept() and testRecv() * Use addCleanup() to close sockets * Use assertRaises() (cherry picked from commit ebd5d6d6e6e4e751ba9c7534004aadfc27ba9265) Co-authored-by: Victor Stinner --- Lib/test/test_socket.py | 64 +++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index fbbc9f9abfb034..6b7afba49d9eb0 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -32,6 +32,7 @@ HOST = support.HOST MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return +MAIN_TIMEOUT = 60.0 try: import _thread as thread @@ -3870,6 +3871,7 @@ def _testSend(self): class NonBlockingTCPTests(ThreadedTCPSocketTest): def __init__(self, methodName='runTest'): + self.event = threading.Event() ThreadedTCPSocketTest.__init__(self, methodName=methodName) def testSetBlocking(self): @@ -3944,22 +3946,27 @@ def _testInheritFlags(self): def testAccept(self): # Testing non-blocking accept self.serv.setblocking(0) - try: - conn, addr = self.serv.accept() - except OSError: - pass - else: - self.fail("Error trying to do non-blocking accept.") - read, write, err = select.select([self.serv], [], []) - if self.serv in read: + + # connect() didn't start: non-blocking accept() fails + with self.assertRaises(BlockingIOError): conn, addr = self.serv.accept() - self.assertIsNone(conn.gettimeout()) - conn.close() - else: + + self.event.set() + + read, write, err = select.select([self.serv], [], [], MAIN_TIMEOUT) + if self.serv not in read: self.fail("Error trying to do accept after select.") + # connect() completed: non-blocking accept() doesn't block + conn, addr = self.serv.accept() + self.addCleanup(conn.close) + self.assertIsNone(conn.gettimeout()) + def _testAccept(self): - time.sleep(0.1) + # don't connect before event is set to check + # that non-blocking accept() raises BlockingIOError + self.event.wait() + self.cli.connect((HOST, self.port)) def testConnect(self): @@ -3974,25 +3981,32 @@ def _testConnect(self): def testRecv(self): # Testing non-blocking recv conn, addr = self.serv.accept() + self.addCleanup(conn.close) conn.setblocking(0) - try: - msg = conn.recv(len(MSG)) - except OSError: - pass - else: - self.fail("Error trying to do non-blocking recv.") - read, write, err = select.select([conn], [], []) - if conn in read: + + # the server didn't send data yet: non-blocking recv() fails + with self.assertRaises(BlockingIOError): msg = conn.recv(len(MSG)) - conn.close() - self.assertEqual(msg, MSG) - else: + + self.event.set() + + read, write, err = select.select([conn], [], [], MAIN_TIMEOUT) + if conn not in read: self.fail("Error during select call to non-blocking socket.") + # the server sent data yet: non-blocking recv() doesn't block + msg = conn.recv(len(MSG)) + self.assertEqual(msg, MSG) + def _testRecv(self): self.cli.connect((HOST, self.port)) - time.sleep(0.1) - self.cli.send(MSG) + + # don't send anything before event is set to check + # that non-blocking recv() raises BlockingIOError + self.event.wait() + + # send data: recv() will no longer block + self.cli.sendall(MSG) @unittest.skipUnless(thread, 'Threading required for this test.') class FileObjectClassTestCase(SocketConnectedTest): From 03b1200dfd03061e9ad0bff8199967bd80b9b900 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 30 Nov 2018 17:04:46 +0100 Subject: [PATCH 2036/2287] bpo-33015: Fix UB in pthread PyThread_start_new_thread (GH-6008) (GH-10822) Fix an undefined behaviour in the pthread implementation of PyThread_start_new_thread(): add a function wrapper to always return NULL. Add pythread_callback struct and pythread_wrapper() to thread_pthread.h. (cherry picked from commit 9eea6eaf23067880f4af3a130e3f67c9812e2f30) --- .../2018-08-24-09-48-25.bpo-33015.s21y74.rst | 3 ++ Python/thread_pthread.h | 40 +++++++++++++++++-- 2 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2018-08-24-09-48-25.bpo-33015.s21y74.rst diff --git a/Misc/NEWS.d/next/Build/2018-08-24-09-48-25.bpo-33015.s21y74.rst b/Misc/NEWS.d/next/Build/2018-08-24-09-48-25.bpo-33015.s21y74.rst new file mode 100644 index 00000000000000..8c5a0c91a46b46 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2018-08-24-09-48-25.bpo-33015.s21y74.rst @@ -0,0 +1,3 @@ +Fix an undefined behaviour in the pthread implementation of +:c:func:`PyThread_start_new_thread`: add a function wrapper to always return +``NULL``. diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 3607341eaa587b..baea71f9c33e94 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -183,6 +183,28 @@ PyThread__init_thread(void) * Thread support. */ +/* bpo-33015: pythread_callback struct and pythread_wrapper() cast + "void func(void *)" to "void* func(void *)": always return NULL. + + PyThread_start_new_thread() uses "void func(void *)" type, whereas + pthread_create() requires a void* return value. */ +typedef struct { + void (*func) (void *); + void *arg; +} pythread_callback; + +static void * +pythread_wrapper(void *arg) +{ + /* copy func and func_arg and free the temporary structure */ + pythread_callback *callback = arg; + void (*func)(void *) = callback->func; + void *func_arg = callback->arg; + PyMem_RawFree(arg); + + func(func_arg); + return NULL; +} long PyThread_start_new_thread(void (*func)(void *), void *arg) @@ -218,21 +240,31 @@ PyThread_start_new_thread(void (*func)(void *), void *arg) pthread_attr_setscope(&attrs, PTHREAD_SCOPE_SYSTEM); #endif + pythread_callback *callback = PyMem_RawMalloc(sizeof(pythread_callback)); + + if (callback == NULL) { + return -1; + } + + callback->func = func; + callback->arg = arg; + status = pthread_create(&th, #if defined(THREAD_STACK_SIZE) || defined(PTHREAD_SYSTEM_SCHED_SUPPORTED) &attrs, #else (pthread_attr_t*)NULL, #endif - (void* (*)(void *))func, - (void *)arg - ); + pythread_wrapper, callback); #if defined(THREAD_STACK_SIZE) || defined(PTHREAD_SYSTEM_SCHED_SUPPORTED) pthread_attr_destroy(&attrs); #endif - if (status != 0) + + if (status != 0) { + PyMem_RawFree(callback); return -1; + } pthread_detach(th); From 02250e57c37339ea6de08ab077a307e75eef02f5 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 30 Nov 2018 20:44:43 +0100 Subject: [PATCH 2037/2287] bpo-35352: test_asyncio uses the certificate set from the test directory (GH-10826) (GH-10832) Modify asyncio tests to utilize the certificates from the test directory instead of its own set, as they are the same and with each update they had to be updated as well. (cherry picked from commit b062ba77b617b0f89b7ea25d14cc77c991462ad4) --- Lib/asyncio/test_utils.py | 23 ++++-- Lib/test/test_asyncio/keycert3.pem | 73 ----------------- Lib/test/test_asyncio/pycacert.pem | 78 ------------------- Lib/test/test_asyncio/ssl_cert.pem | 15 ---- Lib/test/test_asyncio/ssl_key.pem | 16 ---- Lib/test/test_asyncio/test_events.py | 18 +---- .../2018-11-30-17-18-56.bpo-35352.8bD7GC.rst | 1 + 7 files changed, 21 insertions(+), 203 deletions(-) delete mode 100644 Lib/test/test_asyncio/keycert3.pem delete mode 100644 Lib/test/test_asyncio/pycacert.pem delete mode 100644 Lib/test/test_asyncio/ssl_cert.pem delete mode 100644 Lib/test/test_asyncio/ssl_key.pem create mode 100644 Misc/NEWS.d/next/Tests/2018-11-30-17-18-56.bpo-35352.8bD7GC.rst diff --git a/Lib/asyncio/test_utils.py b/Lib/asyncio/test_utils.py index f41720428cecd2..116b3fcb3e2540 100644 --- a/Lib/asyncio/test_utils.py +++ b/Lib/asyncio/test_utils.py @@ -42,6 +42,21 @@ from socket import socketpair # pragma: no cover +def data_file(filename): + if hasattr(support, 'TEST_HOME_DIR'): + fullname = os.path.join(support.TEST_HOME_DIR, filename) + if os.path.isfile(fullname): + return fullname + fullname = os.path.join(os.path.dirname(os.__file__), 'test', filename) + if os.path.isfile(fullname): + return fullname + raise FileNotFoundError(filename) + + +ONLYCERT = data_file('ssl_cert.pem') +ONLYKEY = data_file('ssl_key.pem') + + def dummy_ssl_context(): if ssl is None: return None @@ -114,12 +129,8 @@ def finish_request(self, request, client_address): # contains the ssl key and certificate files) differs # between the stdlib and stand-alone asyncio. # Prefer our own if we can find it. - here = os.path.join(os.path.dirname(__file__), '..', 'tests') - if not os.path.isdir(here): - here = os.path.join(os.path.dirname(os.__file__), - 'test', 'test_asyncio') - keyfile = os.path.join(here, 'ssl_key.pem') - certfile = os.path.join(here, 'ssl_cert.pem') + keyfile = ONLYKEY + certfile = ONLYCERT context = ssl.SSLContext() context.load_cert_chain(certfile, keyfile) diff --git a/Lib/test/test_asyncio/keycert3.pem b/Lib/test/test_asyncio/keycert3.pem deleted file mode 100644 index 5bfa62c4ca30b2..00000000000000 --- a/Lib/test/test_asyncio/keycert3.pem +++ /dev/null @@ -1,73 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMLgD0kAKDb5cFyP -jbwNfR5CtewdXC+kMXAWD8DLxiTTvhMW7qVnlwOm36mZlszHKvsRf05lT4pegiFM -9z2j1OlaN+ci/X7NU22TNN6crYSiN77FjYJP464j876ndSxyD+rzys386T+1r1aZ -aggEdkj1TsSsv1zWIYKlPIjlvhuxAgMBAAECgYA0aH+T2Vf3WOPv8KdkcJg6gCRe -yJKXOWgWRcicx/CUzOEsTxmFIDPLxqAWA3k7v0B+3vjGw5Y9lycV/5XqXNoQI14j -y09iNsumds13u5AKkGdTJnZhQ7UKdoVHfuP44ZdOv/rJ5/VD6F4zWywpe90pcbK+ -AWDVtusgGQBSieEl1QJBAOyVrUG5l2yoUBtd2zr/kiGm/DYyXlIthQO/A3/LngDW -5/ydGxVsT7lAVOgCsoT+0L4efTh90PjzW8LPQrPBWVMCQQDS3h/FtYYd5lfz+FNL -9CEe1F1w9l8P749uNUD0g317zv1tatIqVCsQWHfVHNdVvfQ+vSFw38OORO00Xqs9 -1GJrAkBkoXXEkxCZoy4PteheO/8IWWLGGr6L7di6MzFl1lIqwT6D8L9oaV2vynFT -DnKop0pa09Unhjyw57KMNmSE2SUJAkEArloTEzpgRmCq4IK2/NpCeGdHS5uqRlbh -1VIa/xGps7EWQl5Mn8swQDel/YP3WGHTjfx7pgSegQfkyaRtGpZ9OQJAa9Vumj8m -JAAtI0Bnga8hgQx7BhTQY4CadDxyiRGOGYhwUzYVCqkb2sbVRH9HnwUaJT7cWBY3 -RnJdHOMXWem7/w== ------END PRIVATE KEY----- -Certificate: - Data: - Version: 1 (0x0) - Serial Number: 12723342612721443281 (0xb09264b1f2da21d1) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=XY, O=Python Software Foundation CA, CN=our-ca-server - Validity - Not Before: Jan 4 19:47:07 2013 GMT - Not After : Nov 13 19:47:07 2022 GMT - Subject: C=XY, L=Castle Anthrax, O=Python Software Foundation, CN=localhost - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (1024 bit) - Modulus: - 00:c2:e0:0f:49:00:28:36:f9:70:5c:8f:8d:bc:0d: - 7d:1e:42:b5:ec:1d:5c:2f:a4:31:70:16:0f:c0:cb: - c6:24:d3:be:13:16:ee:a5:67:97:03:a6:df:a9:99: - 96:cc:c7:2a:fb:11:7f:4e:65:4f:8a:5e:82:21:4c: - f7:3d:a3:d4:e9:5a:37:e7:22:fd:7e:cd:53:6d:93: - 34:de:9c:ad:84:a2:37:be:c5:8d:82:4f:e3:ae:23: - f3:be:a7:75:2c:72:0f:ea:f3:ca:cd:fc:e9:3f:b5: - af:56:99:6a:08:04:76:48:f5:4e:c4:ac:bf:5c:d6: - 21:82:a5:3c:88:e5:be:1b:b1 - Exponent: 65537 (0x10001) - Signature Algorithm: sha1WithRSAEncryption - 2f:42:5f:a3:09:2c:fa:51:88:c7:37:7f:ea:0e:63:f0:a2:9a: - e5:5a:e2:c8:20:f0:3f:60:bc:c8:0f:b6:c6:76:ce:db:83:93: - f5:a3:33:67:01:8e:04:cd:00:9a:73:fd:f3:35:86:fa:d7:13: - e2:46:c6:9d:c0:29:53:d4:a9:90:b8:77:4b:e6:83:76:e4:92: - d6:9c:50:cf:43:d0:c6:01:77:61:9a:de:9b:70:f7:72:cd:59: - 00:31:69:d9:b4:ca:06:9c:6d:c3:c7:80:8c:68:e6:b5:a2:f8: - ef:1d:bb:16:9f:77:77:ef:87:62:22:9b:4d:69:a4:3a:1a:f1: - 21:5e:8c:32:ac:92:fd:15:6b:18:c2:7f:15:0d:98:30:ca:75: - 8f:1a:71:df:da:1d:b2:ef:9a:e8:2d:2e:02:fd:4a:3c:aa:96: - 0b:06:5d:35:b3:3d:24:87:4b:e0:b0:58:60:2f:45:ac:2e:48: - 8a:b0:99:10:65:27:ff:cc:b1:d8:fd:bd:26:6b:b9:0c:05:2a: - f4:45:63:35:51:07:ed:83:85:fe:6f:69:cb:bb:40:a8:ae:b6: - 3b:56:4a:2d:a4:ed:6d:11:2c:4d:ed:17:24:fd:47:bc:d3:41: - a2:d3:06:fe:0c:90:d8:d8:94:26:c4:ff:cc:a1:d8:42:77:eb: - fc:a9:94:71 ------BEGIN CERTIFICATE----- -MIICpDCCAYwCCQCwkmSx8toh0TANBgkqhkiG9w0BAQUFADBNMQswCQYDVQQGEwJY -WTEmMCQGA1UECgwdUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gQ0ExFjAUBgNV -BAMMDW91ci1jYS1zZXJ2ZXIwHhcNMTMwMTA0MTk0NzA3WhcNMjIxMTEzMTk0NzA3 -WjBfMQswCQYDVQQGEwJYWTEXMBUGA1UEBxMOQ2FzdGxlIEFudGhyYXgxIzAhBgNV -BAoTGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uMRIwEAYDVQQDEwlsb2NhbGhv -c3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMLgD0kAKDb5cFyPjbwNfR5C -tewdXC+kMXAWD8DLxiTTvhMW7qVnlwOm36mZlszHKvsRf05lT4pegiFM9z2j1Ola -N+ci/X7NU22TNN6crYSiN77FjYJP464j876ndSxyD+rzys386T+1r1aZaggEdkj1 -TsSsv1zWIYKlPIjlvhuxAgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAC9CX6MJLPpR -iMc3f+oOY/CimuVa4sgg8D9gvMgPtsZ2ztuDk/WjM2cBjgTNAJpz/fM1hvrXE+JG -xp3AKVPUqZC4d0vmg3bkktacUM9D0MYBd2Ga3ptw93LNWQAxadm0ygacbcPHgIxo -5rWi+O8duxafd3fvh2Iim01ppDoa8SFejDKskv0VaxjCfxUNmDDKdY8acd/aHbLv -mugtLgL9SjyqlgsGXTWzPSSHS+CwWGAvRawuSIqwmRBlJ//Msdj9vSZruQwFKvRF -YzVRB+2Dhf5vacu7QKiutjtWSi2k7W0RLE3tFyT9R7zTQaLTBv4MkNjYlCbE/8yh -2EJ36/yplHE= ------END CERTIFICATE----- diff --git a/Lib/test/test_asyncio/pycacert.pem b/Lib/test/test_asyncio/pycacert.pem deleted file mode 100644 index 09b1f3e08aee61..00000000000000 --- a/Lib/test/test_asyncio/pycacert.pem +++ /dev/null @@ -1,78 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 12723342612721443280 (0xb09264b1f2da21d0) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=XY, O=Python Software Foundation CA, CN=our-ca-server - Validity - Not Before: Jan 4 19:47:07 2013 GMT - Not After : Jan 2 19:47:07 2023 GMT - Subject: C=XY, O=Python Software Foundation CA, CN=our-ca-server - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:e7:de:e9:e3:0c:9f:00:b6:a1:fd:2b:5b:96:d2: - 6f:cc:e0:be:86:b9:20:5e:ec:03:7a:55:ab:ea:a4: - e9:f9:49:85:d2:66:d5:ed:c7:7a:ea:56:8e:2d:8f: - e7:42:e2:62:28:a9:9f:d6:1b:8e:eb:b5:b4:9c:9f: - 14:ab:df:e6:94:8b:76:1d:3e:6d:24:61:ed:0c:bf: - 00:8a:61:0c:df:5c:c8:36:73:16:00:cd:47:ba:6d: - a4:a4:74:88:83:23:0a:19:fc:09:a7:3c:4a:4b:d3: - e7:1d:2d:e4:ea:4c:54:21:f3:26:db:89:37:18:d4: - 02:bb:40:32:5f:a4:ff:2d:1c:f7:d4:bb:ec:8e:cf: - 5c:82:ac:e6:7c:08:6c:48:85:61:07:7f:25:e0:5c: - e0:bc:34:5f:e0:b9:04:47:75:c8:47:0b:8d:bc:d6: - c8:68:5f:33:83:62:d2:20:44:35:b1:ad:81:1a:8a: - cd:bc:35:b0:5c:8b:47:d6:18:e9:9c:18:97:cc:01: - 3c:29:cc:e8:1e:e4:e4:c1:b8:de:e7:c2:11:18:87: - 5a:93:34:d8:a6:25:f7:14:71:eb:e4:21:a2:d2:0f: - 2e:2e:d4:62:00:35:d3:d6:ef:5c:60:4b:4c:a9:14: - e2:dd:15:58:46:37:33:26:b7:e7:2e:5d:ed:42:e4: - c5:4d - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Subject Key Identifier: - BC:DD:62:D9:76:DA:1B:D2:54:6B:CF:E0:66:9B:1E:1E:7B:56:0C:0B - X509v3 Authority Key Identifier: - keyid:BC:DD:62:D9:76:DA:1B:D2:54:6B:CF:E0:66:9B:1E:1E:7B:56:0C:0B - - X509v3 Basic Constraints: - CA:TRUE - Signature Algorithm: sha1WithRSAEncryption - 7d:0a:f5:cb:8d:d3:5d:bd:99:8e:f8:2b:0f:ba:eb:c2:d9:a6: - 27:4f:2e:7b:2f:0e:64:d8:1c:35:50:4e:ee:fc:90:b9:8d:6d: - a8:c5:c6:06:b0:af:f3:2d:bf:3b:b8:42:07:dd:18:7d:6d:95: - 54:57:85:18:60:47:2f:eb:78:1b:f9:e8:17:fd:5a:0d:87:17: - 28:ac:4c:6a:e6:bc:29:f4:f4:55:70:29:42:de:85:ea:ab:6c: - 23:06:64:30:75:02:8e:53:bc:5e:01:33:37:cc:1e:cd:b8:a4: - fd:ca:e4:5f:65:3b:83:1c:86:f1:55:02:a0:3a:8f:db:91:b7: - 40:14:b4:e7:8d:d2:ee:73:ba:e3:e5:34:2d:bc:94:6f:4e:24: - 06:f7:5f:8b:0e:a7:8e:6b:de:5e:75:f4:32:9a:50:b1:44:33: - 9a:d0:05:e2:78:82:ff:db:da:8a:63:eb:a9:dd:d1:bf:a0:61: - ad:e3:9e:8a:24:5d:62:0e:e7:4c:91:7f:ef:df:34:36:3b:2f: - 5d:f5:84:b2:2f:c4:6d:93:96:1a:6f:30:28:f1:da:12:9a:64: - b4:40:33:1d:bd:de:2b:53:a8:ea:be:d6:bc:4e:96:f5:44:fb: - 32:18:ae:d5:1f:f6:69:af:b6:4e:7b:1d:58:ec:3b:a9:53:a3: - 5e:58:c8:9e ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIJALCSZLHy2iHQMA0GCSqGSIb3DQEBBQUAME0xCzAJBgNV -BAYTAlhZMSYwJAYDVQQKDB1QeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiBDQTEW -MBQGA1UEAwwNb3VyLWNhLXNlcnZlcjAeFw0xMzAxMDQxOTQ3MDdaFw0yMzAxMDIx -OTQ3MDdaME0xCzAJBgNVBAYTAlhZMSYwJAYDVQQKDB1QeXRob24gU29mdHdhcmUg -Rm91bmRhdGlvbiBDQTEWMBQGA1UEAwwNb3VyLWNhLXNlcnZlcjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAOfe6eMMnwC2of0rW5bSb8zgvoa5IF7sA3pV -q+qk6flJhdJm1e3HeupWji2P50LiYiipn9Ybjuu1tJyfFKvf5pSLdh0+bSRh7Qy/ -AIphDN9cyDZzFgDNR7ptpKR0iIMjChn8Cac8SkvT5x0t5OpMVCHzJtuJNxjUArtA -Ml+k/y0c99S77I7PXIKs5nwIbEiFYQd/JeBc4Lw0X+C5BEd1yEcLjbzWyGhfM4Ni -0iBENbGtgRqKzbw1sFyLR9YY6ZwYl8wBPCnM6B7k5MG43ufCERiHWpM02KYl9xRx -6+QhotIPLi7UYgA109bvXGBLTKkU4t0VWEY3Mya35y5d7ULkxU0CAwEAAaNQME4w -HQYDVR0OBBYEFLzdYtl22hvSVGvP4GabHh57VgwLMB8GA1UdIwQYMBaAFLzdYtl2 -2hvSVGvP4GabHh57VgwLMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AH0K9cuN0129mY74Kw+668LZpidPLnsvDmTYHDVQTu78kLmNbajFxgawr/Mtvzu4 -QgfdGH1tlVRXhRhgRy/reBv56Bf9Wg2HFyisTGrmvCn09FVwKULeheqrbCMGZDB1 -Ao5TvF4BMzfMHs24pP3K5F9lO4MchvFVAqA6j9uRt0AUtOeN0u5zuuPlNC28lG9O -JAb3X4sOp45r3l519DKaULFEM5rQBeJ4gv/b2opj66nd0b+gYa3jnookXWIO50yR -f+/fNDY7L131hLIvxG2TlhpvMCjx2hKaZLRAMx293itTqOq+1rxOlvVE+zIYrtUf -9mmvtk57HVjsO6lTo15YyJ4= ------END CERTIFICATE----- diff --git a/Lib/test/test_asyncio/ssl_cert.pem b/Lib/test/test_asyncio/ssl_cert.pem deleted file mode 100644 index 47a7d7e37e809f..00000000000000 --- a/Lib/test/test_asyncio/ssl_cert.pem +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICVDCCAb2gAwIBAgIJANfHOBkZr8JOMA0GCSqGSIb3DQEBBQUAMF8xCzAJBgNV -BAYTAlhZMRcwFQYDVQQHEw5DYXN0bGUgQW50aHJheDEjMCEGA1UEChMaUHl0aG9u -IFNvZnR3YXJlIEZvdW5kYXRpb24xEjAQBgNVBAMTCWxvY2FsaG9zdDAeFw0xMDEw -MDgyMzAxNTZaFw0yMDEwMDUyMzAxNTZaMF8xCzAJBgNVBAYTAlhZMRcwFQYDVQQH -Ew5DYXN0bGUgQW50aHJheDEjMCEGA1UEChMaUHl0aG9uIFNvZnR3YXJlIEZvdW5k -YXRpb24xEjAQBgNVBAMTCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAw -gYkCgYEA21vT5isq7F68amYuuNpSFlKDPrMUCa4YWYqZRt2OZ+/3NKaZ2xAiSwr7 -6MrQF70t5nLbSPpqE5+5VrS58SY+g/sXLiFd6AplH1wJZwh78DofbFYXUggktFMt -pTyiX8jtP66bkcPkDADA089RI1TQR6Ca+n7HFa7c1fabVV6i3zkCAwEAAaMYMBYw -FAYDVR0RBA0wC4IJbG9jYWxob3N0MA0GCSqGSIb3DQEBBQUAA4GBAHPctQBEQ4wd -BJ6+JcpIraopLn8BGhbjNWj40mmRqWB/NAWF6M5ne7KpGAu7tLeG4hb1zLaldK8G -lxy2GPSRF6LFS48dpEj2HbMv2nvv6xxalDMJ9+DicWgAKTQ6bcX2j3GUkCR0g/T1 -CRlNBAAlvhKzO7Clpf9l0YKBEfraJByX ------END CERTIFICATE----- diff --git a/Lib/test/test_asyncio/ssl_key.pem b/Lib/test/test_asyncio/ssl_key.pem deleted file mode 100644 index 3fd3bbd54a3451..00000000000000 --- a/Lib/test/test_asyncio/ssl_key.pem +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANtb0+YrKuxevGpm -LrjaUhZSgz6zFAmuGFmKmUbdjmfv9zSmmdsQIksK++jK0Be9LeZy20j6ahOfuVa0 -ufEmPoP7Fy4hXegKZR9cCWcIe/A6H2xWF1IIJLRTLaU8ol/I7T+um5HD5AwAwNPP -USNU0Eegmvp+xxWu3NX2m1Veot85AgMBAAECgYA3ZdZ673X0oexFlq7AAmrutkHt -CL7LvwrpOiaBjhyTxTeSNWzvtQBkIU8DOI0bIazA4UreAFffwtvEuPmonDb3F+Iq -SMAu42XcGyVZEl+gHlTPU9XRX7nTOXVt+MlRRRxL6t9GkGfUAXI3XxJDXW3c0vBK -UL9xqD8cORXOfE06rQJBAP8mEX1ERkR64Ptsoe4281vjTlNfIbs7NMPkUnrn9N/Y -BLhjNIfQ3HFZG8BTMLfX7kCS9D593DW5tV4Z9BP/c6cCQQDcFzCcVArNh2JSywOQ -ZfTfRbJg/Z5Lt9Fkngv1meeGNPgIMLN8Sg679pAOOWmzdMO3V706rNPzSVMME7E5 -oPIfAkEA8pDddarP5tCvTTgUpmTFbakm0KoTZm2+FzHcnA4jRh+XNTjTOv98Y6Ik -eO5d1ZnKXseWvkZncQgxfdnMqqpj5wJAcNq/RVne1DbYlwWchT2Si65MYmmJ8t+F -0mcsULqjOnEMwf5e+ptq5LzwbyrHZYq5FNk7ocufPv/ZQrcSSC+cFwJBAKvOJByS -x56qyGeZLOQlWS2JS3KJo59XuLFGqcbgN9Om9xFa41Yb4N9NvplFivsvZdw3m1Q/ -SPIXQuT8RMPDVNQ= ------END PRIVATE KEY----- diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index b024ef4ca00785..91d8a964f16206 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -32,23 +32,13 @@ from asyncio import selector_events from asyncio import sslproto from asyncio import test_utils +from asyncio.test_utils import ONLYKEY, ONLYCERT, data_file try: from test import support except ImportError: from asyncio import test_support as support -def data_file(filename): - if hasattr(support, 'TEST_HOME_DIR'): - fullname = os.path.join(support.TEST_HOME_DIR, filename) - if os.path.isfile(fullname): - return fullname - fullname = os.path.join(os.path.dirname(__file__), filename) - if os.path.isfile(fullname): - return fullname - raise FileNotFoundError(filename) - - def osx_tiger(): """Return True if the platform is Mac OS 10.4 or older.""" if sys.platform != 'darwin': @@ -67,10 +57,8 @@ async def doit(): return loop.run_until_complete(doit()) -ONLYCERT = data_file('ssl_cert.pem') -ONLYKEY = data_file('ssl_key.pem') -SIGNED_CERTFILE = data_file('keycert3.pem') -SIGNING_CA = data_file('pycacert.pem') +SIGNED_CERTFILE = test_utils.data_file('keycert3.pem') +SIGNING_CA = test_utils.data_file('pycacert.pem') PEERCERT = { 'OCSP': ('http://testca.pythontest.net/testca/ocsp/',), 'caIssuers': ('http://testca.pythontest.net/testca/pycacert.cer',), diff --git a/Misc/NEWS.d/next/Tests/2018-11-30-17-18-56.bpo-35352.8bD7GC.rst b/Misc/NEWS.d/next/Tests/2018-11-30-17-18-56.bpo-35352.8bD7GC.rst new file mode 100644 index 00000000000000..e479e9612e72e9 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2018-11-30-17-18-56.bpo-35352.8bD7GC.rst @@ -0,0 +1 @@ +Modify test_asyncio to use the certificate set from the test directory. From 6c3f272b01c5d327e97f65115217e283103f7c66 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 1 Dec 2018 01:24:16 +0100 Subject: [PATCH 2038/2287] get_gmtoff() now returns time_t (GH-10838) (GH-10840) get_gmtoff() now returns time_t instead of int to fix the following Visual Studio warning: Modules\timemodule.c(1183): warning C4244: 'return': conversion from 'time_t' to 'int', possible loss of data (cherry picked from commit 503ce5c482cb267b0770bc46c315d5cf822bdca9) --- Modules/timemodule.c | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 6bb1ffb163d7df..0bc32083e0067f 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -860,7 +860,7 @@ of the timezone or altzone attributes on the time module."); #endif /* HAVE_MKTIME */ #ifdef HAVE_WORKING_TZSET -static void PyInit_timezone(PyObject *module); +static int PyInit_timezone(PyObject *module); static PyObject * time_tzset(PyObject *self, PyObject *unused) @@ -875,7 +875,9 @@ time_tzset(PyObject *self, PyObject *unused) tzset(); /* Reset timezone, altzone, daylight and tzname */ - PyInit_timezone(m); + if (PyInit_timezone(m) < 0) { + return NULL; + } Py_DECREF(m); if (PyErr_Occurred()) return NULL; @@ -1174,7 +1176,7 @@ get_zone(char *zone, int n, struct tm *p) #endif } -static int +static time_t get_gmtoff(time_t t, struct tm *p) { #ifdef HAVE_STRUCT_TM_TM_ZONE @@ -1184,8 +1186,11 @@ get_gmtoff(time_t t, struct tm *p) #endif } -static void -PyInit_timezone(PyObject *m) { +static int +PyInit_timezone(PyObject *m) +{ + assert(!PyErr_Occurred()); + /* This code moved from PyInit_time wholesale to allow calling it from time_tzset. In the future, some parts of it can be moved back (for platforms that don't HAVE_WORKING_TZSET, when we know what they @@ -1220,19 +1225,31 @@ PyInit_timezone(PyObject *m) { #define YEAR ((time_t)((365 * 24 + 6) * 3600)) time_t t; struct tm p; - long janzone, julyzone; + time_t janzone_t, julyzone_t; char janname[10], julyname[10]; t = (time((time_t *)0) / YEAR) * YEAR; _PyTime_localtime(t, &p); get_zone(janname, 9, &p); - janzone = -get_gmtoff(t, &p); + janzone_t = -get_gmtoff(t, &p); janname[9] = '\0'; t += YEAR/2; _PyTime_localtime(t, &p); get_zone(julyname, 9, &p); - julyzone = -get_gmtoff(t, &p); + julyzone_t = -get_gmtoff(t, &p); julyname[9] = '\0'; + /* Sanity check, don't check for the validity of timezones. + In practice, it should be more in range -12 hours .. +14 hours. */ +#define MAX_TIMEZONE (48 * 3600) + if (janzone_t < -MAX_TIMEZONE || janzone_t > MAX_TIMEZONE + || julyzone_t < -MAX_TIMEZONE || julyzone_t > MAX_TIMEZONE) + { + PyErr_SetString(PyExc_RuntimeError, "invalid GMT offset"); + return -1; + } + int janzone = (int)janzone_t; + int julyzone = (int)julyzone_t; + if( janzone < julyzone ) { /* DST is reversed in the southern hemisphere */ PyModule_AddIntConstant(m, "timezone", julyzone); @@ -1261,6 +1278,7 @@ PyInit_timezone(PyObject *m) { Py_BuildValue("(zz)", _tzname[0], _tzname[1])); #endif /* __CYGWIN__ */ #endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/ + return 0; } @@ -1348,7 +1366,9 @@ PyInit_time(void) return NULL; /* Set, or reset, module variables like time.timezone */ - PyInit_timezone(m); + if (PyInit_timezone(m) < 0) { + return NULL; + } #if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_SETTIME) || defined(HAVE_CLOCK_GETRES) From c0566e0ff6c2dd1a8b814ecd65649605c090527b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 1 Dec 2018 02:16:27 -0800 Subject: [PATCH 2039/2287] bpo-31177: Skip deleted attributes while calling reset_mock (GH-9302) (cherry picked from commit edeca92c84a3b08902ecdfe987cde00c7e617887) Co-authored-by: Xtreak --- Lib/unittest/mock.py | 2 +- Lib/unittest/test/testmock/testmock.py | 10 ++++++++++ .../Library/2018-09-14-10-38-18.bpo-31177.Sv91TN.rst | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2018-09-14-10-38-18.bpo-31177.Sv91TN.rst diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 31b1985161616b..4bb0c32c745bf8 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -543,7 +543,7 @@ def reset_mock(self, visited=None,*, return_value=False, side_effect=False): self._mock_side_effect = None for child in self._mock_children.values(): - if isinstance(child, _SpecState): + if isinstance(child, _SpecState) or child is _deleted: continue child.reset_mock(visited) diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index b64c8663d21226..4601136eff9c16 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -1556,6 +1556,16 @@ def test_attribute_deletion(self): self.assertRaises(AttributeError, getattr, mock, 'f') + def test_reset_mock_does_not_raise_on_attr_deletion(self): + # bpo-31177: reset_mock should not raise AttributeError when attributes + # were deleted in a mock instance + mock = Mock() + mock.child = True + del mock.child + mock.reset_mock() + self.assertFalse(hasattr(mock, 'child')) + + def test_class_assignable(self): for mock in Mock(), MagicMock(): self.assertNotIsInstance(mock, int) diff --git a/Misc/NEWS.d/next/Library/2018-09-14-10-38-18.bpo-31177.Sv91TN.rst b/Misc/NEWS.d/next/Library/2018-09-14-10-38-18.bpo-31177.Sv91TN.rst new file mode 100644 index 00000000000000..f385571e99ccf2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-09-14-10-38-18.bpo-31177.Sv91TN.rst @@ -0,0 +1,2 @@ +Fix bug that prevented using :meth:`reset_mock ` +on mock instances with deleted attributes From 1e28daf0b58c9c3a08e98b3a3caebb53acf9a617 Mon Sep 17 00:00:00 2001 From: E Kawashima Date: Sat, 1 Dec 2018 21:21:01 +0900 Subject: [PATCH 2040/2287] [3.6] Fix signature of xml.dom.minidom.Document.toprettyxml(). (GH-10814). (GH-10825) (cherry picked from commit b7c2182604d5796b5af4c837991aa0b8c8a2d41f) --- Doc/library/xml.dom.minidom.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/xml.dom.minidom.rst b/Doc/library/xml.dom.minidom.rst index 40470e8736e7e4..d5d7b20efe60b6 100644 --- a/Doc/library/xml.dom.minidom.rst +++ b/Doc/library/xml.dom.minidom.rst @@ -156,7 +156,7 @@ module documentation. This section lists the differences between the API and encoding. Encoding this string in an encoding other than UTF-8 is likely incorrect, since UTF-8 is the default encoding of XML. -.. method:: Node.toprettyxml(indent="", newl="", encoding="") +.. method:: Node.toprettyxml(indent="\t", newl="\n", encoding=None) Return a pretty-printed version of the document. *indent* specifies the indentation string and defaults to a tabulator; *newl* specifies the string From 013832ff964a0b3b59e04a07a33bae65c1c3ae84 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 1 Dec 2018 04:53:36 -0800 Subject: [PATCH 2041/2287] bpo-35371: Fix possible crash in os.utime() on Windows. (GH-10844) (cherry picked from commit 32bc11c33cf5ccea165b5f4ac3799f02fdf9c76a) Co-authored-by: Serhiy Storchaka --- Lib/test/test_os.py | 23 ++++++++++++ .../2018-12-01-13-44-12.bpo-35371.fTAwlX.rst | 2 + Modules/posixmodule.c | 37 ++++++++----------- 3 files changed, 40 insertions(+), 22 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-12-01-13-44-12.bpo-35371.fTAwlX.rst diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 9e35d55b805693..7a839c83fe4bfc 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -660,6 +660,29 @@ def test_utime_invalid_arguments(self): # seconds and nanoseconds parameters are mutually exclusive with self.assertRaises(ValueError): os.utime(self.fname, (5, 5), ns=(5, 5)) + with self.assertRaises(TypeError): + os.utime(self.fname, [5, 5]) + with self.assertRaises(TypeError): + os.utime(self.fname, (5,)) + with self.assertRaises(TypeError): + os.utime(self.fname, (5, 5, 5)) + with self.assertRaises(TypeError): + os.utime(self.fname, ns=[5, 5]) + with self.assertRaises(TypeError): + os.utime(self.fname, ns=(5,)) + with self.assertRaises(TypeError): + os.utime(self.fname, ns=(5, 5, 5)) + + if os.utime not in os.supports_follow_symlinks: + with self.assertRaises(NotImplementedError): + os.utime(self.fname, (5, 5), follow_symlinks=False) + if os.utime not in os.supports_fd: + with open(self.fname, 'wb', 0) as fp: + with self.assertRaises(TypeError): + os.utime(fp.fileno(), (5, 5)) + if os.utime not in os.supports_dir_fd: + with self.assertRaises(NotImplementedError): + os.utime(self.fname, (5, 5), dir_fd=0) from test import mapping_tests diff --git a/Misc/NEWS.d/next/Library/2018-12-01-13-44-12.bpo-35371.fTAwlX.rst b/Misc/NEWS.d/next/Library/2018-12-01-13-44-12.bpo-35371.fTAwlX.rst new file mode 100644 index 00000000000000..f40d13939311ef --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-12-01-13-44-12.bpo-35371.fTAwlX.rst @@ -0,0 +1,2 @@ +Fixed possible crash in ``os.utime()`` on Windows when pass incorrect +arguments. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index b7091ca4c2346f..03825c3228ca64 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -4589,7 +4589,6 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, int result; #endif - PyObject *return_value = NULL; utime_t utime; memset(&utime, 0, sizeof(utime_t)); @@ -4598,7 +4597,7 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, PyErr_SetString(PyExc_ValueError, "utime: you may specify either 'times'" " or 'ns' but not both"); - goto exit; + return NULL; } if (times && (times != Py_None)) { @@ -4608,14 +4607,14 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, PyErr_SetString(PyExc_TypeError, "utime: 'times' must be either" " a tuple of two ints or None"); - goto exit; + return NULL; } utime.now = 0; if (_PyTime_ObjectToTimespec(PyTuple_GET_ITEM(times, 0), &a_sec, &a_nsec, _PyTime_ROUND_FLOOR) == -1 || _PyTime_ObjectToTimespec(PyTuple_GET_ITEM(times, 1), &m_sec, &m_nsec, _PyTime_ROUND_FLOOR) == -1) { - goto exit; + return NULL; } utime.atime_s = a_sec; utime.atime_ns = a_nsec; @@ -4626,14 +4625,14 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, if (!PyTuple_CheckExact(ns) || (PyTuple_Size(ns) != 2)) { PyErr_SetString(PyExc_TypeError, "utime: 'ns' must be a tuple of two ints"); - goto exit; + return NULL; } utime.now = 0; if (!split_py_long_to_s_and_ns(PyTuple_GET_ITEM(ns, 0), &utime.atime_s, &utime.atime_ns) || !split_py_long_to_s_and_ns(PyTuple_GET_ITEM(ns, 1), &utime.mtime_s, &utime.mtime_ns)) { - goto exit; + return NULL; } } else { @@ -4643,20 +4642,20 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, #if !defined(UTIME_HAVE_NOFOLLOW_SYMLINKS) if (follow_symlinks_specified("utime", follow_symlinks)) - goto exit; + return NULL; #endif if (path_and_dir_fd_invalid("utime", path, dir_fd) || dir_fd_and_fd_invalid("utime", dir_fd, path->fd) || fd_and_follow_symlinks_invalid("utime", path->fd, follow_symlinks)) - goto exit; + return NULL; #if !defined(HAVE_UTIMENSAT) if ((dir_fd != DEFAULT_DIR_FD) && (!follow_symlinks)) { PyErr_SetString(PyExc_ValueError, "utime: cannot use dir_fd and follow_symlinks " "together on this platform"); - goto exit; + return NULL; } #endif @@ -4668,7 +4667,7 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, Py_END_ALLOW_THREADS if (hFile == INVALID_HANDLE_VALUE) { path_error(path); - goto exit; + return NULL; } if (utime.now) { @@ -4685,8 +4684,10 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, something is wrong with the file, when it also could be the time stamp that gives a problem. */ PyErr_SetFromWindowsErr(0); - goto exit; + CloseHandle(hFile); + return NULL; } + CloseHandle(hFile); #else /* MS_WINDOWS */ Py_BEGIN_ALLOW_THREADS @@ -4714,21 +4715,13 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, if (result < 0) { /* see previous comment about not putting filename in error here */ - return_value = posix_error(); - goto exit; + posix_error(); + return NULL; } #endif /* MS_WINDOWS */ - Py_INCREF(Py_None); - return_value = Py_None; - -exit: -#ifdef MS_WINDOWS - if (hFile != INVALID_HANDLE_VALUE) - CloseHandle(hFile); -#endif - return return_value; + Py_RETURN_NONE; } /* Process operations */ From f65ede3f8fa08493facf48177540d0ec26e59560 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 3 Dec 2018 01:11:37 -0800 Subject: [PATCH 2042/2287] bpo-10320: Replace nonstandard sprintf() length modifier in ctypes' PyCArg_repr(). (GH-10853) Use "ll" instead of the nonstandard "q". (cherry picked from commit 062cbb67726f26794b1b461853e40696b4a0b220) Co-authored-by: Zackery Spytz --- Modules/_ctypes/callproc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index e6079e9938ceca..04fbc010ca7dfc 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -484,7 +484,7 @@ PyCArg_repr(PyCArgObject *self) #ifdef MS_WIN32 "", #else - "", + "", #endif self->tag, self->value.q); break; From 0f9b6687eb8b26dd804abcc6efd4d6430ae16f24 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 3 Dec 2018 01:15:02 -0800 Subject: [PATCH 2043/2287] bpo-35372: Fix the code page decoder for input > 2 GiB. (GH-10848) (cherry picked from commit 4013c179117754b039957db4730880bf3285919d) Co-authored-by: Serhiy Storchaka --- Lib/test/test_codecs.py | 18 ++++++++++++++++++ .../2018-12-01-19-20-53.bpo-35372.RwVJjZ.rst | 2 ++ Objects/unicodeobject.c | 9 ++++----- 3 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-12-01-19-20-53.bpo-35372.RwVJjZ.rst diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index eb21a3915b938a..56485de3f6e9bc 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -3191,6 +3191,24 @@ def _get_fake_codepage(*a): finally: _bootlocale.getpreferredencoding = old_getpreferredencoding + @support.bigmemtest(size=2**31, memuse=7, dry_run=False) + def test_large_input(self): + # Test input longer than INT_MAX. + # Input should contain undecodable bytes before and after + # the INT_MAX limit. + encoded = (b'01234567' * (2**28-1) + + b'\x85\x86\xea\xeb\xec\xef\xfc\xfd\xfe\xff') + self.assertEqual(len(encoded), 2**31+2) + decoded = codecs.code_page_decode(932, encoded, 'surrogateescape', True) + self.assertEqual(decoded[1], len(encoded)) + del encoded + self.assertEqual(len(decoded[0]), decoded[1]) + self.assertEqual(decoded[0][:10], '0123456701') + self.assertEqual(decoded[0][-20:], + '6701234567' + '\udc85\udc86\udcea\udceb\udcec' + '\udcef\udcfc\udcfd\udcfe\udcff') + class ASCIITest(unittest.TestCase): def test_encode(self): diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-01-19-20-53.bpo-35372.RwVJjZ.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-01-19-20-53.bpo-35372.RwVJjZ.rst new file mode 100644 index 00000000000000..dc2de44b4f6373 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-12-01-19-20-53.bpo-35372.RwVJjZ.rst @@ -0,0 +1,2 @@ +Fixed the code page decoder for input longer than 2 GiB containing +undecodable bytes. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 29b019887ac0f9..0e64bf943db3e1 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -7285,7 +7285,7 @@ decode_code_page_errors(UINT code_page, "in the target code page."; /* each step cannot decode more than 1 character, but a character can be represented as a surrogate pair */ - wchar_t buffer[2], *startout, *out; + wchar_t buffer[2], *out; int insize; Py_ssize_t outsize; PyObject *errorHandler = NULL; @@ -7322,7 +7322,7 @@ decode_code_page_errors(UINT code_page, *v = (PyObject*)_PyUnicode_New(size * Py_ARRAY_LENGTH(buffer)); if (*v == NULL) goto error; - startout = PyUnicode_AS_UNICODE(*v); + out = PyUnicode_AS_UNICODE(*v); } else { /* Extend unicode object */ @@ -7333,11 +7333,10 @@ decode_code_page_errors(UINT code_page, } if (unicode_resize(v, n + size * Py_ARRAY_LENGTH(buffer)) < 0) goto error; - startout = PyUnicode_AS_UNICODE(*v) + n; + out = PyUnicode_AS_UNICODE(*v) + n; } /* Decode the byte string character per character */ - out = startout; while (in < endin) { /* Decode a character */ @@ -7392,7 +7391,7 @@ decode_code_page_errors(UINT code_page, *out = 0; /* Extend unicode object */ - outsize = out - startout; + outsize = out - PyUnicode_AS_UNICODE(*v); assert(outsize <= PyUnicode_WSTR_LENGTH(*v)); if (unicode_resize(v, outsize) < 0) goto error; From 67e6136a6d5c07141d4dba820c450a70db7aedd5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 3 Dec 2018 13:54:22 -0800 Subject: [PATCH 2044/2287] bpo-35226: Fix equality for nested unittest.mock.call objects. (GH-10555) Also refactor the call recording implementation and add some notes about its limitations. (cherry picked from commit 8ca0fa9d2f4de6e69f0902790432e0ab2f37ba68) Co-authored-by: Chris Withers --- Doc/library/unittest.mock-examples.rst | 9 +++ Doc/library/unittest.mock.rst | 13 +++++ Lib/unittest/mock.py | 55 +++++++++++-------- Lib/unittest/test/testmock/testhelpers.py | 16 ++++++ Lib/unittest/test/testmock/testmock.py | 51 +++++++++++++++++ .../2018-11-15-07-14-32.bpo-35226.wJPEEe.rst | 3 + 6 files changed, 124 insertions(+), 23 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-11-15-07-14-32.bpo-35226.wJPEEe.rst diff --git a/Doc/library/unittest.mock-examples.rst b/Doc/library/unittest.mock-examples.rst index 05f33740d7527a..cfba72795cc6fc 100644 --- a/Doc/library/unittest.mock-examples.rst +++ b/Doc/library/unittest.mock-examples.rst @@ -153,6 +153,15 @@ You use the :data:`call` object to construct lists for comparing with >>> mock.mock_calls == expected True +However, parameters to calls that return mocks are not recorded, which means it is not +possible to track nested calls where the parameters used to create ancestors are important: + + >>> m = Mock() + >>> m.factory(important=True).deliver() + + >>> m.mock_calls[-1] == call.factory(important=False).deliver() + True + Setting Return Values and Attributes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index 6841ef8ecc2b41..01f5a6454cf722 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -680,6 +680,19 @@ the *new_callable* argument to :func:`patch`. unpacked as tuples to get at the individual arguments. See :ref:`calls as tuples `. + .. note:: + + The way :attr:`mock_calls` are recorded means that where nested + calls are made, the parameters of ancestor calls are not recorded + and so will always compare equal: + + >>> mock = MagicMock() + >>> mock.top(a=3).bottom() + + >>> mock.mock_calls + [call.top(a=3), call.top().bottom()] + >>> mock.mock_calls[-1] == call.top(a=-1).bottom() + True .. attribute:: __class__ diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 4bb0c32c745bf8..a8f28cefc7a9a8 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -943,46 +943,51 @@ def _mock_call(_mock_self, *args, **kwargs): self = _mock_self self.called = True self.call_count += 1 - _new_name = self._mock_new_name - _new_parent = self._mock_new_parent + # handle call_args _call = _Call((args, kwargs), two=True) self.call_args = _call self.call_args_list.append(_call) - self.mock_calls.append(_Call(('', args, kwargs))) seen = set() - skip_next_dot = _new_name == '()' + + # initial stuff for method_calls: do_method_calls = self._mock_parent is not None - name = self._mock_name - while _new_parent is not None: - this_mock_call = _Call((_new_name, args, kwargs)) - if _new_parent._mock_new_name: - dot = '.' - if skip_next_dot: - dot = '' + method_call_name = self._mock_name - skip_next_dot = False - if _new_parent._mock_new_name == '()': - skip_next_dot = True + # initial stuff for mock_calls: + mock_call_name = self._mock_new_name + is_a_call = mock_call_name == '()' + self.mock_calls.append(_Call(('', args, kwargs))) - _new_name = _new_parent._mock_new_name + dot + _new_name + # follow up the chain of mocks: + _new_parent = self._mock_new_parent + while _new_parent is not None: + # handle method_calls: if do_method_calls: - if _new_name == name: - this_method_call = this_mock_call - else: - this_method_call = _Call((name, args, kwargs)) - _new_parent.method_calls.append(this_method_call) - + _new_parent.method_calls.append(_Call((method_call_name, args, kwargs))) do_method_calls = _new_parent._mock_parent is not None if do_method_calls: - name = _new_parent._mock_name + '.' + name + method_call_name = _new_parent._mock_name + '.' + method_call_name + # handle mock_calls: + this_mock_call = _Call((mock_call_name, args, kwargs)) _new_parent.mock_calls.append(this_mock_call) + + if _new_parent._mock_new_name: + if is_a_call: + dot = '' + else: + dot = '.' + is_a_call = _new_parent._mock_new_name == '()' + mock_call_name = _new_parent._mock_new_name + dot + mock_call_name + + # follow the parental chain: _new_parent = _new_parent._mock_new_parent - # use ids here so as not to call __hash__ on the mocks + # check we're not in an infinite loop: + # ( use ids here so as not to call __hash__ on the mocks) _new_parent_id = id(_new_parent) if _new_parent_id in seen: break @@ -2018,6 +2023,10 @@ def __eq__(self, other): else: self_name, self_args, self_kwargs = self + if (getattr(self, 'parent', None) and getattr(other, 'parent', None) + and self.parent != other.parent): + return False + other_name = '' if len_other == 0: other_args, other_kwargs = (), {} diff --git a/Lib/unittest/test/testmock/testhelpers.py b/Lib/unittest/test/testmock/testhelpers.py index 7919482ae99c7f..0a428908604075 100644 --- a/Lib/unittest/test/testmock/testhelpers.py +++ b/Lib/unittest/test/testmock/testhelpers.py @@ -269,6 +269,22 @@ def test_extended_call(self): self.assertEqual(mock.mock_calls, last_call.call_list()) + def test_extended_not_equal(self): + a = call(x=1).foo + b = call(x=2).foo + self.assertEqual(a, a) + self.assertEqual(b, b) + self.assertNotEqual(a, b) + + + def test_nested_calls_not_equal(self): + a = call(x=1).foo().bar + b = call(x=2).foo().bar + self.assertEqual(a, a) + self.assertEqual(b, b) + self.assertNotEqual(a, b) + + def test_call_list(self): mock = MagicMock() mock(1) diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 4601136eff9c16..c5c8f5ccbd81b8 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -916,6 +916,57 @@ def test_mock_calls(self): call().__int__().call_list()) + def test_child_mock_call_equal(self): + m = Mock() + result = m() + result.wibble() + # parent looks like this: + self.assertEqual(m.mock_calls, [call(), call().wibble()]) + # but child should look like this: + self.assertEqual(result.mock_calls, [call.wibble()]) + + + def test_mock_call_not_equal_leaf(self): + m = Mock() + m.foo().something() + self.assertNotEqual(m.mock_calls[1], call.foo().different()) + self.assertEqual(m.mock_calls[0], call.foo()) + + + def test_mock_call_not_equal_non_leaf(self): + m = Mock() + m.foo().bar() + self.assertNotEqual(m.mock_calls[1], call.baz().bar()) + self.assertNotEqual(m.mock_calls[0], call.baz()) + + + def test_mock_call_not_equal_non_leaf_params_different(self): + m = Mock() + m.foo(x=1).bar() + # This isn't ideal, but there's no way to fix it without breaking backwards compatibility: + self.assertEqual(m.mock_calls[1], call.foo(x=2).bar()) + + + def test_mock_call_not_equal_non_leaf_attr(self): + m = Mock() + m.foo.bar() + self.assertNotEqual(m.mock_calls[0], call.baz.bar()) + + + def test_mock_call_not_equal_non_leaf_call_versus_attr(self): + m = Mock() + m.foo.bar() + self.assertNotEqual(m.mock_calls[0], call.foo().bar()) + + + def test_mock_call_repr(self): + m = Mock() + m.foo().bar().baz.bob() + self.assertEqual(repr(m.mock_calls[0]), 'call.foo()') + self.assertEqual(repr(m.mock_calls[1]), 'call.foo().bar()') + self.assertEqual(repr(m.mock_calls[2]), 'call.foo().bar().baz.bob()') + + def test_subclassing(self): class Subclass(Mock): pass diff --git a/Misc/NEWS.d/next/Library/2018-11-15-07-14-32.bpo-35226.wJPEEe.rst b/Misc/NEWS.d/next/Library/2018-11-15-07-14-32.bpo-35226.wJPEEe.rst new file mode 100644 index 00000000000000..b95cc979573e54 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-11-15-07-14-32.bpo-35226.wJPEEe.rst @@ -0,0 +1,3 @@ +Recursively check arguments when testing for equality of +:class:`unittest.mock.call` objects and add note that tracking of parameters +used to create ancestors of mocks in ``mock_calls`` is not possible. From f455353bc0d195e092f09fec92ed16e9be02b7b1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 3 Dec 2018 15:22:35 -0800 Subject: [PATCH 2045/2287] [3.7] bpo-35373: Fix PyInit_timezone() error handling (GH-10864) * bpo-35373: Fix PyInit_timezone() error handling PyInit_timezone() now returns -1 at exit if an exception is raised. Check also explicitly PyUnicode_DecodeLocale() and Py_BuildValue() errors. * bpo-35373: Fix PyInit_time() error handling (GH-10865) * PyInit_time() now returns NULL if an exception is raised. * Rename PyInit_timezone() to init_timezone(). "PyInit_" prefix is a special prefix for function initializing a module. init_timezone() doesn't initialize a module and the function is not exported. (cherry picked from commit 3bb150d8148e3cc08418077a58f43e064b9fde61) (cherry picked from commit 5eb78c75128187a36d8e983027632fa51cc2ff4d) Co-authored-by: Victor Stinner --- Modules/timemodule.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 0bc32083e0067f..a963bb1dd1545c 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -860,7 +860,7 @@ of the timezone or altzone attributes on the time module."); #endif /* HAVE_MKTIME */ #ifdef HAVE_WORKING_TZSET -static int PyInit_timezone(PyObject *module); +static int init_timezone(PyObject *module); static PyObject * time_tzset(PyObject *self, PyObject *unused) @@ -875,7 +875,7 @@ time_tzset(PyObject *self, PyObject *unused) tzset(); /* Reset timezone, altzone, daylight and tzname */ - if (PyInit_timezone(m) < 0) { + if (init_timezone(m) < 0) { return NULL; } Py_DECREF(m); @@ -1187,7 +1187,7 @@ get_gmtoff(time_t t, struct tm *p) } static int -PyInit_timezone(PyObject *m) +init_timezone(PyObject *m) { assert(!PyErr_Occurred()); @@ -1218,8 +1218,19 @@ PyInit_timezone(PyObject *m) #endif PyModule_AddIntConstant(m, "daylight", daylight); otz0 = PyUnicode_DecodeLocale(tzname[0], "surrogateescape"); + if (otz0 == NULL) { + return -1; + } otz1 = PyUnicode_DecodeLocale(tzname[1], "surrogateescape"); - PyModule_AddObject(m, "tzname", Py_BuildValue("(NN)", otz0, otz1)); + if (otz1 == NULL) { + Py_DECREF(otz0); + return -1; + } + PyObject *tzname_obj = Py_BuildValue("(NN)", otz0, otz1); + if (tzname_obj == NULL) { + return -1; + } + PyModule_AddObject(m, "tzname", tzname_obj); #else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/ { #define YEAR ((time_t)((365 * 24 + 6) * 3600)) @@ -1278,6 +1289,10 @@ PyInit_timezone(PyObject *m) Py_BuildValue("(zz)", _tzname[0], _tzname[1])); #endif /* __CYGWIN__ */ #endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/ + + if (PyErr_Occurred()) { + return -1; + } return 0; } @@ -1366,7 +1381,7 @@ PyInit_time(void) return NULL; /* Set, or reset, module variables like time.timezone */ - if (PyInit_timezone(m) < 0) { + if (init_timezone(m) < 0) { return NULL; } @@ -1402,6 +1417,10 @@ PyInit_time(void) PyModule_AddIntConstant(m, "_STRUCT_TM_ITEMS", 11); PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType); initialized = 1; + + if (PyErr_Occurred()) { + return NULL; + } return m; } From 70ca3fce9fe2bdd7bf97d5fe1299cfa5e32b3ad4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 4 Dec 2018 01:34:48 -0800 Subject: [PATCH 2046/2287] bpo-35357: Add _mock_ prefix to name/parent/from_kall attributes of _Call/_MagicProxy. (GH-10873) Fix minor typo in test function name. (cherry picked from commit e63e617ebbe481c498bdf037a62e09f4f9f3963f) Co-authored-by: Andrew Dunai --- Lib/unittest/mock.py | 28 +++++++++---------- Lib/unittest/test/testmock/testcallable.py | 2 +- Lib/unittest/test/testmock/testmock.py | 16 ++++++++++- .../2018-12-03-21-20-24.bpo-35357.rhhoiC.rst | 4 +++ 4 files changed, 34 insertions(+), 16 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-12-03-21-20-24.bpo-35357.rhhoiC.rst diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index a8f28cefc7a9a8..707ef0b734d8ce 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -2004,9 +2004,9 @@ def __new__(cls, value=(), name='', parent=None, two=False, def __init__(self, value=(), name=None, parent=None, two=False, from_kall=True): - self.name = name - self.parent = parent - self.from_kall = from_kall + self._mock_name = name + self._mock_parent = parent + self._mock_from_kall = from_kall def __eq__(self, other): @@ -2023,8 +2023,8 @@ def __eq__(self, other): else: self_name, self_args, self_kwargs = self - if (getattr(self, 'parent', None) and getattr(other, 'parent', None) - and self.parent != other.parent): + if (getattr(self, '_mock_parent', None) and getattr(other, '_mock_parent', None) + and self._mock_parent != other._mock_parent): return False other_name = '' @@ -2068,17 +2068,17 @@ def __eq__(self, other): def __call__(self, *args, **kwargs): - if self.name is None: + if self._mock_name is None: return _Call(('', args, kwargs), name='()') - name = self.name + '()' - return _Call((self.name, args, kwargs), name=name, parent=self) + name = self._mock_name + '()' + return _Call((self._mock_name, args, kwargs), name=name, parent=self) def __getattr__(self, attr): - if self.name is None: + if self._mock_name is None: return _Call(name=attr, from_kall=False) - name = '%s.%s' % (self.name, attr) + name = '%s.%s' % (self._mock_name, attr) return _Call(name=name, parent=self, from_kall=False) @@ -2089,8 +2089,8 @@ def index(self, *args, **kwargs): return self.__getattr__('index')(*args, **kwargs) def __repr__(self): - if not self.from_kall: - name = self.name or 'call' + if not self._mock_from_kall: + name = self._mock_name or 'call' if name.startswith('()'): name = 'call%s' % name return name @@ -2116,9 +2116,9 @@ def call_list(self): vals = [] thing = self while thing is not None: - if thing.from_kall: + if thing._mock_from_kall: vals.append(thing) - thing = thing.parent + thing = thing._mock_parent return _CallList(reversed(vals)) diff --git a/Lib/unittest/test/testmock/testcallable.py b/Lib/unittest/test/testmock/testcallable.py index af1ce7ebbae4da..34474c4c816e0a 100644 --- a/Lib/unittest/test/testmock/testcallable.py +++ b/Lib/unittest/test/testmock/testcallable.py @@ -128,7 +128,7 @@ class Multi(SomeClass, Sub): result.foo.assert_called_once_with(3, 2, 1) - def test_create_autopsec(self): + def test_create_autospec(self): mock = create_autospec(X) instance = mock() self.assertRaises(TypeError, instance) diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index c5c8f5ccbd81b8..14b1ecc84b336a 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -8,7 +8,7 @@ from unittest.mock import ( call, DEFAULT, patch, sentinel, MagicMock, Mock, NonCallableMock, - NonCallableMagicMock, _CallList, + NonCallableMagicMock, _Call, _CallList, create_autospec ) @@ -1625,6 +1625,20 @@ def test_class_assignable(self): self.assertIsInstance(mock, int) mock.foo + def test_name_attribute_of_call(self): + # bpo-35357: _Call should not disclose any attributes whose names + # may clash with popular ones (such as ".name") + self.assertIsNotNone(call.name) + self.assertEqual(type(call.name), _Call) + self.assertEqual(type(call.name().name), _Call) + + def test_parent_attribute_of_call(self): + # bpo-35357: _Call should not disclose any attributes whose names + # may clash with popular ones (such as ".parent") + self.assertIsNotNone(call.parent) + self.assertEqual(type(call.parent), _Call) + self.assertEqual(type(call.parent().parent), _Call) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-03-21-20-24.bpo-35357.rhhoiC.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-03-21-20-24.bpo-35357.rhhoiC.rst new file mode 100644 index 00000000000000..1dade5baf4e013 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-12-03-21-20-24.bpo-35357.rhhoiC.rst @@ -0,0 +1,4 @@ +Internal attributes' names of unittest.mock._Call and +unittest.mock.MagicProxy (name, parent & from_kall) are now prefixed with +_mock_ in order to prevent clashes with widely used object attributes. +Fixed minor typo in test function name. From 65a5eff67474703329477b070d9c081fee17c69c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 4 Dec 2018 17:18:57 -0800 Subject: [PATCH 2047/2287] bpo-35411: Skip test_urllib2net FTP tests on Travis CI (GH-10907) (GH-10909) On Travis CI, FTP tests of test_urllib2net randomly fail with "425 Security: Bad IP connecting". test.pythoninfo now also logs TRAVIS environment variable. (cherry picked from commit c11b3b19a5b022c6c229043d37f9a9fd06f22500) Co-authored-by: Victor Stinner --- Lib/test/pythoninfo.py | 1 + Lib/test/test_urllib2net.py | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index 606d511433cfcf..c453340b80d7c5 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -256,6 +256,7 @@ def format_groups(groups): "TIX_LIBRARY", "TMP", "TMPDIR", + "TRAVIS", "TZ", "USERPROFILE", "VIRTUAL_ENV", diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py index 15f73de9f029f8..1aa64cbee1ca4b 100644 --- a/Lib/test/test_urllib2net.py +++ b/Lib/test/test_urllib2net.py @@ -27,6 +27,13 @@ def wrapped(*args, **kwargs): return _retry_thrice(func, exc, *args, **kwargs) return wrapped +# bpo-35411: FTP tests of test_urllib2net randomly fail +# with "425 Security: Bad IP connecting" on Travis CI +skip_ftp_test_on_travis = unittest.skipIf('TRAVIS' in os.environ, + 'bpo-35411: skip FTP test ' + 'on Travis CI') + + # Connecting to remote hosts is flaky. Make it more robust by retrying # the connection several times. _urlopen_with_retry = _wrap_with_retry_thrice(urllib.request.urlopen, @@ -95,6 +102,7 @@ def setUp(self): # XXX The rest of these tests aren't very good -- they don't check much. # They do sometimes catch some major disasters, though. + @skip_ftp_test_on_travis def test_ftp(self): urls = [ 'ftp://www.pythontest.net/README', @@ -290,6 +298,7 @@ def test_http_timeout(self): FTP_HOST = 'ftp://www.pythontest.net/' + @skip_ftp_test_on_travis def test_ftp_basic(self): self.assertIsNone(socket.getdefaulttimeout()) with support.transient_internet(self.FTP_HOST, timeout=None): @@ -297,6 +306,7 @@ def test_ftp_basic(self): self.addCleanup(u.close) self.assertIsNone(u.fp.fp.raw._sock.gettimeout()) + @skip_ftp_test_on_travis def test_ftp_default_timeout(self): self.assertIsNone(socket.getdefaulttimeout()) with support.transient_internet(self.FTP_HOST): @@ -308,6 +318,7 @@ def test_ftp_default_timeout(self): socket.setdefaulttimeout(None) self.assertEqual(u.fp.fp.raw._sock.gettimeout(), 60) + @skip_ftp_test_on_travis def test_ftp_no_timeout(self): self.assertIsNone(socket.getdefaulttimeout()) with support.transient_internet(self.FTP_HOST): @@ -319,6 +330,7 @@ def test_ftp_no_timeout(self): socket.setdefaulttimeout(None) self.assertIsNone(u.fp.fp.raw._sock.gettimeout()) + @skip_ftp_test_on_travis def test_ftp_timeout(self): with support.transient_internet(self.FTP_HOST): u = _urlopen_with_retry(self.FTP_HOST, timeout=60) From 93d038c91dc3075dd34b41ce6b6fb4ea07fbb8c3 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 5 Dec 2018 03:03:21 +0100 Subject: [PATCH 2048/2287] bpo-35363, test_eintr: skip test_open() on macOS (GH-10896) (GH-10912) (cherry picked from commit 4752e65250bce60b97d5af702d586092d02fbf58) --- Lib/test/eintrdata/eintr_tester.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Lib/test/eintrdata/eintr_tester.py b/Lib/test/eintrdata/eintr_tester.py index aa7cfd14d9f9c1..25c169bde5005f 100644 --- a/Lib/test/eintrdata/eintr_tester.py +++ b/Lib/test/eintrdata/eintr_tester.py @@ -349,16 +349,18 @@ def python_open(self, path): fp = open(path, 'w') fp.close() + @unittest.skipIf(sys.platform == "darwin", + "hangs under macOS; see bpo-25234, bpo-35363") def test_open(self): self._test_open("fp = open(path, 'r')\nfp.close()", self.python_open) - @unittest.skipIf(sys.platform == 'darwin', "hangs under OS X; see issue #25234") def os_open(self, path): fd = os.open(path, os.O_WRONLY) os.close(fd) - @unittest.skipIf(sys.platform == "darwin", "hangs under OS X; see issue #25234") + @unittest.skipIf(sys.platform == "darwin", + "hangs under macOS; see bpo-25234, bpo-35363") def test_os_open(self): self._test_open("fd = os.open(path, os.O_RDONLY)\nos.close(fd)", self.os_open) From afb07fccf013f20b89b33516f126695388be47b9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 4 Dec 2018 23:51:15 -0800 Subject: [PATCH 2049/2287] bpo-35414: Add a missing Py_INCREF(Py_None) in PyState_RemoveModule(). (GH-10914) (cherry picked from commit 2a893430c9c8378cbdfac95895a64fa07aaff9ed) Co-authored-by: Zackery Spytz --- Python/pystate.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Python/pystate.c b/Python/pystate.c index c0e088055a60fc..71494daa471a26 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -377,6 +377,7 @@ PyState_RemoveModule(struct PyModuleDef* def) Py_FatalError("PyState_RemoveModule: Module index out of bounds."); return -1; } + Py_INCREF(Py_None); return PyList_SetItem(state->modules_by_index, index, Py_None); } From bfb881849f588cd2046776fb431c3045781c8214 Mon Sep 17 00:00:00 2001 From: Andrew Svetlov Date: Wed, 5 Dec 2018 10:30:06 +0200 Subject: [PATCH 2050/2287] [3.6] bpo-35380: Enable TCP_NODELAY for proactor event loop (GH-10867). (GH-10874) * [3.6] bpo-35380: Enable TCP_NODELAY for proactor event loop (GH-10867). (cherry picked from commit 3bc0ebab17bf5a2c29d2214743c82034f82e6573) Co-authored-by: Andrew Svetlov --- Lib/asyncio/base_events.py | 11 ++++++++ Lib/asyncio/proactor_events.py | 5 ++++ Lib/asyncio/selector_events.py | 13 +-------- Lib/test/test_asyncio/test_base_events.py | 28 +++++++++++++++++-- Lib/test/test_asyncio/test_selector_events.py | 26 ----------------- .../2018-12-03-14-41-11.bpo-35380.SdRF9l.rst | 1 + 6 files changed, 44 insertions(+), 40 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-12-03-14-41-11.bpo-35380.SdRF9l.rst diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index accd669250cbef..48dd1fc54ae42c 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -182,6 +182,17 @@ def _ensure_resolved(address, *, family=0, type=socket.SOCK_STREAM, proto=0, proto=proto, flags=flags) +if hasattr(socket, 'TCP_NODELAY'): + def _set_nodelay(sock): + if (sock.family in {socket.AF_INET, socket.AF_INET6} and + _is_stream_socket(sock.type) and + sock.proto == socket.IPPROTO_TCP): + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) +else: + def _set_nodelay(sock): + pass + + def _run_until_complete_cb(fut): exc = fut._exception if (isinstance(exc, BaseException) diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index 6f621ef0cc4f18..079b7a24db42ab 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -350,6 +350,11 @@ class _ProactorSocketTransport(_ProactorReadPipeTransport, transports.Transport): """Transport for connected sockets.""" + def __init__(self, loop, sock, protocol, waiter=None, + extra=None, server=None): + super().__init__(loop, sock, protocol, waiter, extra, server) + base_events._set_nodelay(sock) + def _set_extra(self, sock): self._extra['socket'] = sock try: diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index bc7c740cc2af38..af21d5ee8914f5 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -40,17 +40,6 @@ def _test_selector_event(selector, fd, event): return bool(key.events & event) -if hasattr(socket, 'TCP_NODELAY'): - def _set_nodelay(sock): - if (sock.family in {socket.AF_INET, socket.AF_INET6} and - base_events._is_stream_socket(sock.type) and - sock.proto == socket.IPPROTO_TCP): - sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) -else: - def _set_nodelay(sock): - pass - - class BaseSelectorEventLoop(base_events.BaseEventLoop): """Selector event loop. @@ -691,7 +680,7 @@ def __init__(self, loop, sock, protocol, waiter=None, # Disable the Nagle algorithm -- small writes will be # sent without waiting for the TCP ACK. This generally # decreases the latency (in some cases significantly.) - _set_nodelay(self._sock) + base_events._set_nodelay(self._sock) self._loop.call_soon(self._protocol.connection_made, self) # only start reading when connection_made() has been called diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index 09f71f2f39002d..052a559c3cbb54 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -27,7 +27,6 @@ except ImportError: from asyncio.test_support import assert_python_ok - MOCK_ANY = mock.ANY PY34 = sys.version_info >= (3, 4) @@ -288,7 +287,7 @@ def cb(): loop.set_debug(debug) if debug: msg = ("Non-thread-safe operation invoked on an event loop other " - "than the current one") + "than the current one") with self.assertRaisesRegex(RuntimeError, msg): loop.call_soon(cb) with self.assertRaisesRegex(RuntimeError, msg): @@ -1839,5 +1838,30 @@ def runner(loop): +class TestSelectorUtils(test_utils.TestCase): + def check_set_nodelay(self, sock): + opt = sock.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY) + self.assertFalse(opt) + + base_events._set_nodelay(sock) + + opt = sock.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY) + self.assertTrue(opt) + + @unittest.skipUnless(hasattr(socket, 'TCP_NODELAY'), + 'need socket.TCP_NODELAY') + def test_set_nodelay(self): + sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM, + proto=socket.IPPROTO_TCP) + with sock: + self.check_set_nodelay(sock) + + sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM, + proto=socket.IPPROTO_TCP) + with sock: + sock.setblocking(False) + self.check_set_nodelay(sock) + + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py index 533d2898e7fc58..6716e8916cd505 100644 --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -17,7 +17,6 @@ from asyncio.selector_events import _SelectorSslTransport from asyncio.selector_events import _SelectorSocketTransport from asyncio.selector_events import _SelectorDatagramTransport -from asyncio.selector_events import _set_nodelay MOCK_ANY = mock.ANY @@ -1858,30 +1857,5 @@ def test_fatal_error_connected(self, m_exc): exc_info=(ConnectionRefusedError, MOCK_ANY, MOCK_ANY)) -class TestSelectorUtils(test_utils.TestCase): - def check_set_nodelay(self, sock): - opt = sock.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY) - self.assertFalse(opt) - - _set_nodelay(sock) - - opt = sock.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY) - self.assertTrue(opt) - - @unittest.skipUnless(hasattr(socket, 'TCP_NODELAY'), - 'need socket.TCP_NODELAY') - def test_set_nodelay(self): - sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM, - proto=socket.IPPROTO_TCP) - with sock: - self.check_set_nodelay(sock) - - sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM, - proto=socket.IPPROTO_TCP) - with sock: - sock.setblocking(False) - self.check_set_nodelay(sock) - - if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2018-12-03-14-41-11.bpo-35380.SdRF9l.rst b/Misc/NEWS.d/next/Library/2018-12-03-14-41-11.bpo-35380.SdRF9l.rst new file mode 100644 index 00000000000000..91f86e604ea865 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-12-03-14-41-11.bpo-35380.SdRF9l.rst @@ -0,0 +1 @@ +Enable TCP_NODELAY on Windows for proactor asyncio event loop. From 31b635dbf0c7108f18bb3ce382b895374cff77fb Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 5 Dec 2018 17:21:37 +0100 Subject: [PATCH 2051/2287] bpo-10496: posixpath.expanduser() catchs pwd.getpwuid() error (GH-10919) (GH-10925) * posixpath.expanduser() now returns the input path unchanged if the HOME environment variable is not set and pwd.getpwuid() raises KeyError (the current user identifier doesn't exist in the password database). * Add test_no_home_directory() to test_site. (cherry picked from commit f2f4555d8287ad217a1dba7bbd93103ad4daf3a8) --- Lib/posixpath.py | 9 ++- Lib/test/test_posixpath.py | 78 ++++++++++++------- Lib/test/test_site.py | 38 +++++++++ .../2018-12-05-13-37-39.bpo-10496.VH-1Lp.rst | 5 ++ 4 files changed, 100 insertions(+), 30 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-12-05-13-37-39.bpo-10496.VH-1Lp.rst diff --git a/Lib/posixpath.py b/Lib/posixpath.py index e92186c64e0ddb..ca578a5df35c22 100644 --- a/Lib/posixpath.py +++ b/Lib/posixpath.py @@ -246,7 +246,12 @@ def expanduser(path): if i == 1: if 'HOME' not in os.environ: import pwd - userhome = pwd.getpwuid(os.getuid()).pw_dir + try: + userhome = pwd.getpwuid(os.getuid()).pw_dir + except KeyError: + # bpo-10496: if the current user identifier doesn't exist in the + # password database, return the path unchanged + return path else: userhome = os.environ['HOME'] else: @@ -257,6 +262,8 @@ def expanduser(path): try: pwent = pwd.getpwnam(name) except KeyError: + # bpo-10496: if the user name from the path doesn't exist in the + # password database, return the path unchanged return path userhome = pwent.pw_dir if isinstance(path, bytes): diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py index 9476ede5319397..e73b31cb648b22 100644 --- a/Lib/test/test_posixpath.py +++ b/Lib/test/test_posixpath.py @@ -5,6 +5,7 @@ from posixpath import realpath, abspath, dirname, basename from test import support, test_genericpath from test.support import FakePath +from unittest import mock try: import posix @@ -230,42 +231,61 @@ def fake_lstat(path): def test_expanduser(self): self.assertEqual(posixpath.expanduser("foo"), "foo") self.assertEqual(posixpath.expanduser(b"foo"), b"foo") + + def test_expanduser_home_envvar(self): with support.EnvironmentVarGuard() as env: + env['HOME'] = '/home/victor' + self.assertEqual(posixpath.expanduser("~"), "/home/victor") + + # expanduser() strips trailing slash + env['HOME'] = '/home/victor/' + self.assertEqual(posixpath.expanduser("~"), "/home/victor") + for home in '/', '', '//', '///': with self.subTest(home=home): env['HOME'] = home self.assertEqual(posixpath.expanduser("~"), "/") self.assertEqual(posixpath.expanduser("~/"), "/") self.assertEqual(posixpath.expanduser("~/foo"), "/foo") - try: - import pwd - except ImportError: - pass - else: - self.assertIsInstance(posixpath.expanduser("~/"), str) - self.assertIsInstance(posixpath.expanduser(b"~/"), bytes) - # if home directory == root directory, this test makes no sense - if posixpath.expanduser("~") != '/': - self.assertEqual( - posixpath.expanduser("~") + "/", - posixpath.expanduser("~/") - ) - self.assertEqual( - posixpath.expanduser(b"~") + b"/", - posixpath.expanduser(b"~/") - ) - self.assertIsInstance(posixpath.expanduser("~root/"), str) - self.assertIsInstance(posixpath.expanduser("~foo/"), str) - self.assertIsInstance(posixpath.expanduser(b"~root/"), bytes) - self.assertIsInstance(posixpath.expanduser(b"~foo/"), bytes) - - with support.EnvironmentVarGuard() as env: - # expanduser should fall back to using the password database - del env['HOME'] - home = pwd.getpwuid(os.getuid()).pw_dir - # $HOME can end with a trailing /, so strip it (see #17809) - home = home.rstrip("/") or '/' - self.assertEqual(posixpath.expanduser("~"), home) + + def test_expanduser_pwd(self): + pwd = support.import_module('pwd') + + self.assertIsInstance(posixpath.expanduser("~/"), str) + self.assertIsInstance(posixpath.expanduser(b"~/"), bytes) + + # if home directory == root directory, this test makes no sense + if posixpath.expanduser("~") != '/': + self.assertEqual( + posixpath.expanduser("~") + "/", + posixpath.expanduser("~/") + ) + self.assertEqual( + posixpath.expanduser(b"~") + b"/", + posixpath.expanduser(b"~/") + ) + self.assertIsInstance(posixpath.expanduser("~root/"), str) + self.assertIsInstance(posixpath.expanduser("~foo/"), str) + self.assertIsInstance(posixpath.expanduser(b"~root/"), bytes) + self.assertIsInstance(posixpath.expanduser(b"~foo/"), bytes) + + with support.EnvironmentVarGuard() as env: + # expanduser should fall back to using the password database + del env['HOME'] + + home = pwd.getpwuid(os.getuid()).pw_dir + # $HOME can end with a trailing /, so strip it (see #17809) + home = home.rstrip("/") or '/' + self.assertEqual(posixpath.expanduser("~"), home) + + # bpo-10496: If the HOME environment variable is not set and the + # user (current identifier or name in the path) doesn't exist in + # the password database (pwd.getuid() or pwd.getpwnam() fail), + # expanduser() must return the path unchanged. + with mock.patch.object(pwd, 'getpwuid', side_effect=KeyError), \ + mock.patch.object(pwd, 'getpwnam', side_effect=KeyError): + for path in ('~', '~/.local', '~vstinner/'): + self.assertEqual(posixpath.expanduser(path), path) def test_normpath(self): self.assertEqual(posixpath.normpath(""), ".") diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index afdcf36f394df5..6964a849335aa1 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -6,6 +6,7 @@ """ import unittest import test.support +from test import support from test.support import (captured_stderr, TESTFN, EnvironmentVarGuard, change_cwd) import builtins @@ -18,6 +19,7 @@ import shutil import subprocess import sysconfig +from unittest import mock from copy import copy # These tests are not particularly useful if Python was invoked with -S. @@ -243,6 +245,7 @@ def test_getusersitepackages(self): # the call sets USER_BASE *and* USER_SITE self.assertEqual(site.USER_SITE, user_site) self.assertTrue(user_site.startswith(site.USER_BASE), user_site) + self.assertEqual(site.USER_BASE, site.getuserbase()) def test_getsitepackages(self): site.PREFIXES = ['xoxo'] @@ -273,6 +276,41 @@ def test_getsitepackages(self): wanted = os.path.join('xoxo', 'lib', 'site-packages') self.assertEqual(dirs[1], wanted) + def test_no_home_directory(self): + # bpo-10496: getuserbase() and getusersitepackages() must not fail if + # the current user has no home directory (if expanduser() returns the + # path unchanged). + site.USER_SITE = None + site.USER_BASE = None + sysconfig._CONFIG_VARS = None + + with EnvironmentVarGuard() as environ, \ + mock.patch('os.path.expanduser', lambda path: path): + + del environ['PYTHONUSERBASE'] + del environ['APPDATA'] + + user_base = site.getuserbase() + self.assertTrue(user_base.startswith('~' + os.sep), + user_base) + + user_site = site.getusersitepackages() + self.assertTrue(user_site.startswith(user_base), user_site) + + with mock.patch('os.path.isdir', return_value=False) as mock_isdir, \ + mock.patch.object(site, 'addsitedir') as mock_addsitedir, \ + support.swap_attr(site, 'ENABLE_USER_SITE', True): + + # addusersitepackages() must not add user_site to sys.path + # if it is not an existing directory + known_paths = set() + site.addusersitepackages(known_paths) + + mock_isdir.assert_called_once_with(user_site) + mock_addsitedir.assert_not_called() + self.assertFalse(known_paths) + + class PthFile(object): """Helper class for handling testing of .pth files""" diff --git a/Misc/NEWS.d/next/Library/2018-12-05-13-37-39.bpo-10496.VH-1Lp.rst b/Misc/NEWS.d/next/Library/2018-12-05-13-37-39.bpo-10496.VH-1Lp.rst new file mode 100644 index 00000000000000..232fcc6503b029 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-12-05-13-37-39.bpo-10496.VH-1Lp.rst @@ -0,0 +1,5 @@ +:func:`posixpath.expanduser` now returns the input *path* unchanged if the +``HOME`` environment variable is not set and the current user has no home +directory (if the current user identifier doesn't exist in the password +database). This change fix the :mod:`site` module if the current user doesn't +exist in the password database (if the user has no home directory). From 92d912c344e6c21de46da29f0dc45b7e476fa79d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Dec 2018 11:35:47 -0800 Subject: [PATCH 2052/2287] bpo-34987: Fix a possible null pointer dereference in _pickle.c's save_reduce(). (GH-9886) (cherry picked from commit 25d389789c59a52a31770f7c50ce9e02a8909190) Co-authored-by: Zackery Spytz --- Modules/_pickle.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 389bb6701c5f52..8c8163560f1188 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -3743,7 +3743,10 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj) if (obj != NULL) { obj_class = get_class(obj); - p = obj_class != cls; /* true iff a problem */ + if (obj_class == NULL) { + return -1; + } + p = obj_class != cls; Py_DECREF(obj_class); if (p) { PyErr_SetString(st->PicklingError, "args[0] from " From 9b3d6a1f9772e810afaa0dca106bd0e4d5f4be9f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Dec 2018 12:13:34 -0800 Subject: [PATCH 2053/2287] Move __missing__ after __delitem__ in Data model. (GH-10923) (cherry picked from commit 1ce853f37783575e2b3aaa159ddcebc8660830ef) Co-authored-by: Andre Delfino --- Doc/reference/datamodel.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index abf06357e7f9ee..143376bc5ce0c3 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -2045,6 +2045,8 @@ through the container; for mappings, :meth:`__iter__` should be the same as .. versionadded:: 3.4 +.. index:: object: slice + .. note:: Slicing is done exclusively with the following three methods. A call like :: @@ -2060,8 +2062,6 @@ through the container; for mappings, :meth:`__iter__` should be the same as .. method:: object.__getitem__(self, key) - .. index:: object: slice - Called to implement evaluation of ``self[key]``. For sequence types, the accepted keys should be integers and slice objects. Note that the special interpretation of negative indexes (if the class wishes to emulate a sequence @@ -2077,12 +2077,6 @@ through the container; for mappings, :meth:`__iter__` should be the same as indexes to allow proper detection of the end of the sequence. -.. method:: object.__missing__(self, key) - - Called by :class:`dict`\ .\ :meth:`__getitem__` to implement ``self[key]`` for dict subclasses - when key is not in the dictionary. - - .. method:: object.__setitem__(self, key, value) Called to implement assignment to ``self[key]``. Same note as for @@ -2101,6 +2095,12 @@ through the container; for mappings, :meth:`__iter__` should be the same as values as for the :meth:`__getitem__` method. +.. method:: object.__missing__(self, key) + + Called by :class:`dict`\ .\ :meth:`__getitem__` to implement ``self[key]`` for dict subclasses + when key is not in the dictionary. + + .. method:: object.__iter__(self) This method is called when an iterator is required for a container. This method From 49d995fd6f2a703d19d93baf06fc9f911cb2ce06 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Dec 2018 12:20:03 -0800 Subject: [PATCH 2054/2287] bpo-34185: Fix test module collision in test_bdb when ran as script. (GH-8537) (GH-10936) When running test_bdb.py as a script, `import test_module` would be importing the existing Lib/test/test_modules.py instead of the tempcwd/test_module.py module which was dynamically created by test_bdb.py itself. (cherry picked from commit 54fd45505b3a365e6d53441e6dd7e0d1ec13b46f) Co-authored-by: Alex H <1884912+lajarre@users.noreply.github.com> --- Lib/test/test_bdb.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_bdb.py b/Lib/test/test_bdb.py index 616c3a8649840c..55f42e2535b7f8 100644 --- a/Lib/test/test_bdb.py +++ b/Lib/test/test_bdb.py @@ -549,11 +549,11 @@ def create_modules(modules): def break_in_func(funcname, fname=__file__, temporary=False, cond=None): return 'break', (fname, None, temporary, cond, funcname) -TEST_MODULE = 'test_module' +TEST_MODULE = 'test_module_for_bdb' TEST_MODULE_FNAME = TEST_MODULE + '.py' def tfunc_import(): - import test_module - test_module.main() + import test_module_for_bdb + test_module_for_bdb.main() def tfunc_main(): lno = 2 @@ -971,9 +971,9 @@ def main(): ('return', 3, 'main'), ('step', ), ('return', 1, ''), ('quit', ), ] - import test_module + import test_module_for_bdb with TracerRun(self) as tracer: - tracer.runeval('test_module.main()', globals(), locals()) + tracer.runeval('test_module_for_bdb.main()', globals(), locals()) class IssuesTestCase(BaseTestCase): """Test fixed bdb issues.""" @@ -983,7 +983,7 @@ def test_step_at_return_with_no_trace_in_caller(self): # Check that the tracer does step into the caller frame when the # trace function is not set in that frame. code_1 = """ - from test_module_2 import func + from test_module_for_bdb_2 import func def main(): func() lno = 5 @@ -994,12 +994,12 @@ def func(): """ modules = { TEST_MODULE: code_1, - 'test_module_2': code_2, + 'test_module_for_bdb_2': code_2, } with create_modules(modules): self.expect_set = [ ('line', 2, 'tfunc_import'), - break_in_func('func', 'test_module_2.py'), + break_in_func('func', 'test_module_for_bdb_2.py'), ('None', 2, 'tfunc_import'), ('continue', ), ('line', 3, 'func', ({1:1}, [])), ('step', ), ('return', 3, 'func'), ('step', ), From e0c2046d82f6db45a7f3d3ee5f555c3e2487a74d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Dec 2018 12:44:38 -0800 Subject: [PATCH 2055/2287] bpo-34738: Add directory entries in ZIP files created by distutils. (GH-9419) (GH-10942) (cherry picked from commit 67a93b3a0b3814e97ef9d077b21325fc8ce351b2) Co-authored-by: Serhiy Storchaka --- Lib/distutils/archive_util.py | 8 ++++++++ Lib/distutils/tests/test_archive_util.py | 13 ++++++------- Lib/distutils/tests/test_bdist_dumb.py | 2 +- Lib/distutils/tests/test_sdist.py | 12 ++++++++++-- .../2018-09-19-16-51-04.bpo-34738.Pr3-iG.rst | 2 ++ 5 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-09-19-16-51-04.bpo-34738.Pr3-iG.rst diff --git a/Lib/distutils/archive_util.py b/Lib/distutils/archive_util.py index 78ae5757c36d2c..b002dc3b84563a 100644 --- a/Lib/distutils/archive_util.py +++ b/Lib/distutils/archive_util.py @@ -166,7 +166,15 @@ def make_zipfile(base_name, base_dir, verbose=0, dry_run=0): zip = zipfile.ZipFile(zip_filename, "w", compression=zipfile.ZIP_STORED) + if base_dir != os.curdir: + path = os.path.normpath(os.path.join(base_dir, '')) + zip.write(path, path) + log.info("adding '%s'", path) for dirpath, dirnames, filenames in os.walk(base_dir): + for name in dirnames: + path = os.path.normpath(os.path.join(dirpath, name, '')) + zip.write(path, path) + log.info("adding '%s'", path) for name in filenames: path = os.path.normpath(os.path.join(dirpath, name)) if os.path.isfile(path): diff --git a/Lib/distutils/tests/test_archive_util.py b/Lib/distutils/tests/test_archive_util.py index 02fa1e27a47f53..18a0313eb606bb 100644 --- a/Lib/distutils/tests/test_archive_util.py +++ b/Lib/distutils/tests/test_archive_util.py @@ -122,12 +122,13 @@ def _tarinfo(self, path): try: names = tar.getnames() names.sort() - return tuple(names) + return names finally: tar.close() - _created_files = ('dist', 'dist/file1', 'dist/file2', - 'dist/sub', 'dist/sub/file3', 'dist/sub2') + _zip_created_files = ['dist/', 'dist/file1', 'dist/file2', + 'dist/sub/', 'dist/sub/file3', 'dist/sub2/'] + _created_files = [p.rstrip('/') for p in _zip_created_files] def _create_files(self): # creating something to tar @@ -244,8 +245,7 @@ def test_make_zipfile(self): tarball = base_name + '.zip' self.assertTrue(os.path.exists(tarball)) with zipfile.ZipFile(tarball) as zf: - self.assertEqual(sorted(zf.namelist()), - ['dist/file1', 'dist/file2', 'dist/sub/file3']) + self.assertEqual(sorted(zf.namelist()), self._zip_created_files) @unittest.skipUnless(ZIP_SUPPORT, 'Need zip support to run') def test_make_zipfile_no_zlib(self): @@ -271,8 +271,7 @@ def fake_zipfile(*a, **kw): [((tarball, "w"), {'compression': zipfile.ZIP_STORED})]) self.assertTrue(os.path.exists(tarball)) with zipfile.ZipFile(tarball) as zf: - self.assertEqual(sorted(zf.namelist()), - ['dist/file1', 'dist/file2', 'dist/sub/file3']) + self.assertEqual(sorted(zf.namelist()), self._zip_created_files) def test_check_archive_formats(self): self.assertEqual(check_archive_formats(['gztar', 'xxx', 'zip']), diff --git a/Lib/distutils/tests/test_bdist_dumb.py b/Lib/distutils/tests/test_bdist_dumb.py index c8ccdc2383dead..01a233bce37ff9 100644 --- a/Lib/distutils/tests/test_bdist_dumb.py +++ b/Lib/distutils/tests/test_bdist_dumb.py @@ -84,7 +84,7 @@ def test_simple_built(self): finally: fp.close() - contents = sorted(os.path.basename(fn) for fn in contents) + contents = sorted(filter(None, map(os.path.basename, contents))) wanted = ['foo-0.1-py%s.%s.egg-info' % sys.version_info[:2], 'foo.py'] if not sys.dont_write_bytecode: wanted.append('foo.%s.pyc' % sys.implementation.cache_tag) diff --git a/Lib/distutils/tests/test_sdist.py b/Lib/distutils/tests/test_sdist.py index 5444b815a8b234..23db1269591d66 100644 --- a/Lib/distutils/tests/test_sdist.py +++ b/Lib/distutils/tests/test_sdist.py @@ -128,7 +128,9 @@ def test_prune_file_list(self): zip_file.close() # making sure everything has been pruned correctly - self.assertEqual(len(content), 4) + expected = ['', 'PKG-INFO', 'README', 'setup.py', + 'somecode/', 'somecode/__init__.py'] + self.assertEqual(sorted(content), ['fake-1.0/' + x for x in expected]) @unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run') @unittest.skipIf(find_executable('tar') is None, @@ -226,7 +228,13 @@ def test_add_defaults(self): zip_file.close() # making sure everything was added - self.assertEqual(len(content), 12) + expected = ['', 'PKG-INFO', 'README', 'buildout.cfg', + 'data/', 'data/data.dt', 'inroot.txt', + 'scripts/', 'scripts/script.py', 'setup.py', + 'some/', 'some/file.txt', 'some/other_file.txt', + 'somecode/', 'somecode/__init__.py', 'somecode/doc.dat', + 'somecode/doc.txt'] + self.assertEqual(sorted(content), ['fake-1.0/' + x for x in expected]) # checking the MANIFEST f = open(join(self.tmp_dir, 'MANIFEST')) diff --git a/Misc/NEWS.d/next/Library/2018-09-19-16-51-04.bpo-34738.Pr3-iG.rst b/Misc/NEWS.d/next/Library/2018-09-19-16-51-04.bpo-34738.Pr3-iG.rst new file mode 100644 index 00000000000000..c3f402d39ae0a6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-09-19-16-51-04.bpo-34738.Pr3-iG.rst @@ -0,0 +1,2 @@ +ZIP files created by :mod:`distutils` will now include entries for +directories. From 62af9e6583b0b5f5069232c2a6bfd0ceca7fbf95 Mon Sep 17 00:00:00 2001 From: Andre Delfino Date: Wed, 5 Dec 2018 18:08:50 -0300 Subject: [PATCH 2056/2287] [3.6] Correct a couple of unbalanced parenthesis. (GH-10779). (GH-10945) (cherry picked from commit 55f41e45b4318cbe19209f5144641344d0049fb8) Co-authored-by: Andre Delfino --- Doc/c-api/buffer.rst | 2 +- Doc/faq/extending.rst | 2 +- Doc/library/crypt.rst | 2 +- Doc/library/email.compat32-message.rst | 2 +- Doc/library/email.message.rst | 6 +++--- Doc/library/email.parser.rst | 2 +- Doc/library/exceptions.rst | 2 +- Doc/library/stdtypes.rst | 4 ++-- Doc/library/sysconfig.rst | 2 +- Doc/reference/expressions.rst | 2 +- Doc/using/windows.rst | 4 ++-- 11 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Doc/c-api/buffer.rst b/Doc/c-api/buffer.rst index 5a9a46fc67e899..33abb5bb94d9de 100644 --- a/Doc/c-api/buffer.rst +++ b/Doc/c-api/buffer.rst @@ -198,7 +198,7 @@ a buffer, see :c:func:`PyObject_GetBuffer`. indicates that no de-referencing should occur (striding in a contiguous memory block). - If all suboffsets are negative (i.e. no de-referencing is needed, then + If all suboffsets are negative (i.e. no de-referencing is needed), then this field must be NULL (the default value). This type of array representation is used by the Python Imaging Library diff --git a/Doc/faq/extending.rst b/Doc/faq/extending.rst index fd04a83df33c3d..a0828172d48e25 100644 --- a/Doc/faq/extending.rst +++ b/Doc/faq/extending.rst @@ -277,7 +277,7 @@ However sometimes you have to run the embedded Python interpreter in the same thread as your rest application and you can't allow the :c:func:`PyRun_InteractiveLoop` to stop while waiting for user input. The one solution then is to call :c:func:`PyParser_ParseString` and test for ``e.error`` -equal to ``E_EOF``, which means the input is incomplete). Here's a sample code +equal to ``E_EOF``, which means the input is incomplete. Here's a sample code fragment, untested, inspired by code from Alex Farber:: #include diff --git a/Doc/library/crypt.rst b/Doc/library/crypt.rst index dbd4274038472e..bccc76b826214e 100644 --- a/Doc/library/crypt.rst +++ b/Doc/library/crypt.rst @@ -84,7 +84,7 @@ The :mod:`crypt` module defines the following functions: may be available on all platforms), or a full encrypted password including salt, as returned by this function. If *salt* is not provided, the strongest method will be used (as returned by - :func:`methods`. + :func:`methods`). Checking a password is usually done by passing the plain-text password as *word* and the full results of a previous :func:`crypt` call, diff --git a/Doc/library/email.compat32-message.rst b/Doc/library/email.compat32-message.rst index 9f85c5921c8f1a..ed380151769a52 100644 --- a/Doc/library/email.compat32-message.rst +++ b/Doc/library/email.compat32-message.rst @@ -152,7 +152,7 @@ Here are the methods of the :class:`Message` class: Return ``True`` if the message's payload is a list of sub-\ :class:`Message` objects, otherwise return ``False``. When :meth:`is_multipart` returns ``False``, the payload should be a string - object (which might be a CTE encoded binary payload. (Note that + object (which might be a CTE encoded binary payload). (Note that :meth:`is_multipart` returning ``True`` does not necessarily mean that "msg.get_content_maintype() == 'multipart'" will return the ``True``. For example, ``is_multipart`` will return ``True`` when the diff --git a/Doc/library/email.message.rst b/Doc/library/email.message.rst index ff5404553e9606..77b8099a7d4cd3 100644 --- a/Doc/library/email.message.rst +++ b/Doc/library/email.message.rst @@ -92,7 +92,7 @@ message objects. .. method:: __str__() - Equivalent to `as_string(policy=self.policy.clone(utf8=True)`. Allows + Equivalent to ``as_string(policy=self.policy.clone(utf8=True))``. Allows ``str(msg)`` to produce a string containing the serialized message in a readable format. @@ -379,7 +379,7 @@ message objects. Note that existing parameter values of headers may be accessed through the :attr:`~email.headerregistry.BaseHeader.params` attribute of the - header value (for example, ``msg['Content-Type'].params['charset']``. + header value (for example, ``msg['Content-Type'].params['charset']``). .. versionchanged:: 3.4 ``replace`` keyword was added. @@ -679,7 +679,7 @@ message objects. specified by the current :mod:`~email.policy`. If the added part has no :mailheader:`Content-Disposition` header, add one with the value ``attachment``. This method can be used both for explicit attachments - (:mailheader:`Content-Disposition: attachment` and ``inline`` attachments + (:mailheader:`Content-Disposition: attachment`) and ``inline`` attachments (:mailheader:`Content-Disposition: inline`), by passing appropriate options to the ``content_manager``. diff --git a/Doc/library/email.parser.rst b/Doc/library/email.parser.rst index 49b4e992708af1..d9a61616bbbdfb 100644 --- a/Doc/library/email.parser.rst +++ b/Doc/library/email.parser.rst @@ -164,7 +164,7 @@ message body, instead setting the payload to the raw body. envelope header. The header block is terminated either by the end of the data or by a blank line. Following the header block is the body of the message (which may contain MIME-encoded subparts, including subparts - with a :mailheader:`Content-Transfer-Encoding` of ``8bit``. + with a :mailheader:`Content-Transfer-Encoding` of ``8bit``). Optional *headersonly* is a flag specifying whether to stop parsing after reading the headers or not. The default is ``False``, meaning it parses diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst index cfa1649d4d1ffb..5c0cac8997c6ce 100644 --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -52,7 +52,7 @@ will be set as :attr:`__cause__` on the raised exception. Setting :attr:`__cause__` also implicitly sets the :attr:`__suppress_context__` attribute to ``True``, so that using ``raise new_exc from None`` effectively replaces the old exception with the new one for display -purposes (e.g. converting :exc:`KeyError` to :exc:`AttributeError`, while +purposes (e.g. converting :exc:`KeyError` to :exc:`AttributeError`), while leaving the old exception available in :attr:`__context__` for introspection when debugging. diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index a5fca9d4690066..eed37454bc3591 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -445,7 +445,7 @@ Notes: (4) Performing these calculations with at least one extra sign extension bit in a finite two's complement representation (a working bit-width of - ``1 + max(x.bit_length(), y.bit_length()`` or more) is sufficient to get the + ``1 + max(x.bit_length(), y.bit_length())`` or more) is sufficient to get the same result as if there were an infinite number of sign bits. @@ -3175,7 +3175,7 @@ place, and instead produce new objects. Return a copy of the sequence left filled with ASCII ``b'0'`` digits to make a sequence of length *width*. A leading sign prefix (``b'+'``/ - ``b'-'`` is handled by inserting the padding *after* the sign character + ``b'-'``) is handled by inserting the padding *after* the sign character rather than before. For :class:`bytes` objects, the original sequence is returned if *width* is less than or equal to ``len(seq)``. diff --git a/Doc/library/sysconfig.rst b/Doc/library/sysconfig.rst index f066a765d00ec7..d29396e01f2561 100644 --- a/Doc/library/sysconfig.rst +++ b/Doc/library/sysconfig.rst @@ -188,7 +188,7 @@ Other functions Windows will return one of: - - win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) + - win-amd64 (64bit Windows on AMD64, aka x86_64, Intel64, and EM64T) - win-ia64 (64bit Windows on Itanium) - win32 (all others - specifically, sys.platform is returned) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 05f62cd38ba9a2..e13072feebc126 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -1603,7 +1603,7 @@ returned; otherwise, *y* is evaluated and the resulting value is returned. The expression ``x or y`` first evaluates *x*; if *x* is true, its value is returned; otherwise, *y* is evaluated and the resulting value is returned. -(Note that neither :keyword:`and` nor :keyword:`or` restrict the value and type +Note that neither :keyword:`and` nor :keyword:`or` restrict the value and type they return to ``False`` and ``True``, but rather return the last evaluated argument. This is sometimes useful, e.g., if ``s`` is a string that should be replaced by a default value if it is empty, the expression ``s or 'foo'`` yields diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index a4294686fafec1..0ee66561d2cf2f 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -613,11 +613,11 @@ user's "application data" directory (i.e. the directory returned by calling the Windows function ``SHGetFolderPath`` with ``CSIDL_LOCAL_APPDATA``) and ``py.ini`` in the same directory as the launcher. The same .ini files are used for both the 'console' version of the launcher (i.e. py.exe) and for the 'windows' version -(i.e. pyw.exe) +(i.e. pyw.exe). Customization specified in the "application directory" will have precedence over the one next to the executable, so a user, who may not have write access to the -.ini file next to the launcher, can override commands in that global .ini file) +.ini file next to the launcher, can override commands in that global .ini file. Customizing default Python versions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From b2e0649dd9a36d54478d0edb623a18d7379e6f19 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Dec 2018 13:29:08 -0800 Subject: [PATCH 2057/2287] bpo-35310: Clear select() lists before returning upon EINTR (GH-10877) select() calls are retried on EINTR (per PEP 475). However, if a timeout was provided and the deadline has passed after running the signal handlers, rlist, wlist and xlist should be cleared since select(2) left them unmodified. (cherry picked from commit 7f52415a6d4841d77d3b7853e83b25a22e0048dc) Co-authored-by: Oran Avraham <252748+oranav@users.noreply.github.com> --- .../next/Library/2018-12-03-19-45-00.bpo-35310.9k28gR.rst | 4 ++++ Modules/selectmodule.c | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2018-12-03-19-45-00.bpo-35310.9k28gR.rst diff --git a/Misc/NEWS.d/next/Library/2018-12-03-19-45-00.bpo-35310.9k28gR.rst b/Misc/NEWS.d/next/Library/2018-12-03-19-45-00.bpo-35310.9k28gR.rst new file mode 100644 index 00000000000000..1ab2e168c86a27 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-12-03-19-45-00.bpo-35310.9k28gR.rst @@ -0,0 +1,4 @@ +Fix a bug in :func:`select.select` where, in some cases, the file descriptor +sequences were returned unmodified after a signal interruption, even though the +file descriptors might not be ready yet. :func:`select.select` will now always +return empty lists if a timeout has occurred. Patch by Oran Avraham. diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index f02f5ae4e10c8e..4b9965724915d7 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -279,6 +279,10 @@ select_select(PyObject *self, PyObject *args) if (tvp) { timeout = deadline - _PyTime_GetMonotonicClock(); if (timeout < 0) { + /* bpo-35310: lists were unmodified -- clear them explicitly */ + FD_ZERO(&ifdset); + FD_ZERO(&ofdset); + FD_ZERO(&efdset); n = 0; break; } From fdf505000f135df3bdae08697b2a324d8f046768 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Dec 2018 14:03:13 -0800 Subject: [PATCH 2058/2287] bpo-34052: Prevent SQLite functions from setting callbacks on exceptions. (GH-8113). (GH-10946) (GH-10952) (cherry picked from commit 5b25f1d03100e2283c1b129d461ba68ac0169a14) (cherry picked from commit 1de91a0032fed500ddd3d8c4fb7a38c0b8719f67) Co-authored-by: Sergey Fedoseev --- Lib/sqlite3/test/regression.py | 83 ++++++++++++++----- .../2018-07-24-16-37-40.bpo-34052.VbbFAE.rst | 7 ++ Modules/_sqlite/connection.c | 30 +++---- 3 files changed, 84 insertions(+), 36 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-07-24-16-37-40.bpo-34052.VbbFAE.rst diff --git a/Lib/sqlite3/test/regression.py b/Lib/sqlite3/test/regression.py index 34cd233535dc16..1c59a3cd31c625 100644 --- a/Lib/sqlite3/test/regression.py +++ b/Lib/sqlite3/test/regression.py @@ -256,24 +256,6 @@ def CheckPragmaAutocommit(self): cur.execute("pragma page_size") row = cur.fetchone() - def CheckSetDict(self): - """ - See http://bugs.python.org/issue7478 - - It was possible to successfully register callbacks that could not be - hashed. Return codes of PyDict_SetItem were not checked properly. - """ - class NotHashable: - def __call__(self, *args, **kw): - pass - def __hash__(self): - raise TypeError() - var = NotHashable() - self.assertRaises(TypeError, self.con.create_function, var) - self.assertRaises(TypeError, self.con.create_aggregate, var) - self.assertRaises(TypeError, self.con.set_authorizer, var) - self.assertRaises(TypeError, self.con.set_progress_handler, var) - def CheckConnectionCall(self): """ Call a connection with a non-string SQL request: check error handling @@ -398,9 +380,72 @@ def callback(*args): support.gc_collect() +class UnhashableFunc: + __hash__ = None + + def __init__(self, return_value=None): + self.calls = 0 + self.return_value = return_value + + def __call__(self, *args, **kwargs): + self.calls += 1 + return self.return_value + + +class UnhashableCallbacksTestCase(unittest.TestCase): + """ + https://bugs.python.org/issue34052 + + Registering unhashable callbacks raises TypeError, callbacks are not + registered in SQLite after such registration attempt. + """ + def setUp(self): + self.con = sqlite.connect(':memory:') + + def tearDown(self): + self.con.close() + + def test_progress_handler(self): + f = UnhashableFunc(return_value=0) + with self.assertRaisesRegex(TypeError, 'unhashable type'): + self.con.set_progress_handler(f, 1) + self.con.execute('SELECT 1') + self.assertFalse(f.calls) + + def test_func(self): + func_name = 'func_name' + f = UnhashableFunc() + with self.assertRaisesRegex(TypeError, 'unhashable type'): + self.con.create_function(func_name, 0, f) + msg = 'no such function: %s' % func_name + with self.assertRaisesRegex(sqlite.OperationalError, msg): + self.con.execute('SELECT %s()' % func_name) + self.assertFalse(f.calls) + + def test_authorizer(self): + f = UnhashableFunc(return_value=sqlite.SQLITE_DENY) + with self.assertRaisesRegex(TypeError, 'unhashable type'): + self.con.set_authorizer(f) + self.con.execute('SELECT 1') + self.assertFalse(f.calls) + + def test_aggr(self): + class UnhashableType(type): + __hash__ = None + aggr_name = 'aggr_name' + with self.assertRaisesRegex(TypeError, 'unhashable type'): + self.con.create_aggregate(aggr_name, 0, UnhashableType('Aggr', (), {})) + msg = 'no such function: %s' % aggr_name + with self.assertRaisesRegex(sqlite.OperationalError, msg): + self.con.execute('SELECT %s()' % aggr_name) + + def suite(): regression_suite = unittest.makeSuite(RegressionTests, "Check") - return unittest.TestSuite((regression_suite,)) + return unittest.TestSuite(( + regression_suite, + unittest.makeSuite(UnhashableCallbacksTestCase), + )) def test(): runner = unittest.TextTestRunner() diff --git a/Misc/NEWS.d/next/Library/2018-07-24-16-37-40.bpo-34052.VbbFAE.rst b/Misc/NEWS.d/next/Library/2018-07-24-16-37-40.bpo-34052.VbbFAE.rst new file mode 100644 index 00000000000000..5aa3cc9a81d7f3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-07-24-16-37-40.bpo-34052.VbbFAE.rst @@ -0,0 +1,7 @@ +:meth:`sqlite3.Connection.create_aggregate`, +:meth:`sqlite3.Connection.create_function`, +:meth:`sqlite3.Connection.set_authorizer`, +:meth:`sqlite3.Connection.set_progress_handler` methods raises TypeError +when unhashable objects are passed as callable. These methods now don't pass +such objects to SQLite API. Previous behavior could lead to segfaults. Patch +by Sergey Fedoseev. diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index d86caef7ab6052..326d268a7a4e15 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -836,18 +836,17 @@ PyObject* pysqlite_connection_create_function(pysqlite_Connection* self, PyObjec return NULL; } + if (PyDict_SetItem(self->function_pinboard, func, Py_None) == -1) { + return NULL; + } rc = sqlite3_create_function(self->db, name, narg, SQLITE_UTF8, (void*)func, _pysqlite_func_callback, NULL, NULL); if (rc != SQLITE_OK) { /* Workaround for SQLite bug: no error code or string is available here */ PyErr_SetString(pysqlite_OperationalError, "Error creating function"); return NULL; - } else { - if (PyDict_SetItem(self->function_pinboard, func, Py_None) == -1) - return NULL; - - Py_RETURN_NONE; } + Py_RETURN_NONE; } PyObject* pysqlite_connection_create_aggregate(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) @@ -868,17 +867,16 @@ PyObject* pysqlite_connection_create_aggregate(pysqlite_Connection* self, PyObje return NULL; } + if (PyDict_SetItem(self->function_pinboard, aggregate_class, Py_None) == -1) { + return NULL; + } rc = sqlite3_create_function(self->db, name, n_arg, SQLITE_UTF8, (void*)aggregate_class, 0, &_pysqlite_step_callback, &_pysqlite_final_callback); if (rc != SQLITE_OK) { /* Workaround for SQLite bug: no error code or string is available here */ PyErr_SetString(pysqlite_OperationalError, "Error creating aggregate"); return NULL; - } else { - if (PyDict_SetItem(self->function_pinboard, aggregate_class, Py_None) == -1) - return NULL; - - Py_RETURN_NONE; } + Py_RETURN_NONE; } static int _authorizer_callback(void* user_arg, int action, const char* arg1, const char* arg2 , const char* dbname, const char* access_attempt_source) @@ -1003,17 +1001,15 @@ static PyObject* pysqlite_connection_set_authorizer(pysqlite_Connection* self, P return NULL; } + if (PyDict_SetItem(self->function_pinboard, authorizer_cb, Py_None) == -1) { + return NULL; + } rc = sqlite3_set_authorizer(self->db, _authorizer_callback, (void*)authorizer_cb); - if (rc != SQLITE_OK) { PyErr_SetString(pysqlite_OperationalError, "Error setting authorizer callback"); return NULL; - } else { - if (PyDict_SetItem(self->function_pinboard, authorizer_cb, Py_None) == -1) - return NULL; - - Py_RETURN_NONE; } + Py_RETURN_NONE; } static PyObject* pysqlite_connection_set_progress_handler(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) @@ -1036,9 +1032,9 @@ static PyObject* pysqlite_connection_set_progress_handler(pysqlite_Connection* s /* None clears the progress handler previously set */ sqlite3_progress_handler(self->db, 0, 0, (void*)0); } else { - sqlite3_progress_handler(self->db, n, _progress_handler, progress_handler); if (PyDict_SetItem(self->function_pinboard, progress_handler, Py_None) == -1) return NULL; + sqlite3_progress_handler(self->db, n, _progress_handler, progress_handler); } Py_RETURN_NONE; From 3a9b3346b03796d8573c063ab4c2407043609459 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Dec 2018 14:04:19 -0800 Subject: [PATCH 2059/2287] bpo-34604: Use %R because of invisible characters or trailing whitespaces. (GH-9165). (GH-10947) (GH-10954) (cherry picked from commit 34c7f0c04e2b4e715b2c3df1875af8939fbe7d0b) (cherry picked from commit ac8b47c8b4edd59aaee857717d434df52ec49e6c) Co-authored-by: William Grzybowski --- .../next/Library/2018-09-07-10-16-34.bpo-34604.xL7-kG.rst | 3 +++ Modules/grpmodule.c | 2 +- Modules/pwdmodule.c | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-09-07-10-16-34.bpo-34604.xL7-kG.rst diff --git a/Misc/NEWS.d/next/Library/2018-09-07-10-16-34.bpo-34604.xL7-kG.rst b/Misc/NEWS.d/next/Library/2018-09-07-10-16-34.bpo-34604.xL7-kG.rst new file mode 100644 index 00000000000000..958b74fd0da69f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-09-07-10-16-34.bpo-34604.xL7-kG.rst @@ -0,0 +1,3 @@ +Fix possible mojibake in the error message of `pwd.getpwnam` and +`grp.getgrnam` using string representation because of invisible characters +or trailing whitespaces. Patch by William Grzybowski. diff --git a/Modules/grpmodule.c b/Modules/grpmodule.c index 43e45ef7aad5c1..8a724b6b438fc5 100644 --- a/Modules/grpmodule.c +++ b/Modules/grpmodule.c @@ -156,7 +156,7 @@ grp_getgrnam_impl(PyObject *module, PyObject *name) goto out; if ((p = getgrnam(name_chars)) == NULL) { - PyErr_Format(PyExc_KeyError, "getgrnam(): name not found: %S", name); + PyErr_Format(PyExc_KeyError, "getgrnam(): name not found: %R", name); goto out; } retval = mkgrent(p); diff --git a/Modules/pwdmodule.c b/Modules/pwdmodule.c index 21c2b546f6ddaf..810427a229b7f4 100644 --- a/Modules/pwdmodule.c +++ b/Modules/pwdmodule.c @@ -163,7 +163,7 @@ pwd_getpwnam_impl(PyObject *module, PyObject *arg) goto out; if ((p = getpwnam(name)) == NULL) { PyErr_Format(PyExc_KeyError, - "getpwnam(): name not found: %S", arg); + "getpwnam(): name not found: %R", arg); goto out; } retval = mkpwent(p); From 2997fa42bbd7a079a316b9acb134c5d9d12f05ee Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 5 Dec 2018 14:19:18 -0800 Subject: [PATCH 2060/2287] [3.6] Fix typos in concurrent.Futures documentation (GH-10920) (GH-10958) Add a missing word `as` in `as well as an`. Linkify `threading.Thread`.. (cherry picked from commit 40a61da40d252626f8b9ff524d76c1f0ccb3a4f7) Co-authored-by: Matt Wheeler --- Doc/library/concurrent.futures.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index 9794e735d42254..69dfd0f47c1cef 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -137,6 +137,12 @@ And:: An :class:`Executor` subclass that uses a pool of at most *max_workers* threads to execute calls asynchronously. + *initializer* is an optional callable that is called at the start of + each worker thread; *initargs* is a tuple of arguments passed to the + initializer. Should *initializer* raise an exception, all currently + pending jobs will raise a :exc:`~concurrent.futures.thread.BrokenThreadPool`, + as well any attempt to submit more jobs to the pool. + .. versionchanged:: 3.5 If *max_workers* is ``None`` or not given, it will default to the number of processors on the machine, @@ -147,7 +153,7 @@ And:: .. versionadded:: 3.6 The *thread_name_prefix* argument was added to allow users to - control the threading.Thread names for worker threads created by + control the :class:`threading.Thread` names for worker threads created by the pool for easier debugging. .. _threadpoolexecutor-example: From 4699f2aa26b2f8befa77852e0c6fba0b474a2748 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Dec 2018 15:43:38 -0800 Subject: [PATCH 2061/2287] bpo-35363: test_eintr runs eintr_tester.py in verbose mode (GH-10965) Moreover, "python3 -m test test_eintr -v" now avoids redirecting stdout/stderr to a pipe, the child process inherits stdout/stderr from the parent. (cherry picked from commit aa8ae904ad2f576f8e7b38a9a6542d3e9a569be9) Co-authored-by: Victor Stinner --- Lib/test/test_eintr.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_eintr.py b/Lib/test/test_eintr.py index 25f86d31de3548..c2e8deadbab752 100644 --- a/Lib/test/test_eintr.py +++ b/Lib/test/test_eintr.py @@ -1,5 +1,7 @@ import os import signal +import subprocess +import sys import unittest from test import support @@ -15,7 +17,19 @@ def test_all(self): # thread (for reliable signal delivery). tester = support.findfile("eintr_tester.py", subdir="eintrdata") # use -u to try to get the full output if the test hangs or crash - script_helper.assert_python_ok("-u", tester) + args = ["-u", tester, "-v"] + if support.verbose: + print() + print("--- run eintr_tester.py ---") + # In verbose mode, the child process inherit stdout and stdout, + # to see output in realtime and reduce the risk of loosing output. + args = [sys.executable, "-E", "-X", "faulthandler", *args] + proc = subprocess.run(args) + print(f"--- eintr_tester.py completed: exit code {proc.returncode} ---") + if proc.returncode: + self.fail("eintr_tester.py failed") + else: + script_helper.assert_python_ok("-u", tester, "-v") if __name__ == "__main__": From f7fe18a9254cb1a868801968f315467547d33996 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 5 Dec 2018 15:53:21 -0800 Subject: [PATCH 2062/2287] [3.6] Fix typo in xml.dom.minidom documentation (GH-10956) (GH-10962) Escape the \t and \n. Follow up from https://github.com/python/cpython/pull/10814.. (cherry picked from commit 2d8f976cde4794d174b44ff7d5fd970aa89c65e8) Co-authored-by: E Kawashima --- Doc/library/xml.dom.minidom.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/xml.dom.minidom.rst b/Doc/library/xml.dom.minidom.rst index d5d7b20efe60b6..15b1cb0cbf78f0 100644 --- a/Doc/library/xml.dom.minidom.rst +++ b/Doc/library/xml.dom.minidom.rst @@ -156,7 +156,7 @@ module documentation. This section lists the differences between the API and encoding. Encoding this string in an encoding other than UTF-8 is likely incorrect, since UTF-8 is the default encoding of XML. -.. method:: Node.toprettyxml(indent="\t", newl="\n", encoding=None) +.. method:: Node.toprettyxml(indent="\\t", newl="\\n", encoding=None) Return a pretty-printed version of the document. *indent* specifies the indentation string and defaults to a tabulator; *newl* specifies the string From eb38ee052e2273568d0041e969aa851ee44e43ce Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 6 Dec 2018 01:49:34 +0100 Subject: [PATCH 2063/2287] [3.6] Revert "bpo-34172: multiprocessing.Pool leaks resources after being deleted (GH-8450) (GH-9677)" (GH-10969) This reverts commit 07b96a95db78eff3557d1bfed1df9ebecc40815b. --- Lib/multiprocessing/pool.py | 74 ++++++------------- Lib/test/_test_multiprocessing.py | 7 -- .../2018-12-06-00-31-25.bpo-34172.l7CIYt.rst | 3 + 3 files changed, 27 insertions(+), 57 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-12-06-00-31-25.bpo-34172.l7CIYt.rst diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py index 32254d8ea6cfbe..a545f3c1a18961 100644 --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -147,9 +147,8 @@ class Pool(object): ''' _wrap_exception = True - @staticmethod - def Process(ctx, *args, **kwds): - return ctx.Process(*args, **kwds) + def Process(self, *args, **kwds): + return self._ctx.Process(*args, **kwds) def __init__(self, processes=None, initializer=None, initargs=(), maxtasksperchild=None, context=None): @@ -176,15 +175,13 @@ def __init__(self, processes=None, initializer=None, initargs=(), self._worker_handler = threading.Thread( target=Pool._handle_workers, - args=(self._cache, self._taskqueue, self._ctx, self.Process, - self._processes, self._pool, self._inqueue, self._outqueue, - self._initializer, self._initargs, self._maxtasksperchild, - self._wrap_exception) + args=(self, ) ) self._worker_handler.daemon = True self._worker_handler._state = RUN self._worker_handler.start() + self._task_handler = threading.Thread( target=Pool._handle_tasks, args=(self._taskqueue, self._quick_put, self._outqueue, @@ -210,62 +207,43 @@ def __init__(self, processes=None, initializer=None, initargs=(), exitpriority=15 ) - @staticmethod - def _join_exited_workers(pool): + def _join_exited_workers(self): """Cleanup after any worker processes which have exited due to reaching their specified lifetime. Returns True if any workers were cleaned up. """ cleaned = False - for i in reversed(range(len(pool))): - worker = pool[i] + for i in reversed(range(len(self._pool))): + worker = self._pool[i] if worker.exitcode is not None: # worker exited util.debug('cleaning up worker %d' % i) worker.join() cleaned = True - del pool[i] + del self._pool[i] return cleaned def _repopulate_pool(self): - return self._repopulate_pool_static(self._ctx, self.Process, - self._processes, - self._pool, self._inqueue, - self._outqueue, self._initializer, - self._initargs, - self._maxtasksperchild, - self._wrap_exception) - - @staticmethod - def _repopulate_pool_static(ctx, Process, processes, pool, inqueue, - outqueue, initializer, initargs, - maxtasksperchild, wrap_exception): """Bring the number of pool processes up to the specified number, for use after reaping workers which have exited. """ - for i in range(processes - len(pool)): - w = Process(ctx, target=worker, - args=(inqueue, outqueue, - initializer, - initargs, maxtasksperchild, - wrap_exception) - ) - pool.append(w) + for i in range(self._processes - len(self._pool)): + w = self.Process(target=worker, + args=(self._inqueue, self._outqueue, + self._initializer, + self._initargs, self._maxtasksperchild, + self._wrap_exception) + ) + self._pool.append(w) w.name = w.name.replace('Process', 'PoolWorker') w.daemon = True w.start() util.debug('added worker') - @staticmethod - def _maintain_pool(ctx, Process, processes, pool, inqueue, outqueue, - initializer, initargs, maxtasksperchild, - wrap_exception): + def _maintain_pool(self): """Clean up any exited workers and start replacements for them. """ - if Pool._join_exited_workers(pool): - Pool._repopulate_pool_static(ctx, Process, processes, pool, - inqueue, outqueue, initializer, - initargs, maxtasksperchild, - wrap_exception) + if self._join_exited_workers(): + self._repopulate_pool() def _setup_queues(self): self._inqueue = self._ctx.SimpleQueue() @@ -418,20 +396,16 @@ def _map_async(self, func, iterable, mapper, chunksize=None, callback=None, return result @staticmethod - def _handle_workers(cache, taskqueue, ctx, Process, processes, pool, - inqueue, outqueue, initializer, initargs, - maxtasksperchild, wrap_exception): + def _handle_workers(pool): thread = threading.current_thread() # Keep maintaining workers until the cache gets drained, unless the pool # is terminated. - while thread._state == RUN or (cache and thread._state != TERMINATE): - Pool._maintain_pool(ctx, Process, processes, pool, inqueue, - outqueue, initializer, initargs, - maxtasksperchild, wrap_exception) + while thread._state == RUN or (pool._cache and thread._state != TERMINATE): + pool._maintain_pool() time.sleep(0.1) # send sentinel to stop workers - taskqueue.put(None) + pool._taskqueue.put(None) util.debug('worker handler exiting') @staticmethod @@ -807,7 +781,7 @@ class ThreadPool(Pool): _wrap_exception = False @staticmethod - def Process(ctx, *args, **kwds): + def Process(*args, **kwds): from .dummy import Process return Process(*args, **kwds) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 59f9a2e1e2eb62..6cafc2e9cbc0e2 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -2286,13 +2286,6 @@ def test_release_task_refs(self): # they were released too. self.assertEqual(CountedObject.n_instances, 0) - @support.reap_threads - def test_del_pool(self): - p = self.Pool(1) - wr = weakref.ref(p) - del p - gc.collect() - self.assertIsNone(wr()) def raising(): raise KeyError("key") diff --git a/Misc/NEWS.d/next/Library/2018-12-06-00-31-25.bpo-34172.l7CIYt.rst b/Misc/NEWS.d/next/Library/2018-12-06-00-31-25.bpo-34172.l7CIYt.rst new file mode 100644 index 00000000000000..e467cc96782591 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-12-06-00-31-25.bpo-34172.l7CIYt.rst @@ -0,0 +1,3 @@ +REVERT: Fix a reference issue inside multiprocessing.Pool that caused the +pool to remain alive if it was deleted without being closed or terminated +explicitly. From af31228650d30f02a283d291ba106e84275a04c1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 5 Dec 2018 23:26:51 -0800 Subject: [PATCH 2064/2287] bpo-33709: test_ntpath and test_posixpath fail in Windows with ACP!=1252. (GH-7278) (cherry picked from commit 8752dfbd1f0c96ca09cdacabaf0d0f8c3895b6ce) Co-authored-by: native-api --- Lib/test/support/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index c0627dc14ef067..66c0fed8411c19 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -857,7 +857,11 @@ def dec(*args, **kwargs): '\u20AC', ): try: - os.fsdecode(os.fsencode(character)) + # If Python is set up to use the legacy 'mbcs' in Windows, + # 'replace' error mode is used, and encode() returns b'?' + # for characters missing in the ANSI codepage + if os.fsdecode(os.fsencode(character)) != character: + raise UnicodeError except UnicodeError: pass else: From af1f977575331623547d53247d99be8953a13b9f Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Thu, 6 Dec 2018 03:25:57 -0500 Subject: [PATCH 2065/2287] [3.6] bpo-34162: Update idlelib NEWS to 2018-12-05 (GH-10964) (GH-10979) Cherry-picked from 6ea9d54. --- Lib/idlelib/NEWS.txt | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 8ecd85a9ceb69d..0868b1f1a3c324 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -1,8 +1,46 @@ -What's New in IDLE 3.6.7 -Released on 2018-09-24? +What's New in IDLE 3.6.8 +Released on 2018-12-20? +**This is the final 3.6 bugfix maintenance release** ====================================== +bpo-35213: Where appropriate, use 'macOS' in idlelib. + +bpo-34864: Document two IDLE on MacOS issues. The System Preferences +Dock "prefer tabs always" setting disables some IDLE features. +Menus are a bit different than as described for Windows and Linux. + +bpo-35202: Remove unused imports in idlelib. + +bpo-33000: Document that IDLE's shell has no line limit. +A program that runs indefinitely can overfill memory. + +bpo-23220: Explain how IDLE's Shell displays output. +Add new subsection "User output in Shell". + +bpo-35099: Improve the doc about IDLE running user code. +"IDLE -- console differences" is renamed "Running user code". +It mostly covers the implications of using custom sys.stdxxx objects. + +bpo-35097: Add IDLE doc subsection explaining editor windows. +Topics include opening, title and status bars, .py* extension, and running. + +Issue 35093: Document the IDLE document viewer in the IDLE doc. +Add a paragraph in "Help and preferences", "Help sources" subsection. + +bpo-1529353: Explain Shell text squeezing in the IDLE doc. + +bpo-35088: Update idlelib.help.copy_string docstring. +We now use git and backporting instead of hg and forward merging. + +bpo-35087: Update idlelib help files for the current doc build. +The main change is the elimination of chapter-section numbers. + + +What's New in IDLE 3.6.7 +Released on 2018-10-20 +====================================== + bpo-1529353: Output over N lines (50 by default) is squeezed down to a button. N can be changed in the PyShell section of the General page of the Settings dialog. Fewer, but possibly extra long, lines can be squeezed by From f9d8b686285926c985cfe88a8392a9a497c0a916 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 6 Dec 2018 01:41:16 -0800 Subject: [PATCH 2066/2287] bpo-35384: The repr of ctypes.CArgObject no longer fails for non-ascii character. (GH-10863) (cherry picked from commit 3ffa8b9ba190101f674a0e524e482a83ed09cccd) Co-authored-by: Serhiy Storchaka --- Lib/ctypes/test/test_bytes.py | 1 + Modules/_ctypes/callproc.c | 26 ++++++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/Lib/ctypes/test/test_bytes.py b/Lib/ctypes/test/test_bytes.py index 20fa05650340a0..092ec5af0524c4 100644 --- a/Lib/ctypes/test/test_bytes.py +++ b/Lib/ctypes/test/test_bytes.py @@ -12,6 +12,7 @@ def test_c_char(self): x.value = "y" c_char.from_param(b"x") self.assertRaises(TypeError, c_char.from_param, "x") + self.assertIn('xbd', repr(c_char.from_param(b"\xbd"))) (c_char * 3)(b"a", b"b", b"c") self.assertRaises(TypeError, c_char * 3, "a", "b", "c") diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 04fbc010ca7dfc..d1c190f3591086 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -452,6 +452,12 @@ PyCArg_dealloc(PyCArgObject *self) PyObject_Del(self); } +static int +is_literal_char(unsigned char c) +{ + return c < 128 && _PyUnicode_IsPrintable(c) && c != '\\' && c != '\''; +} + static PyObject * PyCArg_repr(PyCArgObject *self) { @@ -498,8 +504,14 @@ PyCArg_repr(PyCArgObject *self) break; case 'c': - sprintf(buffer, "", - self->tag, self->value.c); + if (is_literal_char((unsigned char)self->value.c)) { + sprintf(buffer, "", + self->tag, self->value.c); + } + else { + sprintf(buffer, "", + self->tag, (unsigned char)self->value.c); + } break; /* Hm, are these 'z' and 'Z' codes useful at all? @@ -514,8 +526,14 @@ PyCArg_repr(PyCArgObject *self) break; default: - sprintf(buffer, "", - self->tag, self); + if (is_literal_char((unsigned char)self->tag)) { + sprintf(buffer, "", + (unsigned char)self->tag, self); + } + else { + sprintf(buffer, "", + (unsigned char)self->tag, self); + } break; } return PyUnicode_FromString(buffer); From e44b5b2afa6fe2966d8caff45e36c0980413bb86 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 6 Dec 2018 03:23:20 -0800 Subject: [PATCH 2067/2287] bpo-35424: test_multiprocessing: join 3 pools (GH-10986) Join 3 pools in these tests: * test.test_multiprocessing_spawn.WithProcessesTestPool.test_context * test.test_multiprocessing_spawn.WithProcessesTestPool.test_traceback (cherry picked from commit 388c8c208d9d09bd28289c1e4776b947d4d0f0f0) Co-authored-by: Victor Stinner --- Lib/test/_test_multiprocessing.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 6cafc2e9cbc0e2..d5c1ec1284828a 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -2199,6 +2199,7 @@ def test_context(self): with self.Pool(2) as p: r = p.map_async(sqr, L) self.assertEqual(r.get(), expected) + p.join() self.assertRaises(ValueError, p.map_async, sqr, L) @classmethod @@ -2216,6 +2217,7 @@ def test_traceback(self): exc = e else: self.fail('expected RuntimeError') + p.join() self.assertIs(type(exc), RuntimeError) self.assertEqual(exc.args, (123,)) cause = exc.__cause__ @@ -2240,6 +2242,7 @@ def test_traceback(self): self.fail('expected SayWhenError') self.assertIs(type(exc), SayWhenError) self.assertIs(exc.__cause__, None) + p.join() @classmethod def _test_wrapped_exception(cls): From 3f0e8e225e2275d22c4bd2e8f8f212b6a8b849aa Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 6 Dec 2018 05:40:31 -0800 Subject: [PATCH 2068/2287] bpo-35363: test_eintr uses print(flush=True) (GH-10990) (cherry picked from commit 0644b33821b70efbf0ac1ec1fb8729b05796564a) Co-authored-by: Victor Stinner --- Lib/test/test_eintr.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_eintr.py b/Lib/test/test_eintr.py index c2e8deadbab752..f61efa3c648e66 100644 --- a/Lib/test/test_eintr.py +++ b/Lib/test/test_eintr.py @@ -20,12 +20,13 @@ def test_all(self): args = ["-u", tester, "-v"] if support.verbose: print() - print("--- run eintr_tester.py ---") + print("--- run eintr_tester.py ---", flush=True) # In verbose mode, the child process inherit stdout and stdout, # to see output in realtime and reduce the risk of loosing output. args = [sys.executable, "-E", "-X", "faulthandler", *args] proc = subprocess.run(args) - print(f"--- eintr_tester.py completed: exit code {proc.returncode} ---") + print(f"--- eintr_tester.py completed: " + f"exit code {proc.returncode} ---", flush=True) if proc.returncode: self.fail("eintr_tester.py failed") else: From 7a2cf1e7d3bf300e98c702589d405734f4a8fcf8 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 6 Dec 2018 23:00:39 +0200 Subject: [PATCH 2069/2287] bpo-33023: Fix NotImplemented to NotImplementedError. (GH-10934). (GH-11001) (cherry picked from commit 42b1d6127bd8595522a78a75166ebb9fba74a6a2) --- Lib/idlelib/debugger_r.py | 2 +- Lib/ssl.py | 4 ++-- Lib/test/test_ssl.py | 10 ++++++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Lib/idlelib/debugger_r.py b/Lib/idlelib/debugger_r.py index 01a3bd25998fc0..0e6dcfbd12c2ab 100644 --- a/Lib/idlelib/debugger_r.py +++ b/Lib/idlelib/debugger_r.py @@ -157,7 +157,7 @@ def code_filename(self, cid): #----------called by a DictProxy---------- def dict_keys(self, did): - raise NotImplemented("dict_keys not public or pickleable") + raise NotImplementedError("dict_keys not public or pickleable") ## dict = dicttable[did] ## return dict.keys() diff --git a/Lib/ssl.py b/Lib/ssl.py index cd216a15cda836..58d3e939226b37 100644 --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -848,8 +848,8 @@ def session_reused(self): return self._sslobj.session_reused def dup(self): - raise NotImplemented("Can't dup() %s instances" % - self.__class__.__name__) + raise NotImplementedError("Can't dup() %s instances" % + self.__class__.__name__) def _checkClosed(self, msg=None): # raise an exception here if you wish to check for spurious closes diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 2f0b6a75e96f19..705f1d3245b677 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -408,6 +408,12 @@ def test_wrapped_unconnected(self): self.assertRaises(OSError, ss.recvfrom_into, bytearray(b'x'), 1) self.assertRaises(OSError, ss.send, b'x') self.assertRaises(OSError, ss.sendto, b'x', ('0.0.0.0', 0)) + self.assertRaises(NotImplementedError, ss.dup) + self.assertRaises(NotImplementedError, ss.sendmsg, + [b'x'], (), 0, ('0.0.0.0', 0)) + self.assertRaises(NotImplementedError, ss.recvmsg, 100) + self.assertRaises(NotImplementedError, ss.recvmsg_into, + [bytearray(100)]) def test_timeout(self): # Issue #8524: when creating an SSL socket, the timeout of the @@ -2942,11 +2948,11 @@ def _recvfrom_into(): # Make sure sendmsg et al are disallowed to avoid # inadvertent disclosure of data and/or corruption # of the encrypted data stream + self.assertRaises(NotImplementedError, s.dup) self.assertRaises(NotImplementedError, s.sendmsg, [b"data"]) self.assertRaises(NotImplementedError, s.recvmsg, 100) self.assertRaises(NotImplementedError, - s.recvmsg_into, bytearray(100)) - + s.recvmsg_into, [bytearray(100)]) s.write(b"over\n") self.assertRaises(ValueError, s.recv, -1) From a51a5ca77eae079b34f911975a77e713b0c237f1 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 6 Dec 2018 13:32:31 -0800 Subject: [PATCH 2070/2287] Add missing period in distutils.dep_util.newer_group doc (GH-11003) (cherry picked from commit c9566b8c454120e3d0ddb5ab970f262a6cd80077) Co-authored-by: Andre Delfino --- Doc/distutils/apiref.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst index f6163258df2e3a..207f43864c9318 100644 --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -937,7 +937,7 @@ timestamp dependency analysis. .. function:: newer_group(sources, target[, missing='error']) Return true if *target* is out-of-date with respect to any file listed in - *sources* In other words, if *target* exists and is newer than every file in + *sources*. In other words, if *target* exists and is newer than every file in *sources*, return false; otherwise return true. *missing* controls what we do when a source file is missing; the default (``'error'``) is to blow up with an :exc:`OSError` from inside :func:`os.stat`; if it is ``'ignore'``, we silently From 10665544a97b6616898faafc12ac9d06505d0690 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 6 Dec 2018 23:03:32 -0800 Subject: [PATCH 2071/2287] bpo-34864: warn if "Prefer tabs when opening documents" set to "Always" (GH-10464) * bpo-34864: warn if "Prefer tabs when opening documents" set to "Always" * add NEWS entry * address code review comments * address second code review comments * Add entry for idlelib/NEWS.txt. (cherry picked from commit 9ebe8794f003dadfff578a066ea503a3e37ffe1d) Co-authored-by: Tal Einat --- Lib/idlelib/NEWS.txt | 6 +++ Lib/idlelib/macosx.py | 43 +++++++++++++++++-- Lib/idlelib/outwin.py | 2 +- Lib/idlelib/pyshell.py | 25 +++++++++-- .../2018-11-11-17-13-50.bpo-34864.cw0PvO.rst | 2 + 5 files changed, 69 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2018-11-11-17-13-50.bpo-34864.cw0PvO.rst diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 0868b1f1a3c324..e2951b0e6d7b79 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -4,6 +4,12 @@ Released on 2018-12-20? ====================================== +bpo-34864: When starting IDLE on MacOS, warn if the system setting +"Prefer tabs when opening documents" is "Always". As previous +documented for this issue, running IDLE with this setting causes +problems. If the setting is changed while IDLE is running, +there will be no warning until IDLE is restarted. + bpo-35213: Where appropriate, use 'macOS' in idlelib. bpo-34864: Document two IDLE on MacOS issues. The System Preferences diff --git a/Lib/idlelib/macosx.py b/Lib/idlelib/macosx.py index 8f8484a37015d4..9be4ed2ec411d5 100644 --- a/Lib/idlelib/macosx.py +++ b/Lib/idlelib/macosx.py @@ -1,6 +1,8 @@ """ A number of functions that enhance IDLE on macOS. """ +from os.path import expanduser +import plistlib from sys import platform # Used in _init_tk_type, changed by test. import tkinter @@ -79,14 +81,47 @@ def tkVersionWarning(root): patchlevel = root.tk.call('info', 'patchlevel') if patchlevel not in ('8.5.7', '8.5.9'): return False - return (r"WARNING: The version of Tcl/Tk ({0}) in use may" - r" be unstable.\n" - r"Visit http://www.python.org/download/mac/tcltk/" - r" for current information.".format(patchlevel)) + return ("WARNING: The version of Tcl/Tk ({0}) in use may" + " be unstable.\n" + "Visit http://www.python.org/download/mac/tcltk/" + " for current information.".format(patchlevel)) else: return False +def readSystemPreferences(): + """ + Fetch the macOS system preferences. + """ + if platform != 'darwin': + return None + + plist_path = expanduser('~/Library/Preferences/.GlobalPreferences.plist') + try: + with open(plist_path, 'rb') as plist_file: + return plistlib.load(plist_file) + except OSError: + return None + + +def preferTabsPreferenceWarning(): + """ + Warn if "Prefer tabs when opening documents" is set to "Always". + """ + if platform != 'darwin': + return None + + prefs = readSystemPreferences() + if prefs and prefs.get('AppleWindowTabbingMode') == 'always': + return ( + 'WARNING: The system preference "Prefer tabs when opening' + ' documents" is set to "Always". This will cause various problems' + ' with IDLE. For the best experience, change this setting when' + ' running IDLE (via System Preferences -> Dock).' + ) + return None + + ## Fix the menu and related functions. def addOpenEventSupport(root, flist): diff --git a/Lib/idlelib/outwin.py b/Lib/idlelib/outwin.py index 4af9f1afaed518..e962142498dfd8 100644 --- a/Lib/idlelib/outwin.py +++ b/Lib/idlelib/outwin.py @@ -109,7 +109,7 @@ def write(self, s, tags=(), mark="insert"): Return: Length of text inserted. """ - if isinstance(s, (bytes, bytes)): + if isinstance(s, bytes): s = s.decode(iomenu.encoding, "replace") self.text.insert(mark, s, tags) self.text.see(mark) diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index 47eef4399ce6b3..81a97ef6d6bcc5 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -38,6 +38,7 @@ import re import socket import subprocess +from textwrap import TextWrapper import threading import time import tokenize @@ -1273,6 +1274,14 @@ def showprompt(self): self.set_line_and_column() self.io.reset_undo() + def show_warning(self, msg): + width = self.interp.tkconsole.width + wrapper = TextWrapper(width=width, tabsize=8, expand_tabs=True) + wrapped_msg = '\n'.join(wrapper.wrap(msg)) + if not wrapped_msg.endswith('\n'): + wrapped_msg += '\n' + self.per.bottom.insert("iomark linestart", wrapped_msg, "stderr") + def resetoutput(self): source = self.text.get("iomark", "end-1c") if self.history: @@ -1541,12 +1550,20 @@ def main(): shell.interp.execfile(script) elif shell: # If there is a shell window and no cmd or script in progress, - # check for problematic OS X Tk versions and print a warning - # message in the IDLE shell window; this is less intrusive - # than always opening a separate window. + # check for problematic issues and print warning message(s) in + # the IDLE shell window; this is less intrusive than always + # opening a separate window. + + # Warn if using a problematic OS X Tk version. tkversionwarning = macosx.tkVersionWarning(root) if tkversionwarning: - shell.interp.runcommand("print('%s')" % tkversionwarning) + shell.show_warning(tkversionwarning) + + # Warn if the "Prefer tabs when opening documents" system + # preference is set to "Always". + prefer_tabs_preference_warning = macosx.preferTabsPreferenceWarning() + if prefer_tabs_preference_warning: + shell.show_warning(prefer_tabs_preference_warning) while flist.inversedict: # keep IDLE running while files are open. root.mainloop() diff --git a/Misc/NEWS.d/next/IDLE/2018-11-11-17-13-50.bpo-34864.cw0PvO.rst b/Misc/NEWS.d/next/IDLE/2018-11-11-17-13-50.bpo-34864.cw0PvO.rst new file mode 100644 index 00000000000000..8d2b61d599ff56 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2018-11-11-17-13-50.bpo-34864.cw0PvO.rst @@ -0,0 +1,2 @@ +On macOS, warn if the system preference "Prefer tabs when opening documents" +is set to "Always". \ No newline at end of file From 19f6e83bf03b3ce22300638906bd90dd2dd5c463 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 7 Dec 2018 05:53:32 -0800 Subject: [PATCH 2072/2287] bpo-22005: Fixed unpickling instances of datetime classes pickled by Python 2. (GH-11017) (GH-11022) (GH-11024) encoding='latin1' should be used for successful decoding. (cherry picked from commit 8452ca15f41061c8a6297d7956df22ab476d4df4) (cherry picked from commit 0d5730e6437b157f4aeaf5d2e67abca23448c29a) --- Doc/library/pickle.rst | 6 + Lib/datetime.py | 38 ++- Lib/test/datetimetester.py | 116 ++++++++ .../2017-10-12-22-39-55.bpo-22005.lGP-sc.rst | 3 + Modules/_datetimemodule.c | 247 ++++++++++++------ 5 files changed, 328 insertions(+), 82 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2017-10-12-22-39-55.bpo-22005.lGP-sc.rst diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst index 2b10ee2eb8ee30..52cbb6241bc9b9 100644 --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -235,6 +235,9 @@ process more convenient: *errors* tell pickle how to decode 8-bit string instances pickled by Python 2; these default to 'ASCII' and 'strict', respectively. The *encoding* can be 'bytes' to read these 8-bit string instances as bytes objects. + Using ``encoding='latin1'`` is required for unpickling NumPy arrays and + instances of :class:`~datetime.datetime`, :class:`~datetime.date` and + :class:`~datetime.time` pickled by Python 2. .. function:: loads(bytes_object, \*, fix_imports=True, encoding="ASCII", errors="strict") @@ -252,6 +255,9 @@ process more convenient: *errors* tell pickle how to decode 8-bit string instances pickled by Python 2; these default to 'ASCII' and 'strict', respectively. The *encoding* can be 'bytes' to read these 8-bit string instances as bytes objects. + Using ``encoding='latin1'`` is required for unpickling NumPy arrays and + instances of :class:`~datetime.datetime`, :class:`~datetime.date` and + :class:`~datetime.time` pickled by Python 2. The :mod:`pickle` module defines three exceptions: diff --git a/Lib/datetime.py b/Lib/datetime.py index b8782fc8b363ce..2f3aa48c66e4ca 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -693,9 +693,19 @@ def __new__(cls, year, month=None, day=None): year, month, day (required, base 1) """ - if month is None and isinstance(year, bytes) and len(year) == 4 and \ - 1 <= year[2] <= 12: + if (month is None and + isinstance(year, (bytes, str)) and len(year) == 4 and + 1 <= ord(year[2:3]) <= 12): # Pickle support + if isinstance(year, str): + try: + year = year.encode('latin1') + except UnicodeEncodeError: + # More informative error message. + raise ValueError( + "Failed to encode latin1 string when unpickling " + "a date object. " + "pickle.load(data, encoding='latin1') is assumed.") self = object.__new__(cls) self.__setstate(year) self._hashcode = -1 @@ -1056,8 +1066,18 @@ def __new__(cls, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold tzinfo (default to None) fold (keyword only, default to zero) """ - if isinstance(hour, bytes) and len(hour) == 6 and hour[0]&0x7F < 24: + if (isinstance(hour, (bytes, str)) and len(hour) == 6 and + ord(hour[0:1])&0x7F < 24): # Pickle support + if isinstance(hour, str): + try: + hour = hour.encode('latin1') + except UnicodeEncodeError: + # More informative error message. + raise ValueError( + "Failed to encode latin1 string when unpickling " + "a time object. " + "pickle.load(data, encoding='latin1') is assumed.") self = object.__new__(cls) self.__setstate(hour, minute or None) self._hashcode = -1 @@ -1368,8 +1388,18 @@ class datetime(date): def __new__(cls, year, month=None, day=None, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0): - if isinstance(year, bytes) and len(year) == 10 and 1 <= year[2]&0x7F <= 12: + if (isinstance(year, (bytes, str)) and len(year) == 10 and + 1 <= ord(year[2:3])&0x7F <= 12): # Pickle support + if isinstance(year, str): + try: + year = bytes(year, 'latin1') + except UnicodeEncodeError: + # More informative error message. + raise ValueError( + "Failed to encode latin1 string when unpickling " + "a datetime object. " + "pickle.load(data, encoding='latin1') is assumed.") self = object.__new__(cls) self.__setstate(year, month) self._hashcode = -1 diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 54035ab57f8d55..a11908a058bb15 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -35,6 +35,7 @@ import _strptime # +pickle_loads = {pickle.loads, pickle._loads} pickle_choices = [(pickle, pickle, proto) for proto in range(pickle.HIGHEST_PROTOCOL + 1)] @@ -1404,6 +1405,19 @@ def test_pickling(self): self.assertEqual(orig, derived) self.assertEqual(orig.__reduce__(), orig.__reduce_ex__(2)) + def test_compat_unpickle(self): + tests = [ + b"cdatetime\ndate\n(S'\\x07\\xdf\\x0b\\x1b'\ntR.", + b'cdatetime\ndate\n(U\x04\x07\xdf\x0b\x1btR.', + b'\x80\x02cdatetime\ndate\nU\x04\x07\xdf\x0b\x1b\x85R.', + ] + args = 2015, 11, 27 + expected = self.theclass(*args) + for data in tests: + for loads in pickle_loads: + derived = loads(data, encoding='latin1') + self.assertEqual(derived, expected) + def test_compare(self): t1 = self.theclass(2, 3, 4) t2 = self.theclass(2, 3, 4) @@ -1930,6 +1944,24 @@ def test_pickling_subclass_datetime(self): derived = unpickler.loads(green) self.assertEqual(orig, derived) + def test_compat_unpickle(self): + tests = [ + b'cdatetime\ndatetime\n(' + b"S'\\x07\\xdf\\x0b\\x1b\\x14;\\x01\\x00\\x10\\x00'\ntR.", + + b'cdatetime\ndatetime\n(' + b'U\n\x07\xdf\x0b\x1b\x14;\x01\x00\x10\x00tR.', + + b'\x80\x02cdatetime\ndatetime\n' + b'U\n\x07\xdf\x0b\x1b\x14;\x01\x00\x10\x00\x85R.', + ] + args = 2015, 11, 27, 20, 59, 1, 64**2 + expected = self.theclass(*args) + for data in tests: + for loads in pickle_loads: + derived = loads(data, encoding='latin1') + self.assertEqual(derived, expected) + def test_more_compare(self): # The test_compare() inherited from TestDate covers the error cases. # We just want to test lexicographic ordering on the members datetime @@ -2609,6 +2641,19 @@ def test_pickling_subclass_time(self): derived = unpickler.loads(green) self.assertEqual(orig, derived) + def test_compat_unpickle(self): + tests = [ + b"cdatetime\ntime\n(S'\\x14;\\x10\\x00\\x10\\x00'\ntR.", + b'cdatetime\ntime\n(U\x06\x14;\x10\x00\x10\x00tR.', + b'\x80\x02cdatetime\ntime\nU\x06\x14;\x10\x00\x10\x00\x85R.', + ] + args = 20, 59, 16, 64**2 + expected = self.theclass(*args) + for data in tests: + for loads in pickle_loads: + derived = loads(data, encoding='latin1') + self.assertEqual(derived, expected) + def test_bool(self): # time is always True. cls = self.theclass @@ -2981,6 +3026,40 @@ def test_pickling(self): self.assertEqual(derived.tzname(), 'cookie') self.assertEqual(orig.__reduce__(), orig.__reduce_ex__(2)) + def test_compat_unpickle(self): + tests = [ + b"cdatetime\ntime\n(S'\\x05\\x06\\x07\\x01\\xe2@'\n" + b"ctest.datetimetester\nPicklableFixedOffset\n(tR" + b"(dS'_FixedOffset__offset'\ncdatetime\ntimedelta\n" + b"(I-1\nI68400\nI0\ntRs" + b"S'_FixedOffset__dstoffset'\nNs" + b"S'_FixedOffset__name'\nS'cookie'\nsbtR.", + + b'cdatetime\ntime\n(U\x06\x05\x06\x07\x01\xe2@' + b'ctest.datetimetester\nPicklableFixedOffset\n)R' + b'}(U\x14_FixedOffset__offsetcdatetime\ntimedelta\n' + b'(J\xff\xff\xff\xffJ0\x0b\x01\x00K\x00tR' + b'U\x17_FixedOffset__dstoffsetN' + b'U\x12_FixedOffset__nameU\x06cookieubtR.', + + b'\x80\x02cdatetime\ntime\nU\x06\x05\x06\x07\x01\xe2@' + b'ctest.datetimetester\nPicklableFixedOffset\n)R' + b'}(U\x14_FixedOffset__offsetcdatetime\ntimedelta\n' + b'J\xff\xff\xff\xffJ0\x0b\x01\x00K\x00\x87R' + b'U\x17_FixedOffset__dstoffsetN' + b'U\x12_FixedOffset__nameU\x06cookieub\x86R.', + ] + + tinfo = PicklableFixedOffset(-300, 'cookie') + expected = self.theclass(5, 6, 7, 123456, tzinfo=tinfo) + for data in tests: + for loads in pickle_loads: + derived = loads(data, encoding='latin1') + self.assertEqual(derived, expected, repr(data)) + self.assertIsInstance(derived.tzinfo, PicklableFixedOffset) + self.assertEqual(derived.utcoffset(), timedelta(minutes=-300)) + self.assertEqual(derived.tzname(), 'cookie') + def test_more_bool(self): # time is always True. cls = self.theclass @@ -3198,6 +3277,43 @@ def test_pickling(self): self.assertEqual(derived.tzname(), 'cookie') self.assertEqual(orig.__reduce__(), orig.__reduce_ex__(2)) + def test_compat_unpickle(self): + tests = [ + b'cdatetime\ndatetime\n' + b"(S'\\x07\\xdf\\x0b\\x1b\\x14;\\x01\\x01\\xe2@'\n" + b'ctest.datetimetester\nPicklableFixedOffset\n(tR' + b"(dS'_FixedOffset__offset'\ncdatetime\ntimedelta\n" + b'(I-1\nI68400\nI0\ntRs' + b"S'_FixedOffset__dstoffset'\nNs" + b"S'_FixedOffset__name'\nS'cookie'\nsbtR.", + + b'cdatetime\ndatetime\n' + b'(U\n\x07\xdf\x0b\x1b\x14;\x01\x01\xe2@' + b'ctest.datetimetester\nPicklableFixedOffset\n)R' + b'}(U\x14_FixedOffset__offsetcdatetime\ntimedelta\n' + b'(J\xff\xff\xff\xffJ0\x0b\x01\x00K\x00tR' + b'U\x17_FixedOffset__dstoffsetN' + b'U\x12_FixedOffset__nameU\x06cookieubtR.', + + b'\x80\x02cdatetime\ndatetime\n' + b'U\n\x07\xdf\x0b\x1b\x14;\x01\x01\xe2@' + b'ctest.datetimetester\nPicklableFixedOffset\n)R' + b'}(U\x14_FixedOffset__offsetcdatetime\ntimedelta\n' + b'J\xff\xff\xff\xffJ0\x0b\x01\x00K\x00\x87R' + b'U\x17_FixedOffset__dstoffsetN' + b'U\x12_FixedOffset__nameU\x06cookieub\x86R.', + ] + args = 2015, 11, 27, 20, 59, 1, 123456 + tinfo = PicklableFixedOffset(-300, 'cookie') + expected = self.theclass(*args, **{'tzinfo': tinfo}) + for data in tests: + for loads in pickle_loads: + derived = loads(data, encoding='latin1') + self.assertEqual(derived, expected) + self.assertIsInstance(derived.tzinfo, PicklableFixedOffset) + self.assertEqual(derived.utcoffset(), timedelta(minutes=-300)) + self.assertEqual(derived.tzname(), 'cookie') + def test_extreme_hashes(self): # If an attempt is made to hash these via subtracting the offset # then hashing a datetime object, OverflowError results. The diff --git a/Misc/NEWS.d/next/Library/2017-10-12-22-39-55.bpo-22005.lGP-sc.rst b/Misc/NEWS.d/next/Library/2017-10-12-22-39-55.bpo-22005.lGP-sc.rst new file mode 100644 index 00000000000000..951098d0a7a308 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-10-12-22-39-55.bpo-22005.lGP-sc.rst @@ -0,0 +1,3 @@ +Implemented unpickling instances of :class:`~datetime.datetime`, +:class:`~datetime.date` and :class:`~datetime.time` pickled by Python 2. +``encoding='latin1'`` should be used for successful decoding. diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 2edaf1b319c4e3..397b89886a7809 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -2535,30 +2535,61 @@ static PyGetSetDef date_getset[] = { static char *date_kws[] = {"year", "month", "day", NULL}; +static PyObject * +date_from_pickle(PyTypeObject *type, PyObject *state) +{ + PyDateTime_Date *me; + + me = (PyDateTime_Date *) (type->tp_alloc(type, 0)); + if (me != NULL) { + const char *pdata = PyBytes_AS_STRING(state); + memcpy(me->data, pdata, _PyDateTime_DATE_DATASIZE); + me->hashcode = -1; + } + return (PyObject *)me; +} + static PyObject * date_new(PyTypeObject *type, PyObject *args, PyObject *kw) { PyObject *self = NULL; - PyObject *state; int year; int month; int day; /* Check for invocation from pickle with __getstate__ state */ - if (PyTuple_GET_SIZE(args) == 1 && - PyBytes_Check(state = PyTuple_GET_ITEM(args, 0)) && - PyBytes_GET_SIZE(state) == _PyDateTime_DATE_DATASIZE && - MONTH_IS_SANE(PyBytes_AS_STRING(state)[2])) - { - PyDateTime_Date *me; - - me = (PyDateTime_Date *) (type->tp_alloc(type, 0)); - if (me != NULL) { - char *pdata = PyBytes_AS_STRING(state); - memcpy(me->data, pdata, _PyDateTime_DATE_DATASIZE); - me->hashcode = -1; + if (PyTuple_GET_SIZE(args) == 1) { + PyObject *state = PyTuple_GET_ITEM(args, 0); + if (PyBytes_Check(state)) { + if (PyBytes_GET_SIZE(state) == _PyDateTime_DATE_DATASIZE && + MONTH_IS_SANE(PyBytes_AS_STRING(state)[2])) + { + return date_from_pickle(type, state); + } + } + else if (PyUnicode_Check(state)) { + if (PyUnicode_READY(state)) { + return NULL; + } + if (PyUnicode_GET_LENGTH(state) == _PyDateTime_DATE_DATASIZE && + MONTH_IS_SANE(PyUnicode_READ_CHAR(state, 2))) + { + state = PyUnicode_AsLatin1String(state); + if (state == NULL) { + if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError)) { + /* More informative error message. */ + PyErr_SetString(PyExc_ValueError, + "Failed to encode latin1 string when unpickling " + "a date object. " + "pickle.load(data, encoding='latin1') is assumed."); + } + return NULL; + } + self = date_from_pickle(type, state); + Py_DECREF(state); + return self; + } } - return (PyObject *)me; } if (PyArg_ParseTupleAndKeywords(args, kw, "iii", date_kws, @@ -3591,11 +3622,43 @@ static PyGetSetDef time_getset[] = { static char *time_kws[] = {"hour", "minute", "second", "microsecond", "tzinfo", "fold", NULL}; +static PyObject * +time_from_pickle(PyTypeObject *type, PyObject *state, PyObject *tzinfo) +{ + PyDateTime_Time *me; + char aware = (char)(tzinfo != Py_None); + + if (aware && check_tzinfo_subclass(tzinfo) < 0) { + PyErr_SetString(PyExc_TypeError, "bad tzinfo state arg"); + return NULL; + } + + me = (PyDateTime_Time *) (type->tp_alloc(type, aware)); + if (me != NULL) { + const char *pdata = PyBytes_AS_STRING(state); + + memcpy(me->data, pdata, _PyDateTime_TIME_DATASIZE); + me->hashcode = -1; + me->hastzinfo = aware; + if (aware) { + Py_INCREF(tzinfo); + me->tzinfo = tzinfo; + } + if (pdata[0] & (1 << 7)) { + me->data[0] -= 128; + me->fold = 1; + } + else { + me->fold = 0; + } + } + return (PyObject *)me; +} + static PyObject * time_new(PyTypeObject *type, PyObject *args, PyObject *kw) { PyObject *self = NULL; - PyObject *state; int hour = 0; int minute = 0; int second = 0; @@ -3604,44 +3667,42 @@ time_new(PyTypeObject *type, PyObject *args, PyObject *kw) int fold = 0; /* Check for invocation from pickle with __getstate__ state */ - if (PyTuple_GET_SIZE(args) >= 1 && - PyTuple_GET_SIZE(args) <= 2 && - PyBytes_Check(state = PyTuple_GET_ITEM(args, 0)) && - PyBytes_GET_SIZE(state) == _PyDateTime_TIME_DATASIZE && - (0x7F & ((unsigned char) (PyBytes_AS_STRING(state)[0]))) < 24) - { - PyDateTime_Time *me; - char aware; - + if (PyTuple_GET_SIZE(args) >= 1 && PyTuple_GET_SIZE(args) <= 2) { + PyObject *state = PyTuple_GET_ITEM(args, 0); if (PyTuple_GET_SIZE(args) == 2) { tzinfo = PyTuple_GET_ITEM(args, 1); - if (check_tzinfo_subclass(tzinfo) < 0) { - PyErr_SetString(PyExc_TypeError, "bad " - "tzinfo state arg"); - return NULL; - } } - aware = (char)(tzinfo != Py_None); - me = (PyDateTime_Time *) (type->tp_alloc(type, aware)); - if (me != NULL) { - char *pdata = PyBytes_AS_STRING(state); - - memcpy(me->data, pdata, _PyDateTime_TIME_DATASIZE); - me->hashcode = -1; - me->hastzinfo = aware; - if (aware) { - Py_INCREF(tzinfo); - me->tzinfo = tzinfo; + if (PyBytes_Check(state)) { + if (PyBytes_GET_SIZE(state) == _PyDateTime_TIME_DATASIZE && + (0x7F & ((unsigned char) (PyBytes_AS_STRING(state)[0]))) < 24) + { + return time_from_pickle(type, state, tzinfo); } - if (pdata[0] & (1 << 7)) { - me->data[0] -= 128; - me->fold = 1; + } + else if (PyUnicode_Check(state)) { + if (PyUnicode_READY(state)) { + return NULL; } - else { - me->fold = 0; + if (PyUnicode_GET_LENGTH(state) == _PyDateTime_TIME_DATASIZE && + (0x7F & PyUnicode_READ_CHAR(state, 2)) < 24) + { + state = PyUnicode_AsLatin1String(state); + if (state == NULL) { + if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError)) { + /* More informative error message. */ + PyErr_SetString(PyExc_ValueError, + "Failed to encode latin1 string when unpickling " + "a time object. " + "pickle.load(data, encoding='latin1') is assumed."); + } + return NULL; + } + self = time_from_pickle(type, state, tzinfo); + Py_DECREF(state); + return self; } } - return (PyObject *)me; + tzinfo = Py_None; } if (PyArg_ParseTupleAndKeywords(args, kw, "|iiiiO$i", time_kws, @@ -4174,11 +4235,43 @@ static char *datetime_kws[] = { "microsecond", "tzinfo", "fold", NULL }; +static PyObject * +datetime_from_pickle(PyTypeObject *type, PyObject *state, PyObject *tzinfo) +{ + PyDateTime_DateTime *me; + char aware = (char)(tzinfo != Py_None); + + if (aware && check_tzinfo_subclass(tzinfo) < 0) { + PyErr_SetString(PyExc_TypeError, "bad tzinfo state arg"); + return NULL; + } + + me = (PyDateTime_DateTime *) (type->tp_alloc(type , aware)); + if (me != NULL) { + const char *pdata = PyBytes_AS_STRING(state); + + memcpy(me->data, pdata, _PyDateTime_DATETIME_DATASIZE); + me->hashcode = -1; + me->hastzinfo = aware; + if (aware) { + Py_INCREF(tzinfo); + me->tzinfo = tzinfo; + } + if (pdata[2] & (1 << 7)) { + me->data[2] -= 128; + me->fold = 1; + } + else { + me->fold = 0; + } + } + return (PyObject *)me; +} + static PyObject * datetime_new(PyTypeObject *type, PyObject *args, PyObject *kw) { PyObject *self = NULL; - PyObject *state; int year; int month; int day; @@ -4190,44 +4283,42 @@ datetime_new(PyTypeObject *type, PyObject *args, PyObject *kw) PyObject *tzinfo = Py_None; /* Check for invocation from pickle with __getstate__ state */ - if (PyTuple_GET_SIZE(args) >= 1 && - PyTuple_GET_SIZE(args) <= 2 && - PyBytes_Check(state = PyTuple_GET_ITEM(args, 0)) && - PyBytes_GET_SIZE(state) == _PyDateTime_DATETIME_DATASIZE && - MONTH_IS_SANE(PyBytes_AS_STRING(state)[2] & 0x7F)) - { - PyDateTime_DateTime *me; - char aware; - + if (PyTuple_GET_SIZE(args) >= 1 && PyTuple_GET_SIZE(args) <= 2) { + PyObject *state = PyTuple_GET_ITEM(args, 0); if (PyTuple_GET_SIZE(args) == 2) { tzinfo = PyTuple_GET_ITEM(args, 1); - if (check_tzinfo_subclass(tzinfo) < 0) { - PyErr_SetString(PyExc_TypeError, "bad " - "tzinfo state arg"); - return NULL; - } } - aware = (char)(tzinfo != Py_None); - me = (PyDateTime_DateTime *) (type->tp_alloc(type , aware)); - if (me != NULL) { - char *pdata = PyBytes_AS_STRING(state); - - memcpy(me->data, pdata, _PyDateTime_DATETIME_DATASIZE); - me->hashcode = -1; - me->hastzinfo = aware; - if (aware) { - Py_INCREF(tzinfo); - me->tzinfo = tzinfo; + if (PyBytes_Check(state)) { + if (PyBytes_GET_SIZE(state) == _PyDateTime_DATETIME_DATASIZE && + MONTH_IS_SANE(PyBytes_AS_STRING(state)[2] & 0x7F)) + { + return datetime_from_pickle(type, state, tzinfo); } - if (pdata[2] & (1 << 7)) { - me->data[2] -= 128; - me->fold = 1; + } + else if (PyUnicode_Check(state)) { + if (PyUnicode_READY(state)) { + return NULL; } - else { - me->fold = 0; + if (PyUnicode_GET_LENGTH(state) == _PyDateTime_DATETIME_DATASIZE && + MONTH_IS_SANE(PyUnicode_READ_CHAR(state, 2) & 0x7F)) + { + state = PyUnicode_AsLatin1String(state); + if (state == NULL) { + if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError)) { + /* More informative error message. */ + PyErr_SetString(PyExc_ValueError, + "Failed to encode latin1 string when unpickling " + "a datetime object. " + "pickle.load(data, encoding='latin1') is assumed."); + } + return NULL; + } + self = datetime_from_pickle(type, state, tzinfo); + Py_DECREF(state); + return self; } } - return (PyObject *)me; + tzinfo = Py_None; } if (PyArg_ParseTupleAndKeywords(args, kw, "iii|iiiiO$i", datetime_kws, From 2d6bc25dbc3dc5662f13917eb759f92842bf6de6 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 7 Dec 2018 18:09:23 +0200 Subject: [PATCH 2073/2287] bpo-35436: Add missing PyErr_NoMemory() calls and other minor bug fixes. (GH-11015) (GH-11020) (GH-11026) (cherry picked from commit 4c49da0cb7434c676d70b9ccf38aca82ac0d64a9) (cherry picked from commit 602d307ac5e8a2da38a193dca3bdfef5994dfe67) Co-authored-by: Zackery Spytz --- .../2018-12-07-02-38-01.bpo-35436.0VW7p9.rst | 2 + Modules/_ctypes/_ctypes.c | 12 +++++- Modules/_ctypes/callbacks.c | 7 ++- Modules/_io/winconsoleio.c | 6 ++- Modules/_multiprocessing/semaphore.c | 9 ++-- Modules/_ssl.c | 13 ++++++ Modules/posixmodule.c | 6 +-- Objects/capsule.c | 2 +- PC/getpathp.c | 12 +++++- Parser/myreadline.c | 43 ++++++++++++++++--- Parser/tokenizer.c | 5 +++ Python/ast.c | 7 ++- Python/marshal.c | 5 ++- Python/pystrtod.c | 7 ++- 14 files changed, 107 insertions(+), 29 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-12-07-02-38-01.bpo-35436.0VW7p9.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-07-02-38-01.bpo-35436.0VW7p9.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-07-02-38-01.bpo-35436.0VW7p9.rst new file mode 100644 index 00000000000000..542fe93a00eb17 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-12-07-02-38-01.bpo-35436.0VW7p9.rst @@ -0,0 +1,2 @@ +Fix various issues with memory allocation error handling. Patch by Zackery +Spytz. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index c5b499c7aac20c..24d64858edc7af 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -306,8 +306,10 @@ _ctypes_alloc_format_string_for_type(char code, int big_endian) } result = PyMem_Malloc(3); - if (result == NULL) + if (result == NULL) { + PyErr_NoMemory(); return NULL; + } result[0] = big_endian ? '>' : '<'; result[1] = pep_code; @@ -367,8 +369,10 @@ _ctypes_alloc_format_string_with_shape(int ndim, const Py_ssize_t *shape, if (prefix) prefix_len += strlen(prefix); new_prefix = PyMem_Malloc(prefix_len); - if (new_prefix == NULL) + if (new_prefix == NULL) { + PyErr_NoMemory(); return NULL; + } new_prefix[0] = '\0'; if (prefix) strcpy(new_prefix, prefix); @@ -1856,6 +1860,10 @@ static PyObject *CreateSwappedType(PyTypeObject *type, PyObject *args, PyObject #else suffix = PyUnicode_InternFromString("_be"); #endif + if (suffix == NULL) { + Py_DECREF(swapped_args); + return NULL; + } newname = PyUnicode_Concat(name, suffix); if (newname == NULL) { diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c index b958f304c5401c..c8773a12e1a8ef 100644 --- a/Modules/_ctypes/callbacks.c +++ b/Modules/_ctypes/callbacks.c @@ -309,7 +309,6 @@ static CThunkObject* CThunkObject_new(Py_ssize_t nArgs) p = PyObject_GC_NewVar(CThunkObject, &PyCThunk_Type, nArgs); if (p == NULL) { - PyErr_NoMemory(); return NULL; } @@ -347,7 +346,7 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable, assert(CThunk_CheckExact((PyObject *)p)); p->pcl_write = ffi_closure_alloc(sizeof(ffi_closure), - &p->pcl_exec); + &p->pcl_exec); if (p->pcl_write == NULL) { PyErr_NoMemory(); goto error; @@ -397,8 +396,8 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable, result = ffi_prep_closure(p->pcl_write, &p->cif, closure_fcn, p); #else result = ffi_prep_closure_loc(p->pcl_write, &p->cif, closure_fcn, - p, - p->pcl_exec); + p, + p->pcl_exec); #endif if (result != FFI_OK) { PyErr_Format(PyExc_RuntimeError, diff --git a/Modules/_io/winconsoleio.c b/Modules/_io/winconsoleio.c index 979bcfc49b9b36..2f36806ef6933b 100644 --- a/Modules/_io/winconsoleio.c +++ b/Modules/_io/winconsoleio.c @@ -832,11 +832,13 @@ _io__WindowsConsoleIO_readall_impl(winconsoleio *self) } bufsize = newsize; - buf = PyMem_Realloc(buf, (bufsize + 1) * sizeof(wchar_t)); - if (!buf) { + wchar_t *tmp = PyMem_Realloc(buf, + (bufsize + 1) * sizeof(wchar_t)); + if (tmp == NULL) { PyMem_Free(buf); return NULL; } + buf = tmp; } subbuf = read_console_w(self->handle, bufsize - len, &n); diff --git a/Modules/_multiprocessing/semaphore.c b/Modules/_multiprocessing/semaphore.c index cea962ab26c3f1..4ff454f987b08e 100644 --- a/Modules/_multiprocessing/semaphore.c +++ b/Modules/_multiprocessing/semaphore.c @@ -439,8 +439,9 @@ semlock_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (!unlink) { name_copy = PyMem_Malloc(strlen(name) + 1); - if (name_copy == NULL) - goto failure; + if (name_copy == NULL) { + return PyErr_NoMemory(); + } strcpy(name_copy, name); } @@ -463,7 +464,9 @@ semlock_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (handle != SEM_FAILED) SEM_CLOSE(handle); PyMem_Free(name_copy); - _PyMp_SetError(NULL, MP_STANDARD_ERROR); + if (!PyErr_Occurred()) { + _PyMp_SetError(NULL, MP_STANDARD_ERROR); + } return NULL; } diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 2b043da280b8a3..a188d6a7291af5 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -685,6 +685,11 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock, PySSL_BEGIN_ALLOW_THREADS self->ssl = SSL_new(ctx); PySSL_END_ALLOW_THREADS + if (self->ssl == NULL) { + Py_DECREF(self); + _setSSLError(NULL, 0, __FILE__, __LINE__); + return NULL; + } SSL_set_app_data(self->ssl, self); if (sock) { SSL_set_fd(self->ssl, Py_SAFE_DOWNCAST(sock->sock_fd, SOCKET_T, int)); @@ -1040,6 +1045,10 @@ _get_peer_alt_names (X509 *certificate) { /* get a memory buffer */ biobuf = BIO_new(BIO_s_mem()); + if (biobuf == NULL) { + PyErr_SetString(PySSLErrorObject, "failed to allocate BIO"); + return NULL; + } i = -1; while ((i = X509_get_ext_by_NID( @@ -1415,6 +1424,10 @@ _decode_certificate(X509 *certificate) { /* get a memory buffer */ biobuf = BIO_new(BIO_s_mem()); + if (biobuf == NULL) { + PyErr_SetString(PySSLErrorObject, "failed to allocate BIO"); + goto fail0; + } (void) BIO_reset(biobuf); serialNumber = X509_get_serialNumber(certificate); diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 03825c3228ca64..776a3d249a810d 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -6127,8 +6127,7 @@ os_getgroups_impl(PyObject *module) } else { alt_grouplist = PyMem_New(gid_t, n); if (alt_grouplist == NULL) { - errno = EINVAL; - return posix_error(); + return PyErr_NoMemory(); } } @@ -6153,8 +6152,7 @@ os_getgroups_impl(PyObject *module) } else { alt_grouplist = PyMem_New(gid_t, n); if (alt_grouplist == NULL) { - errno = EINVAL; - return posix_error(); + return PyErr_NoMemory(); } n = getgroups(n, alt_grouplist); if (n == -1) { diff --git a/Objects/capsule.c b/Objects/capsule.c index acd3de637dd52e..4e15b440b170be 100644 --- a/Objects/capsule.c +++ b/Objects/capsule.c @@ -201,7 +201,7 @@ PyCapsule_Import(const char *name, int no_block) char *name_dup = (char *)PyMem_MALLOC(name_length); if (!name_dup) { - return NULL; + return PyErr_NoMemory(); } memcpy(name_dup, name, name_length); diff --git a/PC/getpathp.c b/PC/getpathp.c index af4af766a70f82..880ea7b966e5cd 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -586,6 +586,9 @@ read_pth_file(const wchar_t *path, wchar_t *prefix, int *isolated, int *nosite) size_t prefixlen = wcslen(prefix); wchar_t *buf = (wchar_t*)PyMem_RawMalloc(bufsiz * sizeof(wchar_t)); + if (buf == NULL) { + goto error; + } buf[0] = '\0'; while (!feof(sp_file)) { @@ -611,17 +614,22 @@ read_pth_file(const wchar_t *path, wchar_t *prefix, int *isolated, int *nosite) DWORD wn = MultiByteToWideChar(CP_UTF8, 0, line, -1, NULL, 0); wchar_t *wline = (wchar_t*)PyMem_RawMalloc((wn + 1) * sizeof(wchar_t)); + if (wline == NULL) { + goto error; + } wn = MultiByteToWideChar(CP_UTF8, 0, line, -1, wline, wn + 1); wline[wn] = '\0'; size_t usedsiz = wcslen(buf); while (usedsiz + wn + prefixlen + 4 > bufsiz) { bufsiz += MAXPATHLEN; - buf = (wchar_t*)PyMem_RawRealloc(buf, (bufsiz + 1) * sizeof(wchar_t)); - if (!buf) { + wchar_t *tmp = (wchar_t*)PyMem_RawRealloc(buf, (bufsiz + 1) * + sizeof(wchar_t)); + if (tmp == NULL) { PyMem_RawFree(wline); goto error; } + buf = tmp; } if (usedsiz) { diff --git a/Parser/myreadline.c b/Parser/myreadline.c index 476af717451bee..34a6f8bf5d248a 100644 --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -162,20 +162,37 @@ _PyOS_WindowsConsoleReadline(HANDLE hStdIn) wbuf = (wchar_t*)PyMem_RawMalloc(wbuflen * sizeof(wchar_t)); if (wbuf) wcscpy_s(wbuf, wbuflen, wbuf_local); + else { + PyErr_NoMemory(); + goto exit; + } + } + else { + wchar_t *tmp = PyMem_RawRealloc(wbuf, wbuflen * sizeof(wchar_t)); + if (tmp == NULL) { + PyErr_NoMemory(); + goto exit; + } + wbuf = tmp; } - else - wbuf = (wchar_t*)PyMem_RawRealloc(wbuf, wbuflen * sizeof(wchar_t)); } if (wbuf[0] == '\x1a') { buf = PyMem_RawMalloc(1); if (buf) buf[0] = '\0'; + else { + PyErr_NoMemory(); + } goto exit; } u8len = WideCharToMultiByte(CP_UTF8, 0, wbuf, total_read, NULL, 0, NULL, NULL); buf = PyMem_RawMalloc(u8len + 1); + if (buf == NULL) { + PyErr_NoMemory(); + goto exit; + } u8len = WideCharToMultiByte(CP_UTF8, 0, wbuf, total_read, buf, u8len, NULL, NULL); buf[u8len] = '\0'; @@ -224,8 +241,12 @@ PyOS_StdioReadline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) int wlen; wlen = MultiByteToWideChar(CP_UTF8, 0, prompt, -1, NULL, 0); - if (wlen && - (wbuf = PyMem_RawMalloc(wlen * sizeof(wchar_t)))) { + if (wlen) { + wbuf = PyMem_RawMalloc(wlen * sizeof(wchar_t)); + if (wbuf == NULL) { + PyErr_NoMemory(); + return NULL; + } wlen = MultiByteToWideChar(CP_UTF8, 0, prompt, -1, wbuf, wlen); if (wlen) { @@ -249,8 +270,10 @@ PyOS_StdioReadline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) n = 100; p = (char *)PyMem_RawMalloc(n); - if (p == NULL) + if (p == NULL) { + PyErr_NoMemory(); return NULL; + } fflush(sys_stdout); if (prompt) @@ -328,6 +351,10 @@ PyOS_Readline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) #ifdef WITH_THREAD if (_PyOS_ReadlineLock == NULL) { _PyOS_ReadlineLock = PyThread_allocate_lock(); + if (_PyOS_ReadlineLock == NULL) { + PyErr_SetString(PyExc_MemoryError, "can't allocate lock"); + return NULL; + } } #endif @@ -360,8 +387,12 @@ PyOS_Readline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) len = strlen(rv) + 1; res = PyMem_Malloc(len); - if (res != NULL) + if (res != NULL) { memcpy(res, rv, len); + } + else { + PyErr_NoMemory(); + } PyMem_RawFree(rv); return res; diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index ab72f6145f2879..0d3ad4dd7ae088 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -956,6 +956,11 @@ tok_nextc(struct tok_state *tok) buflen = PyBytes_GET_SIZE(u); buf = PyBytes_AS_STRING(u); newtok = PyMem_MALLOC(buflen+1); + if (newtok == NULL) { + Py_DECREF(u); + tok->done = E_NOMEM; + return EOF; + } strcpy(newtok, buf); Py_DECREF(u); } diff --git a/Python/ast.c b/Python/ast.c index 51175cdb55e6a2..675063eff06883 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -4104,6 +4104,9 @@ parsenumber(struct compiling *c, const char *s) } /* Create a duplicate without underscores. */ dup = PyMem_Malloc(strlen(s) + 1); + if (dup == NULL) { + return PyErr_NoMemory(); + } end = dup; for (; *s; s++) { if (*s != '_') { @@ -4338,8 +4341,10 @@ fstring_compile_expr(const char *expr_start, const char *expr_end, len = expr_end - expr_start; /* Allocate 3 extra bytes: open paren, close paren, null byte. */ str = PyMem_RawMalloc(len + 3); - if (str == NULL) + if (str == NULL) { + PyErr_NoMemory(); return NULL; + } str[0] = '('; memcpy(str+1, expr_start, len); diff --git a/Python/marshal.c b/Python/marshal.c index 91a57c293b09b6..dbe75e3ba2910e 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -677,11 +677,12 @@ r_string(Py_ssize_t n, RFILE *p) p->buf_size = n; } else if (p->buf_size < n) { - p->buf = PyMem_REALLOC(p->buf, n); - if (p->buf == NULL) { + char *tmp = PyMem_REALLOC(p->buf, n); + if (tmp == NULL) { PyErr_NoMemory(); return NULL; } + p->buf = tmp; p->buf_size = n; } diff --git a/Python/pystrtod.c b/Python/pystrtod.c index 1c635602340a85..509048ccf55c2d 100644 --- a/Python/pystrtod.c +++ b/Python/pystrtod.c @@ -398,6 +398,9 @@ _Py_string_to_number_with_underscores( } dup = PyMem_Malloc(orig_len + 1); + if (dup == NULL) { + return PyErr_NoMemory(); + } end = dup; prev = '\0'; last = s + orig_len; @@ -433,8 +436,8 @@ _Py_string_to_number_with_underscores( error: PyMem_Free(dup); PyErr_Format(PyExc_ValueError, - "could not convert string to %s: " - "%R", what, obj); + "could not convert string to %s: " + "%R", what, obj); return NULL; } From 12b9fb603eea9298c835bae5b8742db4fa52892e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 8 Dec 2018 03:41:52 -0800 Subject: [PATCH 2074/2287] bpo-35330: Don't call the wrapped object if `side_effect` is set (GH11034) * tests: Further validate `wraps` functionality in `unittest.mock.Mock` Add more tests to validate how `wraps` interacts with other features of mocks. * Don't call the wrapped object if `side_effect` is set When a object is wrapped using `Mock(wraps=...)`, if an user sets a `side_effect` in one of their methods, return the value of `side_effect` and don't call the original object. * Refactor what to be called on `mock_call` When a `Mock` is called, it should return looking up in the following order: `side_effect`, `return_value`, `wraps`. If any of the first two return `mock.DEFAULT`, lookup in the next option. It makes no sense to check for `wraps` returning default, as it is supposed to be the original implementation and there is nothing to fallback to. (cherry picked from commit f05df0a4b679d0acfd0b1fe6187ba2d553b37afa) Co-authored-by: Mario Corchero --- Lib/unittest/mock.py | 21 ++- Lib/unittest/test/testmock/testmock.py | 122 ++++++++++++++++++ .../2018-12-06-00-43-13.bpo-35330.abB4BN.rst | 4 + 3 files changed, 136 insertions(+), 11 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-12-06-00-43-13.bpo-35330.abB4BN.rst diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 707ef0b734d8ce..645d100960ef51 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -993,28 +993,27 @@ def _mock_call(_mock_self, *args, **kwargs): break seen.add(_new_parent_id) - ret_val = DEFAULT effect = self.side_effect if effect is not None: if _is_exception(effect): raise effect - - if not _callable(effect): + elif not _callable(effect): result = next(effect) if _is_exception(result): raise result - if result is DEFAULT: - result = self.return_value + else: + result = effect(*args, **kwargs) + + if result is not DEFAULT: return result - ret_val = effect(*args, **kwargs) + if self._mock_return_value is not DEFAULT: + return self.return_value - if (self._mock_wraps is not None and - self._mock_return_value is DEFAULT): + if self._mock_wraps is not None: return self._mock_wraps(*args, **kwargs) - if ret_val is DEFAULT: - ret_val = self.return_value - return ret_val + + return self.return_value diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 14b1ecc84b336a..5e873569e26e3d 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -549,6 +549,16 @@ def test_wraps_calls(self): real.assert_called_with(1, 2, fish=3) + def test_wraps_prevents_automatic_creation_of_mocks(self): + class Real(object): + pass + + real = Real() + mock = Mock(wraps=real) + + self.assertRaises(AttributeError, lambda: mock.new_attr()) + + def test_wraps_call_with_nondefault_return_value(self): real = Mock() @@ -575,6 +585,118 @@ class Real(object): self.assertEqual(result, Real.attribute.frog()) + def test_customize_wrapped_object_with_side_effect_iterable_with_default(self): + class Real(object): + def method(self): + return sentinel.ORIGINAL_VALUE + + real = Real() + mock = Mock(wraps=real) + mock.method.side_effect = [sentinel.VALUE1, DEFAULT] + + self.assertEqual(mock.method(), sentinel.VALUE1) + self.assertEqual(mock.method(), sentinel.ORIGINAL_VALUE) + self.assertRaises(StopIteration, mock.method) + + + def test_customize_wrapped_object_with_side_effect_iterable(self): + class Real(object): + def method(self): + raise NotImplementedError() + + real = Real() + mock = Mock(wraps=real) + mock.method.side_effect = [sentinel.VALUE1, sentinel.VALUE2] + + self.assertEqual(mock.method(), sentinel.VALUE1) + self.assertEqual(mock.method(), sentinel.VALUE2) + self.assertRaises(StopIteration, mock.method) + + + def test_customize_wrapped_object_with_side_effect_exception(self): + class Real(object): + def method(self): + raise NotImplementedError() + + real = Real() + mock = Mock(wraps=real) + mock.method.side_effect = RuntimeError + + self.assertRaises(RuntimeError, mock.method) + + + def test_customize_wrapped_object_with_side_effect_function(self): + class Real(object): + def method(self): + raise NotImplementedError() + + def side_effect(): + return sentinel.VALUE + + real = Real() + mock = Mock(wraps=real) + mock.method.side_effect = side_effect + + self.assertEqual(mock.method(), sentinel.VALUE) + + + def test_customize_wrapped_object_with_return_value(self): + class Real(object): + def method(self): + raise NotImplementedError() + + real = Real() + mock = Mock(wraps=real) + mock.method.return_value = sentinel.VALUE + + self.assertEqual(mock.method(), sentinel.VALUE) + + + def test_customize_wrapped_object_with_return_value_and_side_effect(self): + # side_effect should always take precedence over return_value. + class Real(object): + def method(self): + raise NotImplementedError() + + real = Real() + mock = Mock(wraps=real) + mock.method.side_effect = [sentinel.VALUE1, sentinel.VALUE2] + mock.method.return_value = sentinel.WRONG_VALUE + + self.assertEqual(mock.method(), sentinel.VALUE1) + self.assertEqual(mock.method(), sentinel.VALUE2) + self.assertRaises(StopIteration, mock.method) + + + def test_customize_wrapped_object_with_return_value_and_side_effect2(self): + # side_effect can return DEFAULT to default to return_value + class Real(object): + def method(self): + raise NotImplementedError() + + real = Real() + mock = Mock(wraps=real) + mock.method.side_effect = lambda: DEFAULT + mock.method.return_value = sentinel.VALUE + + self.assertEqual(mock.method(), sentinel.VALUE) + + + def test_customize_wrapped_object_with_return_value_and_side_effect_default(self): + class Real(object): + def method(self): + raise NotImplementedError() + + real = Real() + mock = Mock(wraps=real) + mock.method.side_effect = [sentinel.VALUE1, DEFAULT] + mock.method.return_value = sentinel.RETURN + + self.assertEqual(mock.method(), sentinel.VALUE1) + self.assertEqual(mock.method(), sentinel.RETURN) + self.assertRaises(StopIteration, mock.method) + + def test_exceptional_side_effect(self): mock = Mock(side_effect=AttributeError) self.assertRaises(AttributeError, mock) diff --git a/Misc/NEWS.d/next/Library/2018-12-06-00-43-13.bpo-35330.abB4BN.rst b/Misc/NEWS.d/next/Library/2018-12-06-00-43-13.bpo-35330.abB4BN.rst new file mode 100644 index 00000000000000..24d0ab84fb16a2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-12-06-00-43-13.bpo-35330.abB4BN.rst @@ -0,0 +1,4 @@ +When a :class:`Mock` instance was used to wrap an object, if `side_effect` +is used in one of the mocks of it methods, don't call the original +implementation and return the result of using the side effect the same way +that it is done with return_value. From 25555e0fbed15f809a247c7e16ab9d0a0088f806 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 8 Dec 2018 06:39:37 -0800 Subject: [PATCH 2075/2287] bpo-35441: Remove dead and buggy code related to PyList_SetItem(). (GH-11033) In _localemodule.c and selectmodule.c, remove dead code that would cause double decrefs if run. In addition, replace PyList_SetItem() with PyList_SET_ITEM() in cases where a new list is populated and there is no possibility of an error. In addition, check if the list changed size in the loop in array_array_fromlist(). (cherry picked from commit 99d56b53560b3867844472ae381fb3f858760621) Co-authored-by: Zackery Spytz --- Modules/_localemodule.c | 15 ++++----------- Modules/arraymodule.c | 11 ++++++++--- Modules/readline.c | 3 +-- Modules/selectmodule.c | 10 ++-------- PC/winreg.c | 10 +++++++--- Python/ceval.c | 4 ++-- Python/sysmodule.c | 2 +- 7 files changed, 25 insertions(+), 30 deletions(-) diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index f3421af65f3d1f..eba8289c301b42 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -70,20 +70,13 @@ copy_grouping(const char* s) do { i++; val = PyLong_FromLong(s[i]); - if (!val) - break; - if (PyList_SetItem(result, i, val)) { - Py_DECREF(val); - val = NULL; - break; + if (val == NULL) { + Py_DECREF(result); + return NULL; } + PyList_SET_ITEM(result, i, val); } while (s[i] != '\0' && s[i] != CHAR_MAX); - if (!val) { - Py_DECREF(result); - return NULL; - } - return result; } diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index 9254af59a6a2d6..bc3f62def3ccfa 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -1499,12 +1499,18 @@ array_array_fromlist(arrayobject *self, PyObject *list) if (array_resize(self, old_size + n) == -1) return NULL; for (i = 0; i < n; i++) { - PyObject *v = PyList_GetItem(list, i); + PyObject *v = PyList_GET_ITEM(list, i); if ((*self->ob_descr->setitem)(self, Py_SIZE(self) - n + i, v) != 0) { array_resize(self, old_size); return NULL; } + if (n != PyList_GET_SIZE(list)) { + PyErr_SetString(PyExc_RuntimeError, + "list changed size during iteration"); + array_resize(self, old_size); + return NULL; + } } } Py_INCREF(Py_None); @@ -1530,8 +1536,7 @@ array_array_tolist_impl(arrayobject *self) PyObject *v = getarrayitem((PyObject *)self, i); if (v == NULL) goto error; - if (PyList_SetItem(list, i, v) < 0) - goto error; + PyList_SET_ITEM(list, i, v); } return list; diff --git a/Modules/readline.c b/Modules/readline.c index 575479cff249be..096571548c5318 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -947,8 +947,7 @@ on_completion_display_matches_hook(char **matches, s = decode(matches[i+1]); if (s == NULL) goto error; - if (PyList_SetItem(m, i, s) == -1) - goto error; + PyList_SET_ITEM(m, i, s); } sub = decode(matches[0]); r = PyObject_CallFunction(readlinestate_global->completion_display_matches_hook, diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 4b9965724915d7..2bc7b9ff79e58c 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -655,10 +655,7 @@ poll_poll(pollObject *self, PyObject *args) goto error; } PyTuple_SET_ITEM(value, 1, num); - if ((PyList_SetItem(result_list, j, value)) == -1) { - Py_DECREF(value); - goto error; - } + PyList_SET_ITEM(result_list, j, value); i++; } return result_list; @@ -984,10 +981,7 @@ devpoll_poll(devpollObject *self, PyObject *args) Py_DECREF(num2); if (value == NULL) goto error; - if ((PyList_SetItem(result_list, i, value)) == -1) { - Py_DECREF(value); - goto error; - } + PyList_SET_ITEM(result_list, i, value); } return result_list; diff --git a/PC/winreg.c b/PC/winreg.c index 5efdc5e0efec6c..3fde04d746b53c 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -757,9 +757,13 @@ Reg2Py(BYTE *retDataBuf, DWORD retDataSize, DWORD typ) PyMem_Free(str); return NULL; } - PyList_SetItem(obData, - index, - PyUnicode_FromWideChar(str[index], len)); + PyObject *uni = PyUnicode_FromWideChar(str[index], len); + if (uni == NULL) { + Py_DECREF(obData); + PyMem_Free(str); + return NULL; + } + PyList_SET_ITEM(obData, index, uni); } PyMem_Free(str); diff --git a/Python/ceval.c b/Python/ceval.c index 50834f82c74607..38d1d73845fbda 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5500,7 +5500,7 @@ getarray(long a[256]) Py_DECREF(l); return NULL; } - PyList_SetItem(l, i, x); + PyList_SET_ITEM(l, i, x); } for (i = 0; i < 256; i++) a[i] = 0; @@ -5522,7 +5522,7 @@ _Py_GetDXProfile(PyObject *self, PyObject *args) Py_DECREF(l); return NULL; } - PyList_SetItem(l, i, x); + PyList_SET_ITEM(l, i, x); } return l; #endif diff --git a/Python/sysmodule.c b/Python/sysmodule.c index b09268b0e53854..7d1493cbe145cd 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2109,7 +2109,7 @@ makepathobject(const wchar_t *path, wchar_t delim) Py_DECREF(v); return NULL; } - PyList_SetItem(v, i, w); + PyList_SET_ITEM(v, i, w); if (*p == '\0') break; path = p+1; From 23a98abd4256f931ed89b65ec6babd4f06dbff97 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 8 Dec 2018 21:34:30 -0800 Subject: [PATCH 2076/2287] [3.7] Doc: Bump sphinx. (GH-10676) (GH-10803) (cherry picked from commit 2db96ae7444880d66d4ef65abab8a5e6ff328711) Co-authored-by: Julien Palard --- .azure-pipelines/docs-steps.yml | 2 +- .travis.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.azure-pipelines/docs-steps.yml b/.azure-pipelines/docs-steps.yml index c0404aebdcc5c7..492e4e34bb2dab 100644 --- a/.azure-pipelines/docs-steps.yml +++ b/.azure-pipelines/docs-steps.yml @@ -12,7 +12,7 @@ steps: inputs: versionSpec: '>=3.6' -- script: python -m pip install sphinx~=1.6.1 blurb python-docs-theme +- script: python -m pip install sphinx==1.8.2 blurb python-docs-theme displayName: 'Install build dependencies' - ${{ if ne(parameters.latex, 'true') }}: diff --git a/.travis.yml b/.travis.yml index ed4e46c782f761..8250fd91b3d9a4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,7 +43,7 @@ matrix: - cd Doc # Sphinx is pinned so that new versions that introduce new warnings won't suddenly cause build failures. # (Updating the version is fine as long as no warnings are raised by doing so.) - - python -m pip install sphinx~=1.6.1 blurb + - python -m pip install sphinx==1.8.2 blurb script: - make check suspicious html SPHINXOPTS="-q -W -j4" - os: linux From df5d884defc8f1a94013ff9beb493f1428bd55b5 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 8 Dec 2018 23:11:31 -0800 Subject: [PATCH 2077/2287] bpo-33725: skip test_multiprocessing_fork on macOS (GH-11043) (cherry picked from commit ac218bc5dbfabbd61c76ce8a17de088611e21981) Co-authored-by: Ned Deily --- Lib/test/test_multiprocessing_fork.py | 3 +++ .../NEWS.d/next/Tests/2018-12-09-01-27-29.bpo-33725.TaGayj.rst | 2 ++ 2 files changed, 5 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2018-12-09-01-27-29.bpo-33725.TaGayj.rst diff --git a/Lib/test/test_multiprocessing_fork.py b/Lib/test/test_multiprocessing_fork.py index 9f22500e8fca85..daadcd3cc3124a 100644 --- a/Lib/test/test_multiprocessing_fork.py +++ b/Lib/test/test_multiprocessing_fork.py @@ -1,11 +1,14 @@ import unittest import test._test_multiprocessing +import sys from test import support if support.PGO: raise unittest.SkipTest("test is not helpful for PGO") +if sys.platform == 'darwin': + raise unittest.SkipTest("test may crash on macOS (bpo-33725)") test._test_multiprocessing.install_tests_in_module_dict(globals(), 'fork') diff --git a/Misc/NEWS.d/next/Tests/2018-12-09-01-27-29.bpo-33725.TaGayj.rst b/Misc/NEWS.d/next/Tests/2018-12-09-01-27-29.bpo-33725.TaGayj.rst new file mode 100644 index 00000000000000..425048cb37cfb2 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2018-12-09-01-27-29.bpo-33725.TaGayj.rst @@ -0,0 +1,2 @@ +test_multiprocessing_fork may crash on recent versions of macOS. Until the +issue is resolved, skip the test on macOS. From f83ee476d48dbeb90ddf3526b04936a49a87973a Mon Sep 17 00:00:00 2001 From: stratakis Date: Sun, 9 Dec 2018 09:08:43 +0100 Subject: [PATCH 2078/2287] bpo-28015: Support LTO build with clang (GH-9908) (GH-10922) .o generated by clang in LTO mode actually are LLVM bitcode files, which leads to a few errors during configure/build step: - add lto flags to the BASECFLAGS instead of CFLAGS, as CFLAGS are used to build autoconf test case, and some are not compatible with clang LTO (they assume binary in the .o, not bitcode) - force llvm-ar instead of ar, as ar is not aware of .o files generated by clang -flto (cherry picked from commit 5ad36f9b21a3aa3b2265b1b43d73522cc3322df2) Co-authored-by: serge-sans-paille --- .../2018-10-16-12-22-36.bpo-28015.ylSgFh.rst | 1 + aclocal.m4 | 4 +- configure | 246 +++++++++++++----- configure.ac | 67 +++-- 4 files changed, 235 insertions(+), 83 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2018-10-16-12-22-36.bpo-28015.ylSgFh.rst diff --git a/Misc/NEWS.d/next/Build/2018-10-16-12-22-36.bpo-28015.ylSgFh.rst b/Misc/NEWS.d/next/Build/2018-10-16-12-22-36.bpo-28015.ylSgFh.rst new file mode 100644 index 00000000000000..5a7a43c773076d --- /dev/null +++ b/Misc/NEWS.d/next/Build/2018-10-16-12-22-36.bpo-28015.ylSgFh.rst @@ -0,0 +1 @@ +Have --with-lto works correctly with clang. diff --git a/aclocal.m4 b/aclocal.m4 index 5e29449ae2a153..61b2539d2e9d1d 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -13,7 +13,7 @@ m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -dnl serial 11 (pkg-config-0.29.1) +dnl serial 11 (pkg-config-0.29) dnl dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson @@ -55,7 +55,7 @@ dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], -[m4_define([PKG_MACROS_VERSION], [0.29.1]) +[m4_define([PKG_MACROS_VERSION], [0.29]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ diff --git a/configure b/configure index ac29d65a6c0885..5a494d987346aa 100755 --- a/configure +++ b/configure @@ -671,16 +671,18 @@ BASECFLAGS CFLAGS_ALIASING OPT LLVM_PROF_FOUND -target_os -target_vendor -target_cpu -target LLVM_PROFDATA LLVM_PROF_ERR LLVM_PROF_FILE LLVM_PROF_MERGER PGO_PROF_USE_FLAG PGO_PROF_GEN_FLAG +LLVM_AR_FOUND +target_os +target_vendor +target_cpu +target +LLVM_AR DEF_MAKE_RULE DEF_MAKE_ALL_RULE ABIFLAGS @@ -6493,6 +6495,26 @@ else DEF_MAKE_RULE="all" fi +# Make llvm-relatec checks work on systems where llvm tools are not installed with their +# normal names in the default $PATH (ie: Ubuntu). They exist under the +# non-suffixed name in their versioned llvm directory. + +llvm_bin_dir='' +llvm_path="${PATH}" +if test "${CC}" = "clang" +then + clang_bin=`which clang` + # Some systems install clang elsewhere as a symlink to the real path + # which is where the related llvm tools are located. + if test -L "${clang_bin}" + then + clang_dir=`dirname "${clang_bin}"` + clang_bin=`readlink "${clang_bin}"` + llvm_bin_dir="${clang_dir}/"`dirname "${clang_bin}"` + llvm_path="${llvm_path}${PATH_SEPARATOR}${llvm_bin_dir}" + fi +fi + # Enable LTO flags { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-lto" >&5 $as_echo_n "checking for --with-lto... " >&6; } @@ -6518,65 +6540,8 @@ fi if test "$Py_LTO" = 'true' ; then case $CC in *clang*) - case $ac_sys_system in - Darwin*) - # Any changes made here should be reflected in the GCC+Darwin case below - LTOFLAGS="-flto -Wl,-export_dynamic" - ;; - *) - LTOFLAGS="-flto" - ;; - esac - ;; - *gcc*) - case $ac_sys_system in - Darwin*) - LTOFLAGS="-flto -Wl,-export_dynamic" - ;; - *) - LTOFLAGS="-flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none" - ;; - esac - ;; - esac - if test "$ac_cv_prog_cc_g" = "yes" - then - # bpo-30345: Add -g to LDFLAGS when compiling with LTO - # to get debug symbols. - LTOFLAGS="$LTOFLAGS -g" - fi - - CFLAGS="$CFLAGS $LTOFLAGS" - LDFLAGS="$LDFLAGS $LTOFLAGS" -fi - -# Enable PGO flags. - - - - - -# Make this work on systems where llvm tools are not installed with their -# normal names in the default $PATH (ie: Ubuntu). They exist under the -# non-suffixed name in their versioned llvm directory. -llvm_bin_dir='' -llvm_path="${PATH}" -if test "${CC}" = "clang" -then - clang_bin=`which clang` - # Some systems install clang elsewhere as a symlink to the real path - # which is where the related llvm tools are located. - if test -L "${clang_bin}" - then - clang_dir=`dirname "${clang_bin}"` - clang_bin=`readlink "${clang_bin}"` - llvm_bin_dir="${clang_dir}/"`dirname "${clang_bin}"` - llvm_path="${llvm_path}${PATH_SEPARATOR}${llvm_bin_dir}" - fi -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 @@ -6615,6 +6580,163 @@ test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- +# Extract the first word of "$target_alias-llvm-ar", so it can be a program name with args. +set dummy $target_alias-llvm-ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_LLVM_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $LLVM_AR in + [\\/]* | ?:[\\/]*) + ac_cv_path_LLVM_AR="$LLVM_AR" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in ${llvm_path} +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_LLVM_AR="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +LLVM_AR=$ac_cv_path_LLVM_AR +if test -n "$LLVM_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LLVM_AR" >&5 +$as_echo "$LLVM_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test -z "$ac_cv_path_LLVM_AR"; then + if test "$build" = "$target"; then + ac_pt_LLVM_AR=$LLVM_AR + # Extract the first word of "llvm-ar", so it can be a program name with args. +set dummy llvm-ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_LLVM_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_LLVM_AR in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_LLVM_AR="$ac_pt_LLVM_AR" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in ${llvm_path} +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_LLVM_AR="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_ac_pt_LLVM_AR" && ac_cv_path_ac_pt_LLVM_AR="''" + ;; +esac +fi +ac_pt_LLVM_AR=$ac_cv_path_ac_pt_LLVM_AR +if test -n "$ac_pt_LLVM_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_LLVM_AR" >&5 +$as_echo "$ac_pt_LLVM_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + LLVM_AR=$ac_pt_LLVM_AR + else + LLVM_AR="''" + fi +else + LLVM_AR="$ac_cv_path_LLVM_AR" +fi + + + if test -n "${LLVM_AR}" -a -x "${LLVM_AR}" + then + LLVM_AR_FOUND="found" + else + LLVM_AR_FOUND="not-found" + fi + if test "$ac_sys_system" = "Darwin" -a "${LLVM_AR_FOUND}" = "not-found" + then + found_llvm_ar=`/usr/bin/xcrun -find llvm-ar 2>/dev/null` + if test -n "${found_llvm_ar}" + then + LLVM_AR='/usr/bin/xcrun llvm-ar' + LLVM_AR_FOUND=found + { $as_echo "$as_me:${as_lineno-$LINENO}: llvm-ar found via xcrun: ${LLVM_AR}" >&5 +$as_echo "$as_me: llvm-ar found via xcrun: ${LLVM_AR}" >&6;} + fi + fi + if test $LLVM_AR_FOUND = not-found + then + LLVM_PROFR_ERR=yes + as_fn_error $? "llvm-ar is required for a --with-lto build with clang but could not be found." "$LINENO" 5 + else + LLVM_AR_ERR=no + fi + AR="${LLVM_AR}" + case $ac_sys_system in + Darwin*) + # Any changes made here should be reflected in the GCC+Darwin case below + LTOFLAGS="-flto -Wl,-export_dynamic" + ;; + *) + LTOFLAGS="-flto" + ;; + esac + ;; + *gcc*) + case $ac_sys_system in + Darwin*) + LTOFLAGS="-flto -Wl,-export_dynamic" + ;; + *) + LTOFLAGS="-flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none" + ;; + esac + ;; + esac + + if test "$ac_cv_prog_cc_g" = "yes" + then + # bpo-30345: Add -g to LDFLAGS when compiling with LTO + # to get debug symbols. + LTOFLAGS="$LTOFLAGS -g" + fi + + BASECFLAGS="$BASECFLAGS $LTOFLAGS" + LDFLAGS="$LDFLAGS $LTOFLAGS" +fi + +# Enable PGO flags. + + + + + + # Extract the first word of "$target_alias-llvm-profdata", so it can be a program name with args. set dummy $target_alias-llvm-profdata; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 diff --git a/configure.ac b/configure.ac index c003025e3d9b5b..40ecb7d93d8c12 100644 --- a/configure.ac +++ b/configure.ac @@ -1308,6 +1308,26 @@ else DEF_MAKE_RULE="all" fi +# Make llvm-relatec checks work on systems where llvm tools are not installed with their +# normal names in the default $PATH (ie: Ubuntu). They exist under the +# non-suffixed name in their versioned llvm directory. + +llvm_bin_dir='' +llvm_path="${PATH}" +if test "${CC}" = "clang" +then + clang_bin=`which clang` + # Some systems install clang elsewhere as a symlink to the real path + # which is where the related llvm tools are located. + if test -L "${clang_bin}" + then + clang_dir=`dirname "${clang_bin}"` + clang_bin=`readlink "${clang_bin}"` + llvm_bin_dir="${clang_dir}/"`dirname "${clang_bin}"` + llvm_path="${llvm_path}${PATH_SEPARATOR}${llvm_bin_dir}" + fi +fi + # Enable LTO flags AC_MSG_CHECKING(for --with-lto) AC_ARG_WITH(lto, AS_HELP_STRING([--with-lto], [Enable Link Time Optimization in any build. Disabled by default.]), @@ -1324,6 +1344,33 @@ fi], if test "$Py_LTO" = 'true' ; then case $CC in *clang*) + AC_SUBST(LLVM_AR) + AC_PATH_TARGET_TOOL(LLVM_AR, llvm-ar, '', ${llvm_path}) + AC_SUBST(LLVM_AR_FOUND) + if test -n "${LLVM_AR}" -a -x "${LLVM_AR}" + then + LLVM_AR_FOUND="found" + else + LLVM_AR_FOUND="not-found" + fi + if test "$ac_sys_system" = "Darwin" -a "${LLVM_AR_FOUND}" = "not-found" + then + found_llvm_ar=`/usr/bin/xcrun -find llvm-ar 2>/dev/null` + if test -n "${found_llvm_ar}" + then + LLVM_AR='/usr/bin/xcrun llvm-ar' + LLVM_AR_FOUND=found + AC_MSG_NOTICE([llvm-ar found via xcrun: ${LLVM_AR}]) + fi + fi + if test $LLVM_AR_FOUND = not-found + then + LLVM_PROFR_ERR=yes + AC_MSG_ERROR([llvm-ar is required for a --with-lto build with clang but could not be found.]) + else + LLVM_AR_ERR=no + fi + AR="${LLVM_AR}" case $ac_sys_system in Darwin*) # Any changes made here should be reflected in the GCC+Darwin case below @@ -1353,7 +1400,7 @@ if test "$Py_LTO" = 'true' ; then LTOFLAGS="$LTOFLAGS -g" fi - CFLAGS="$CFLAGS $LTOFLAGS" + BASECFLAGS="$BASECFLAGS $LTOFLAGS" LDFLAGS="$LDFLAGS $LTOFLAGS" fi @@ -1363,24 +1410,6 @@ AC_SUBST(PGO_PROF_USE_FLAG) AC_SUBST(LLVM_PROF_MERGER) AC_SUBST(LLVM_PROF_FILE) AC_SUBST(LLVM_PROF_ERR) -# Make this work on systems where llvm tools are not installed with their -# normal names in the default $PATH (ie: Ubuntu). They exist under the -# non-suffixed name in their versioned llvm directory. -llvm_bin_dir='' -llvm_path="${PATH}" -if test "${CC}" = "clang" -then - clang_bin=`which clang` - # Some systems install clang elsewhere as a symlink to the real path - # which is where the related llvm tools are located. - if test -L "${clang_bin}" - then - clang_dir=`dirname "${clang_bin}"` - clang_bin=`readlink "${clang_bin}"` - llvm_bin_dir="${clang_dir}/"`dirname "${clang_bin}"` - llvm_path="${llvm_path}${PATH_SEPARATOR}${llvm_bin_dir}" - fi -fi AC_SUBST(LLVM_PROFDATA) AC_PATH_TARGET_TOOL(LLVM_PROFDATA, llvm-profdata, '', ${llvm_path}) AC_SUBST(LLVM_PROF_FOUND) From f2d2cb12f2d3bd68a13c4098311e725f776768ad Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 9 Dec 2018 00:35:13 -0800 Subject: [PATCH 2079/2287] bpo-35351: Pass link time optimization flags to CFLAGS_NODIST (GH-10797) When using link time optimizations, the -flto flag is passed to BASECFLAGS, which makes it propagate to distutils. Those flags should be reserved for the interpreter and the stdlib extension modules only, thus moving those flags to CFLAGS_NODIST. (cherry picked from commit f92c7aa1ae81efa475b5aecf66e4711ef0f52c4c) Co-authored-by: stratakis --- Misc/NEWS.d/next/Build/2018-12-04-15-33-28.bpo-35351.ZhhBfT.rst | 2 ++ configure | 2 +- configure.ac | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2018-12-04-15-33-28.bpo-35351.ZhhBfT.rst diff --git a/Misc/NEWS.d/next/Build/2018-12-04-15-33-28.bpo-35351.ZhhBfT.rst b/Misc/NEWS.d/next/Build/2018-12-04-15-33-28.bpo-35351.ZhhBfT.rst new file mode 100644 index 00000000000000..ee6c870b060f6a --- /dev/null +++ b/Misc/NEWS.d/next/Build/2018-12-04-15-33-28.bpo-35351.ZhhBfT.rst @@ -0,0 +1,2 @@ +When building Python with clang and LTO, LTO flags are no longer passed into +CFLAGS to build third-party C extensions through distutils. diff --git a/configure b/configure index 5a494d987346aa..8cd730d219e346 100755 --- a/configure +++ b/configure @@ -6726,7 +6726,7 @@ $as_echo "$as_me: llvm-ar found via xcrun: ${LLVM_AR}" >&6;} LTOFLAGS="$LTOFLAGS -g" fi - BASECFLAGS="$BASECFLAGS $LTOFLAGS" + CFLAGS_NODIST="$CFLAGS_NODIST $LTOFLAGS" LDFLAGS="$LDFLAGS $LTOFLAGS" fi diff --git a/configure.ac b/configure.ac index 40ecb7d93d8c12..bb14a87e5463b3 100644 --- a/configure.ac +++ b/configure.ac @@ -1400,7 +1400,7 @@ if test "$Py_LTO" = 'true' ; then LTOFLAGS="$LTOFLAGS -g" fi - BASECFLAGS="$BASECFLAGS $LTOFLAGS" + CFLAGS_NODIST="$CFLAGS_NODIST $LTOFLAGS" LDFLAGS="$LDFLAGS $LTOFLAGS" fi From 3fd975583b8e43d8dc23c83d699cd10b1fee6f7f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 10 Dec 2018 11:53:09 +0100 Subject: [PATCH 2080/2287] bpo-35052: Fix handler on xml.dom.minidom.cloneNode() (GH-11061) (GH-11067) Fix xml.dom.minidom cloneNode() on a document with an entity: pass the correct arguments to the user data handler of an entity (fix an old copy/paste mistake). Bug spotted and fix proposed by Charalampos Stratakis, initial reproducer written by Petr Viktorin. Co-Authored-By: Charalampos Stratakis Co-Authored-By: Petr Viktorin (cherry picked from commit 8e0418688906206fe59bd26344320c0fc026849e) --- Lib/test/test_minidom.py | 55 ++++++++++++++++++- Lib/xml/dom/minidom.py | 4 +- .../2018-12-10-09-48-27.bpo-35052.xE1ymg.rst | 2 + 3 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-12-10-09-48-27.bpo-35052.xE1ymg.rst diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py index ee8c04160ab706..d55e25edba7cd9 100644 --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -2,7 +2,7 @@ import copy import pickle -from test.support import findfile +from test import support import unittest import xml.dom.minidom @@ -11,7 +11,7 @@ from xml.dom.minidom import getDOMImplementation -tstfile = findfile("test.xml", subdir="xmltestdata") +tstfile = support.findfile("test.xml", subdir="xmltestdata") sample = ("\n" " + ] + > + Don't let entities make you frown ⌣ + """.strip()) + + class Handler: + def handle(self, operation, key, data, src, dst): + self.operation = operation + self.key = key + self.data = data + self.src = src + self.dst = dst + + handler = Handler() + doctype = document.doctype + entity = doctype.entities['smile'] + entity.setUserData("key", "data", handler) + + if clone_document: + # clone Document + clone = document.cloneNode(deep=True) + + self.assertEqual(clone.documentElement.firstChild.wholeText, + "Don't let entities make you frown ☺") + operation = xml.dom.UserDataHandler.NODE_IMPORTED + dst = clone.doctype.entities['smile'] + else: + # clone DocumentType + with support.swap_attr(doctype, 'ownerDocument', None): + clone = doctype.cloneNode(deep=True) + + operation = xml.dom.UserDataHandler.NODE_CLONED + dst = clone.entities['smile'] + + self.assertEqual(handler.operation, operation) + self.assertEqual(handler.key, "key") + self.assertEqual(handler.data, "data") + self.assertIs(handler.src, entity) + self.assertIs(handler.dst, dst) + + def testCloneNodeEntity(self): + self.check_clone_node_entity(False) + self.check_clone_node_entity(True) + def testNormalize(self): doc = parseString("") root = doc.documentElement diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py index a5d813f932ace3..24957ea14fa73b 100644 --- a/Lib/xml/dom/minidom.py +++ b/Lib/xml/dom/minidom.py @@ -1318,7 +1318,7 @@ def cloneNode(self, deep): entity.encoding = e.encoding entity.version = e.version clone.entities._seq.append(entity) - e._call_user_data_handler(operation, n, entity) + e._call_user_data_handler(operation, e, entity) self._call_user_data_handler(operation, self, clone) return clone else: @@ -1921,7 +1921,7 @@ def _clone_node(node, deep, newOwnerDocument): entity.ownerDocument = newOwnerDocument clone.entities._seq.append(entity) if hasattr(e, '_call_user_data_handler'): - e._call_user_data_handler(operation, n, entity) + e._call_user_data_handler(operation, e, entity) else: # Note the cloning of Document and DocumentType nodes is # implementation specific. minidom handles those cases diff --git a/Misc/NEWS.d/next/Library/2018-12-10-09-48-27.bpo-35052.xE1ymg.rst b/Misc/NEWS.d/next/Library/2018-12-10-09-48-27.bpo-35052.xE1ymg.rst new file mode 100644 index 00000000000000..4877188a294424 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-12-10-09-48-27.bpo-35052.xE1ymg.rst @@ -0,0 +1,2 @@ +Fix xml.dom.minidom cloneNode() on a document with an entity: pass the +correct arguments to the user data handler of an entity. From bad41cefef6625807198a813d9dec2c08d59dc60 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 10 Dec 2018 12:12:47 +0100 Subject: [PATCH 2081/2287] bpo-35050: AF_ALG length check off-by-one error (GH-10058) (GH-11070) The length check for AF_ALG salg_name and salg_type had a off-by-one error. The code assumed that both values are not necessarily NULL terminated. However the Kernel code for alg_bind() ensures that the last byte of both strings are NULL terminated. Signed-off-by: Christian Heimes (cherry picked from commit 2eb6ad8578fa9d764c21a92acd8e054e3202ad19) --- Lib/test/test_socket.py | 18 ++++++++++++++++++ .../2018-10-23-15-03-53.bpo-35050.49wraS.rst | 1 + Modules/socketmodule.c | 12 ++++++++---- 3 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-10-23-15-03-53.bpo-35050.49wraS.rst diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 6b7afba49d9eb0..56adec18c63656 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -5591,6 +5591,24 @@ def test_sendmsg_afalg_args(self): with self.assertRaises(TypeError): sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1) + def test_length_restriction(self): + # bpo-35050, off-by-one error in length check + sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0) + self.addCleanup(sock.close) + + # salg_type[14] + with self.assertRaises(FileNotFoundError): + sock.bind(("t" * 13, "name")) + with self.assertRaisesRegex(ValueError, "type too long"): + sock.bind(("t" * 14, "name")) + + # salg_name[64] + with self.assertRaises(FileNotFoundError): + sock.bind(("type", "n" * 63)) + with self.assertRaisesRegex(ValueError, "name too long"): + sock.bind(("type", "n" * 64)) + + @unittest.skipUnless(sys.platform.startswith("win"), "requires Windows") class TestMSWindowsTCPFlags(unittest.TestCase): knownTCPFlags = { diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-10-23-15-03-53.bpo-35050.49wraS.rst b/Misc/NEWS.d/next/Core and Builtins/2018-10-23-15-03-53.bpo-35050.49wraS.rst new file mode 100644 index 00000000000000..9a33416089a2a6 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-10-23-15-03-53.bpo-35050.49wraS.rst @@ -0,0 +1 @@ +:mod:`socket`: Fix off-by-one bug in length check for ``AF_ALG`` name and type. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index c940f1b81693c7..0daf98b6d23853 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -356,7 +356,7 @@ remove_unusable_flags(PyObject *m) for (int i=0; isalg_feat, &sa->salg_mask)) + { return 0; - /* sockaddr_alg has fixed-sized char arrays for type and name */ - if (strlen(type) > sizeof(sa->salg_type)) { + } + /* sockaddr_alg has fixed-sized char arrays for type, and name + * both must be NULL terminated. + */ + if (strlen(type) >= sizeof(sa->salg_type)) { PyErr_SetString(PyExc_ValueError, "AF_ALG type too long."); return 0; } strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type)); - if (strlen(name) > sizeof(sa->salg_name)) { + if (strlen(name) >= sizeof(sa->salg_name)) { PyErr_SetString(PyExc_ValueError, "AF_ALG name too long."); return 0; } From 7215e4857123afa8577f63c1024bcd1889a96305 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 10 Dec 2018 03:35:18 -0800 Subject: [PATCH 2082/2287] bpo-31374: Include pyconfig.h earlier in expat (GH-11064) Include ealier in Modules/expat/xmltok.c to define properly _POSIX_C_SOURCE. Python defines _POSIX_C_SOURCE as 200809L, whereas (included indirectly by ) defines _POSIX_C_SOURCE as 199506L. (cherry picked from commit cf247359d5b7082044eea1fa94b5211a172b1ff6) Co-authored-by: Victor Stinner --- Modules/expat/xmltok.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/expat/xmltok.c b/Modules/expat/xmltok.c index 6b415d83972ca6..fa35de71324ceb 100644 --- a/Modules/expat/xmltok.c +++ b/Modules/expat/xmltok.c @@ -30,6 +30,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include #include #include /* memcpy */ From 3acf30de90936fe3714bb62873e2523c0440e652 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 10 Dec 2018 07:41:11 -0800 Subject: [PATCH 2083/2287] bpo-31374: expat doesn't include on Windows (GH-11079) (cherry picked from commit b6ef6f69a9afc979640a5f9883f799de1364bff7) Co-authored-by: Victor Stinner --- Modules/expat/xmltok.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Modules/expat/xmltok.c b/Modules/expat/xmltok.c index fa35de71324ceb..6371a350dadf96 100644 --- a/Modules/expat/xmltok.c +++ b/Modules/expat/xmltok.c @@ -30,7 +30,9 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include +#if !defined(_WIN32) && defined(HAVE_EXPAT_CONFIG_H) +# include +#endif #include #include /* memcpy */ From f04cc5fc0d2f644cccb57543aae487ee30091924 Mon Sep 17 00:00:00 2001 From: Jeremy Kloth Date: Mon, 10 Dec 2018 13:31:37 -0700 Subject: [PATCH 2084/2287] [3.6] bpo-35433: Properly detect installed SDK versions (GH-11009) --- PCbuild/build.bat | 3 ++- PCbuild/python.props | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/PCbuild/build.bat b/PCbuild/build.bat index 5828b518b11aa9..0df64ee6e14329 100644 --- a/PCbuild/build.bat +++ b/PCbuild/build.bat @@ -141,4 +141,5 @@ goto :eof :Version rem Display the current build version information -%MSBUILD% "%dir%python.props" /t:ShowVersionInfo /v:m /nologo %1 %2 %3 %4 %5 %6 %7 %8 %9 +call "%dir%find_msbuild.bat" %MSBUILD% +if not ERRORLEVEL 1 %MSBUILD% "%dir%pythoncore.vcxproj" /t:ShowVersionInfo /v:m /nologo %1 %2 %3 %4 %5 %6 %7 %8 %9 diff --git a/PCbuild/python.props b/PCbuild/python.props index 570f7fa883458a..b29669b732b147 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -74,12 +74,17 @@ possible version). Since we limit WINVER to Windows 7 anyway, it doesn't really matter which WinSDK version we use. --> - <_RegistryVersion>$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0@ProductVersion) - <_RegistryVersion Condition="$(_RegistryVersion) == ''">$(Registry:HKEY_LOCAL_MACHINE\WOW6432Node\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0@ProductVersion) - 10.0.15063.0 - 10.0.14393.0 - 10.0.10586.0 - 10.0.10240.0 + <_KitsRoot>$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0@InstallationFolder) + <_KitsRoot Condition="$(_KitsRoot) == ''">$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0@InstallationFolder) + + + 10.0.10586.0 + 10.0.14393.0 + 10.0.15063.0 + + + + $(DefaultWindowsSDKVersion) @@ -187,5 +192,6 @@ + From b1f98d4c723f746cea9447d7fd9e341ee8da1371 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 10 Dec 2018 12:48:10 -0800 Subject: [PATCH 2085/2287] Fix numbered lists in stdtypes.rst. (GH-10989) (cherry picked from commit de9e9b476ec4abfb0b9161cff0e86bb7085ca8c6) Co-authored-by: Andre Delfino --- Doc/library/stdtypes.rst | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index eed37454bc3591..00e1f4c1bf0cf9 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2113,28 +2113,26 @@ object. [5]_ Otherwise, *values* must be a tuple with exactly the number of items specified by the format string, or a single mapping object (for example, a dictionary). +.. index:: + single: () (parentheses); in printf-style formatting + single: * (asterisk); in printf-style formatting + single: . (dot); in printf-style formatting + A conversion specifier contains two or more characters and has the following components, which must occur in this order: #. The ``'%'`` character, which marks the start of the specifier. -.. index:: - single: () (parentheses); in printf-style formatting - #. Mapping key (optional), consisting of a parenthesised sequence of characters (for example, ``(somename)``). #. Conversion flags (optional), which affect the result of some conversion types. -.. index:: single: * (asterisk); in printf-style formatting - #. Minimum field width (optional). If specified as an ``'*'`` (asterisk), the actual width is read from the next element of the tuple in *values*, and the object to convert comes after the minimum field width and optional precision. -.. index:: single: . (dot); in printf-style formatting - #. Precision (optional), given as a ``'.'`` (dot) followed by the precision. If specified as ``'*'`` (an asterisk), the actual precision is read from the next element of the tuple in *values*, and the value to convert comes after the @@ -3229,28 +3227,26 @@ object. [5]_ Otherwise, *values* must be a tuple with exactly the number of items specified by the format bytes object, or a single mapping object (for example, a dictionary). +.. index:: + single: () (parentheses); in printf-style formatting + single: * (asterisk); in printf-style formatting + single: . (dot); in printf-style formatting + A conversion specifier contains two or more characters and has the following components, which must occur in this order: #. The ``'%'`` character, which marks the start of the specifier. -.. index:: - single: () (parentheses); in printf-style formatting - #. Mapping key (optional), consisting of a parenthesised sequence of characters (for example, ``(somename)``). #. Conversion flags (optional), which affect the result of some conversion types. -.. index:: single: * (asterisk); in printf-style formatting - #. Minimum field width (optional). If specified as an ``'*'`` (asterisk), the actual width is read from the next element of the tuple in *values*, and the object to convert comes after the minimum field width and optional precision. -.. index:: single: . (dot); in printf-style formatting - #. Precision (optional), given as a ``'.'`` (dot) followed by the precision. If specified as ``'*'`` (an asterisk), the actual precision is read from the next element of the tuple in *values*, and the value to convert comes after the From 309d7207f691b3eaa988d2293b9d023943982a9f Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Mon, 10 Dec 2018 19:52:51 -0800 Subject: [PATCH 2086/2287] bpo-35401: Updates Windows build to OpenSSL 1.0.2q (GH-11089) --- .../next/Windows/2018-12-10-15-01-13.bpo-35401.9L1onG.rst | 1 + PCbuild/get_externals.bat | 2 +- PCbuild/libeay.vcxproj | 3 +-- PCbuild/python.props | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2018-12-10-15-01-13.bpo-35401.9L1onG.rst diff --git a/Misc/NEWS.d/next/Windows/2018-12-10-15-01-13.bpo-35401.9L1onG.rst b/Misc/NEWS.d/next/Windows/2018-12-10-15-01-13.bpo-35401.9L1onG.rst new file mode 100644 index 00000000000000..a804473fd6dbb0 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2018-12-10-15-01-13.bpo-35401.9L1onG.rst @@ -0,0 +1 @@ +Updates Windows build to OpenSSL 1.0.2q diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index aff44786b706f4..016ecdd752b1b3 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -41,7 +41,7 @@ echo.Fetching external libraries... set libraries= set libraries=%libraries% bzip2-1.0.6 -if NOT "%IncludeSSL%"=="false" set libraries=%libraries% openssl-1.0.2p +if NOT "%IncludeSSL%"=="false" set libraries=%libraries% openssl-1.0.2q set libraries=%libraries% sqlite-3.21.0.0 if NOT "%IncludeTkinter%"=="false" set libraries=%libraries% tcl-core-8.6.6.0 if NOT "%IncludeTkinter%"=="false" set libraries=%libraries% tk-8.6.6.0 diff --git a/PCbuild/libeay.vcxproj b/PCbuild/libeay.vcxproj index 9662cd4b71509a..31591bc13508aa 100644 --- a/PCbuild/libeay.vcxproj +++ b/PCbuild/libeay.vcxproj @@ -533,6 +533,7 @@ + @@ -725,9 +726,7 @@ - diff --git a/PCbuild/python.props b/PCbuild/python.props index b29669b732b147..3022ca50c247a2 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -49,7 +49,7 @@ $(ExternalsDir)sqlite-3.21.0.0\ $(ExternalsDir)bzip2-1.0.6\ $(ExternalsDir)xz-5.2.2\ - $(ExternalsDir)openssl-1.0.2p\ + $(ExternalsDir)openssl-1.0.2q\ $(opensslDir)include32 $(opensslDir)include64 $(ExternalsDir)\nasm-2.11.06\ From 419b5ffc2ca46d7adf0be6216ca3a6e40028e50f Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 11 Dec 2018 00:37:53 -0500 Subject: [PATCH 2087/2287] [3.6] bpo-35401: Update macOS installer to OpenSSL 1.0.2q (GH-11095) https://bugs.python.org/issue35401 --- Mac/BuildScript/build-installer.py | 6 +++--- .../next/macOS/2018-12-10-02-37-11.bpo-35401.sFhD5z.rst | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2018-12-10-02-37-11.bpo-35401.sFhD5z.rst diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index b97d55bb0306f0..2ef6ddc095e557 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -211,9 +211,9 @@ def library_recipes(): result.extend([ dict( - name="OpenSSL 1.0.2p", - url="https://www.openssl.org/source/openssl-1.0.2p.tar.gz", - checksum='ac5eb30bf5798aa14b1ae6d0e7da58df', + name="OpenSSL 1.0.2q", + url="https://www.openssl.org/source/openssl-1.0.2q.tar.gz", + checksum='7563e1ce046cb21948eeb6ba1a0eb71c', buildrecipe=build_universal_openssl, configure=None, install=None, diff --git a/Misc/NEWS.d/next/macOS/2018-12-10-02-37-11.bpo-35401.sFhD5z.rst b/Misc/NEWS.d/next/macOS/2018-12-10-02-37-11.bpo-35401.sFhD5z.rst new file mode 100644 index 00000000000000..113329d0f23162 --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2018-12-10-02-37-11.bpo-35401.sFhD5z.rst @@ -0,0 +1 @@ +Update macOS installer to use OpenSSL 1.0.2q. From 37607f26697351751165a042f91f04530ce333f7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 10 Dec 2018 22:29:45 -0800 Subject: [PATCH 2088/2287] bpo-35402: Update macOS installer to use Tcl 8.6.9 / Tk 8.6.9.1 (GH-11101) (cherry picked from commit 7cf3d8e25174c8871883e42f3240fd7f01efd3a8) Co-authored-by: Ned Deily --- Mac/BuildScript/build-installer.py | 18 +++++++++--------- Mac/BuildScript/tk868_on_10_8_10_9.patch | 18 ------------------ .../2018-12-10-02-44-48.bpo-35402.xzn8qJ.rst | 1 + 3 files changed, 10 insertions(+), 27 deletions(-) delete mode 100644 Mac/BuildScript/tk868_on_10_8_10_9.patch create mode 100644 Misc/NEWS.d/next/macOS/2018-12-10-02-44-48.bpo-35402.xzn8qJ.rst diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 2ef6ddc095e557..48c4e5cf9b34a5 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -223,9 +223,9 @@ def library_recipes(): if internalTk(): result.extend([ dict( - name="Tcl 8.6.8", - url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tcl8.6.8-src.tar.gz", - checksum='81656d3367af032e0ae6157eff134f89', + name="Tcl 8.6.9", + url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tcl8.6.9-src.tar.gz", + checksum='aa0a121d95a0e7b73a036f26028538d4', buildDir="unix", configure_pre=[ '--enable-shared', @@ -239,12 +239,9 @@ def library_recipes(): }, ), dict( - name="Tk 8.6.8", - url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tk8.6.8-src.tar.gz", - checksum='5e0faecba458ee1386078fb228d008ba', - patches=[ - "tk868_on_10_8_10_9.patch", - ], + name="Tk 8.6.9.1", + url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tk8.6.9.1-src.tar.gz", + checksum='9efe3976468352dc894dae0c4e785a8e', buildDir="unix", configure_pre=[ '--enable-aqua', @@ -706,6 +703,7 @@ def extractArchive(builddir, archiveName): work for current Tcl and Tk source releases where the basename of the archive ends with "-src" but the uncompressed directory does not. For now, just special case Tcl and Tk tar.gz downloads. + Another special case: the tk8.6.9.1 tarball extracts to tk8.6.9. """ curdir = os.getcwd() try: @@ -715,6 +713,8 @@ def extractArchive(builddir, archiveName): if ((retval.startswith('tcl') or retval.startswith('tk')) and retval.endswith('-src')): retval = retval[:-4] + if retval == 'tk8.6.9.1': + retval = 'tk8.6.9' if os.path.exists(retval): shutil.rmtree(retval) fp = os.popen("tar zxf %s 2>&1"%(shellQuote(archiveName),), 'r') diff --git a/Mac/BuildScript/tk868_on_10_8_10_9.patch b/Mac/BuildScript/tk868_on_10_8_10_9.patch deleted file mode 100644 index 8fe10604a68cb8..00000000000000 --- a/Mac/BuildScript/tk868_on_10_8_10_9.patch +++ /dev/null @@ -1,18 +0,0 @@ -Fix build failure with +quartz variant on OS X 10.8 and 10.9. -Even though Gestalt was deprecated in OS X 10.8, it should work fine -through OS X 10.9, and its replacement NSOperatingSystemVersion was -not introduced until OS X 10.10. - -Patch from MacPorts project and reported upstream: -https://trac.macports.org/ticket/55649 ---- tk8.6.8/macosx/tkMacOSXXStubs.c.orig 2017-12-06 09:25:08.000000000 -0600 -+++ tk8.6.8-patched/macosx/tkMacOSXXStubs.c 2018-01-06 19:34:17.000000000 -0600 -@@ -175,7 +175,7 @@ - { - int major, minor, patch; - --#if MAC_OS_X_VERSION_MIN_REQUIRED < 1080 -+#if MAC_OS_X_VERSION_MIN_REQUIRED < 101000 - Gestalt(gestaltSystemVersionMajor, (SInt32*)&major); - Gestalt(gestaltSystemVersionMinor, (SInt32*)&minor); - Gestalt(gestaltSystemVersionBugFix, (SInt32*)&patch); diff --git a/Misc/NEWS.d/next/macOS/2018-12-10-02-44-48.bpo-35402.xzn8qJ.rst b/Misc/NEWS.d/next/macOS/2018-12-10-02-44-48.bpo-35402.xzn8qJ.rst new file mode 100644 index 00000000000000..d6b503d10527d9 --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2018-12-10-02-44-48.bpo-35402.xzn8qJ.rst @@ -0,0 +1 @@ +Update macOS installer to use Tcl/Tk 8.6.9.1. From 8855d9339858683c9b4fcd50b02a7bca526d4726 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 11 Dec 2018 09:27:50 +0200 Subject: [PATCH 2089/2287] [3.6] bpo-35454: Fix miscellaneous minor issues in error handling. (GH-11077) (GH-11106) (cherry picked from commit 8905fcc85a6fc3ac394bc89b0bbf40897e9497a6) --- Modules/_elementtree.c | 5 ++++- Modules/_threadmodule.c | 8 +++++--- Modules/socketmodule.c | 12 ++++++++---- Objects/namespaceobject.c | 18 +++++++++--------- Python/_warnings.c | 6 +++++- Python/ceval.c | 2 +- Python/codecs.c | 6 ++++-- Python/import.c | 4 ++-- Python/pylifecycle.c | 3 +++ 9 files changed, 41 insertions(+), 23 deletions(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 5c6959662316f5..30e382dd6c5eed 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -352,7 +352,10 @@ get_attrib_from_keywords(PyObject *kwds) return NULL; } attrib = PyDict_Copy(attrib); - PyDict_DelItem(kwds, attrib_str); + if (attrib && PyDict_DelItem(kwds, attrib_str) < 0) { + Py_DECREF(attrib); + attrib = NULL; + } } else { attrib = PyDict_New(); } diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index c504b57b064f3b..a13b2e07400cca 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -785,9 +785,11 @@ local_clear(localobject *self) for(tstate = PyInterpreterState_ThreadHead(tstate->interp); tstate; tstate = PyThreadState_Next(tstate)) - if (tstate->dict && - PyDict_GetItem(tstate->dict, self->key)) - PyDict_DelItem(tstate->dict, self->key); + if (tstate->dict && PyDict_GetItem(tstate->dict, self->key)) { + if (PyDict_DelItem(tstate->dict, self->key)) { + PyErr_Clear(); + } + } } return 0; } diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 0daf98b6d23853..520867458c1b89 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -367,10 +367,14 @@ remove_unusable_flags(PyObject *m) else { if (PyDict_GetItemString( dict, - win_runtime_flags[i].flag_name) != NULL) { - PyDict_DelItemString( - dict, - win_runtime_flags[i].flag_name); + win_runtime_flags[i].flag_name) != NULL) + { + if (PyDict_DelItemString( + dict, + win_runtime_flags[i].flag_name)) + { + PyErr_Clear(); + } } } } diff --git a/Objects/namespaceobject.c b/Objects/namespaceobject.c index 6307ee0423dc29..a810effeb3d39e 100644 --- a/Objects/namespaceobject.c +++ b/Objects/namespaceobject.c @@ -109,15 +109,15 @@ namespace_repr(PyObject *ns) PyObject *value, *item; value = PyDict_GetItem(d, key); - assert(value != NULL); - - item = PyUnicode_FromFormat("%S=%R", key, value); - if (item == NULL) { - loop_error = 1; - } - else { - loop_error = PyList_Append(pairs, item); - Py_DECREF(item); + if (value != NULL) { + item = PyUnicode_FromFormat("%S=%R", key, value); + if (item == NULL) { + loop_error = 1; + } + else { + loop_error = PyList_Append(pairs, item); + Py_DECREF(item); + } } } diff --git a/Python/_warnings.c b/Python/_warnings.c index e96e154b0d542f..3ae68bb2613b61 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -248,7 +248,11 @@ already_warned(PyObject *registry, PyObject *key, int should_set) version_obj = _PyDict_GetItemId(registry, &PyId_version); if (version_obj == NULL || !PyLong_CheckExact(version_obj) - || PyLong_AsLong(version_obj) != _filters_version) { + || PyLong_AsLong(version_obj) != _filters_version) + { + if (PyErr_Occurred()) { + return -1; + } PyDict_Clear(registry); version_obj = PyLong_FromLong(_filters_version); if (version_obj == NULL) diff --git a/Python/ceval.c b/Python/ceval.c index 38d1d73845fbda..36e966470dba54 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5471,7 +5471,7 @@ unicode_concatenate(PyObject *v, PyObject *w, PyObject *names = f->f_code->co_names; PyObject *name = GETITEM(names, oparg); PyObject *locals = f->f_locals; - if (PyDict_CheckExact(locals) && + if (locals && PyDict_CheckExact(locals) && PyDict_GetItem(locals, name) == v) { if (PyDict_DelItem(locals, name) != 0) { PyErr_Clear(); diff --git a/Python/codecs.c b/Python/codecs.c index 4ff83014d8bc82..584c1ef430deb5 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -129,8 +129,10 @@ PyObject *_PyCodec_Lookup(const char *encoding) /* Next, scan the search functions in order of registration */ args = PyTuple_New(1); - if (args == NULL) - goto onError; + if (args == NULL) { + Py_DECREF(v); + return NULL; + } PyTuple_SET_ITEM(args,0,v); len = PyList_Size(interp->codec_search_path); diff --git a/Python/import.c b/Python/import.c index db1650a9ddd2ea..cb192704558252 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1973,10 +1973,10 @@ _imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file) } mod = _PyImport_FindExtensionObject(name, path); - if (mod != NULL) { + if (mod != NULL || PyErr_Occurred()) { Py_DECREF(name); Py_DECREF(path); - Py_INCREF(mod); + Py_XINCREF(mod); return mod; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 56f04afc770142..0ebf9c702928e1 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -797,6 +797,9 @@ Py_NewInterpreter(void) goto handle_error; Py_INCREF(interp->builtins); } + else if (PyErr_Occurred()) { + goto handle_error; + } /* initialize builtin exceptions */ _PyExc_Init(bimod); From f74cabd9203cf3be97fdb3821a7fa0b74d7b2263 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 11 Dec 2018 04:28:31 -0500 Subject: [PATCH 2090/2287] [3.6] bpo-15663: the 10.6+ macOS installers for 3.6/2.7 now provide a private Tcl/Tk 8.6 (GH-11109) --- Mac/BuildScript/build-installer.py | 10 +- Mac/BuildScript/resources/ReadMe.rtf | 111 +++++++++--------- Mac/BuildScript/resources/Welcome.rtf | 33 +++--- .../2018-12-11-02-50-35.bpo-15663.6tnyd2.rst | 2 + 4 files changed, 80 insertions(+), 76 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2018-12-11-02-50-35.bpo-15663.6tnyd2.rst diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 48c4e5cf9b34a5..b1dede492058b6 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -2,6 +2,8 @@ """ This script is used to build "official" universal installers on macOS. +NEW for 3.6.8 / 2.7.16: +- also build and use Tk 8.6 for 10.6+ installers NEW for 3.6.5: - support Intel 64-bit-only () and 32-bit-only installer builds - build and link with private Tcl/Tk 8.6 for 10.9+ builds @@ -20,8 +22,8 @@ so will fetch them from PyPI if necessary. Since python3 is now used for Sphinx, build-installer.py should also be converted to use python3! -For 10.9 or greater deployment targets, build-installer builds and links -with its own copy of Tcl/Tk 8.5 and the rest of this paragraph does not +For 10.6 or greater deployment targets, build-installer builds and links +with its own copy of Tcl/Tk 8.6 and the rest of this paragraph does not apply. Otherwise, build-installer requires an installed third-party version of Tcl/Tk 8.4 (for OS X 10.4 and 10.5 deployment targets) or Tcl/TK 8.5 (for 10.6 or later) installed in /Library/Frameworks. When installed, @@ -188,9 +190,9 @@ def getTargetCompilers(): EXPECTED_SHARED_LIBS = {} # Are we building and linking with our own copy of Tcl/TK? -# For now, do so if deployment target is 10.9+. +# For now, do so if deployment target is 10.6+. def internalTk(): - return getDeptargetTuple() >= (10, 9) + return getDeptargetTuple() >= (10, 6) # List of names of third party software built with this installer. # The names will be inserted into the rtf version of the License. diff --git a/Mac/BuildScript/resources/ReadMe.rtf b/Mac/BuildScript/resources/ReadMe.rtf index e8deea1b54fe34..35a17eda210a07 100644 --- a/Mac/BuildScript/resources/ReadMe.rtf +++ b/Mac/BuildScript/resources/ReadMe.rtf @@ -1,5 +1,6 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1561\cocoasubrtf400 -{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fmodern\fcharset0 CourierNewPSMT;} +{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf100 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 Helvetica-Bold;\f2\fswiss\fcharset0 Helvetica-Oblique; +\f3\fmodern\fcharset0 CourierNewPSMT;} {\colortbl;\red255\green255\blue255;} {\*\expandedcolortbl;;} \margl1440\margr1440\vieww13380\viewh14600\viewkind0 @@ -9,104 +10,98 @@ \ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\b \cf0 \ul \ulc0 Which installer variant should I use? [CHANGED in 3.6.6] -\b0 \ulnone \ +\f1\b \cf0 \ul \ulc0 Which installer variant should I use? [CHANGED in 3.6.6] +\f0\b0 \ulnone \ \ With Python 3.6.5, the python.org website now provides two installer variants for download: one that installs a -\i 64-bit-only -\i0 Python capable of running on -\i macOS 10.9 (Mavericks) -\i0 or later; and one that installs a -\i 64-bit/32-bit Intel -\i0 Python capable of running on -\i macOS 10.6 (Snow Leopard) -\i0 or later. (This ReadMe was installed with the -\i $MACOSX_DEPLOYMENT_TARGET -\i0 variant.) Previous Python 3.6.x releases only provided the 10.6 or later installer. If you are running on macOS 10.9 or later and if you have no need for compatibility with older systems, use the 10.9 variant. Use the 10.6 variant if you are running on macOS 10.6 through 10.8, if you need to maintain compatibility with previous 3.6.x releases, or if you want to produce standalone applications that can run on systems from 10.6. The Pythons installed by these installers are built with private copies of some third-party libraries not included with or newer than those in macOS itself. The list of these libraries varies by installer variant and is included at the end of the License.rtf file.\ +\f2\i 64-bit-only +\f0\i0 Python capable of running on +\f2\i macOS 10.9 (Mavericks) +\f0\i0 or later; and one that installs a +\f2\i 64-bit/32-bit Intel +\f0\i0 Python capable of running on +\f2\i macOS 10.6 (Snow Leopard) +\f0\i0 or later. (This ReadMe was installed with the +\f2\i $MACOSX_DEPLOYMENT_TARGET +\f0\i0 variant.) Previous Python 3.6.x releases only provided the 10.6 or later installer. If you are running on macOS 10.9 or later and if you have no need for compatibility with older systems, use the 10.9 variant. Use the 10.6 variant if you are running on macOS 10.6 through 10.8, if you need to maintain compatibility with previous 3.6.x releases, or if you want to produce standalone applications that can run on systems from 10.6. The Pythons installed by these installers are built with private copies of some third-party libraries not included with or newer than those in macOS itself. The list of these libraries varies by installer variant and is included at the end of the License.rtf file.\ \ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\partightenfactor0 -\b \cf0 CHANGED in 3.6.6: -\b0 the 10.9+ 64-bit-only installer variant is now the default download. The 10.6+ variant is available from the $FULL_VERSION release page.\ +\f1\b \cf0 CHANGED in 3.6.6: +\f0\b0 the 10.9+ 64-bit-only installer variant is now the default download. The 10.6+ variant is available from the $FULL_VERSION release page.\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\b \cf0 \ul \ +\f1\b \cf0 \ul \ Certificate verification and OpenSSL\ -\b0 \ulnone \ +\f0\b0 \ulnone \ This variant of Python 3.6 now includes its own private copy of OpenSSL 1.0.2. Unlike previous releases, the deprecated Apple-supplied OpenSSL libraries are no longer used. This also means that the trust certificates in system and user keychains managed by the -\i Keychain Access -\i0 application and the -\i security -\i0 command line utility are no longer used as defaults by the Python -\f1 ssl +\f2\i Keychain Access +\f0\i0 application and the +\f2\i security +\f0\i0 command line utility are no longer used as defaults by the Python +\f3 ssl \f0 module. A sample command script is included in -\f1 /Applications/Python 3.6 +\f3 /Applications/Python 3.6 \f0 to install a curated bundle of default root certificates from the third-party -\f1 certifi +\f3 certifi \f0 package ({\field{\*\fldinst{HYPERLINK "https://pypi.org/project/certifi/"}}{\fldrslt https://pypi.org/project/certifi/}}). If you choose to use -\f1 certifi +\f3 certifi \f0 , you should consider subscribing to the{\field{\*\fldinst{HYPERLINK "https://certifi.io/en/latest/"}}{\fldrslt project's email update service}} to be notified when the certificate bundle is updated.\ \ The bundled -\f1 pip +\f3 pip \f0 included with the Python 3.6 installer has its own default certificate store for verifying download connections.\ \ -\b \ul Using IDLE or other Tk applications [NEW/CHANGED in 3.6.5] -\b0 \ulnone \ +\f1\b \ul Using IDLE or other Tk applications [NEW/CHANGED in 3.6.5] +\f0\b0 \ulnone \ \ -The 10.9+ installer variant comes with its own private version of Tcl/Tk 8.6. It does not use system-supplied or third-party supplied versions of Tcl/Tk.\ -\ -For the 10.6+ variant in 3.6.6, you continue to need to install a newer third-party version of the -\i Tcl/Tk -\i0 8.5 (not 8.6) frameworks to use IDLE or other programs that use the Tkinter graphical user interface toolkit. Visit {\field{\*\fldinst{HYPERLINK "https://www.python.org/download/mac/tcltk/"}}{\fldrslt https://www.python.org/download/mac/tcltk/}} for current information about supported and recommended versions of -\i Tcl/Tk -\i0 for this version of Python and of macOS.\ +As of 3.6.5, the 10.9+ installer variant comes with its own private version of Tcl/Tk 8.6. It does not use system-supplied or third-party supplied versions of Tcl/Tk.\ \ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\b \cf0 NOTE: -\b0 As of the next 3.6.x release, 3.6.7, the 10.6+ variant will also include Tcl/Tk 8.6.\ +\f1\b \cf0 CHANGED in 3.6.8: +\f0\b0 The 10.6+ variant now also uses a private version of Tcl/Tk 8.6.\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\b \cf0 \ul \ +\f1\b \cf0 \ul \ Other changes\ -\b0 \ulnone \ +\f0\b0 \ulnone \ For other changes in this release, see the -\i What's new -\i0 section in the {\field{\*\fldinst{HYPERLINK "https://www.python.org/doc/"}}{\fldrslt Documentation Set}} for this release and its -\i Release Notes -\i0 link at {\field{\*\fldinst{HYPERLINK "https://www.python.org/downloads/"}}{\fldrslt https://www.python.org/downloads/}}.\ +\f2\i What's new +\f0\i0 section in the {\field{\*\fldinst{HYPERLINK "https://www.python.org/doc/"}}{\fldrslt Documentation Set}} for this release and its +\f2\i Release Notes +\f0\i0 link at {\field{\*\fldinst{HYPERLINK "https://www.python.org/downloads/"}}{\fldrslt https://www.python.org/downloads/}}.\ -\b \ul \ +\f1\b \ul \ Python 3 and Python 2 Co-existence\ -\b0 \ulnone \ +\f0\b0 \ulnone \ Python.org Python $VERSION and 2.7.x versions can both be installed on your system and will not conflict. Command names for Python 3 contain a 3 in them, -\f1 python3 +\f3 python3 \f0 (or -\f1 python$VERSION +\f3 python$VERSION \f0 ), -\f1 idle3 +\f3 idle3 \f0 (or i -\f1 dle$VERSION +\f3 dle$VERSION \f0 ), -\f1 pip3 +\f3 pip3 \f0 (or -\f1 pip$VERSION +\f3 pip$VERSION \f0 ), etc. Python 2.7 command names contain a 2 or no digit: -\f1 python2 +\f3 python2 \f0 (or -\f1 python2.7 +\f3 python2.7 \f0 or -\f1 python +\f3 python \f0 ), -\f1 idle2 +\f3 idle2 \f0 (or -\f1 idle2.7 +\f3 idle2.7 \f0 or -\f1 idle +\f3 idle \f0 ), etc.\ } \ No newline at end of file diff --git a/Mac/BuildScript/resources/Welcome.rtf b/Mac/BuildScript/resources/Welcome.rtf index 22a794a5a5737d..f55172ec606a43 100644 --- a/Mac/BuildScript/resources/Welcome.rtf +++ b/Mac/BuildScript/resources/Welcome.rtf @@ -1,27 +1,32 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1561\cocoasubrtf400 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf100 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 Helvetica-Bold;} {\colortbl;\red255\green255\blue255;} {\*\expandedcolortbl;;} \paperw11905\paperh16837\margl1440\margr1440\vieww12200\viewh10880\viewkind0 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \f0\fs24 \cf0 This package will install -\b Python $FULL_VERSION -\b0 for -\b macOS $MACOSX_DEPLOYMENT_TARGET -\b0 .\ +\f1\b Python $FULL_VERSION +\f0\b0 for +\f1\b macOS $MACOSX_DEPLOYMENT_TARGET +\f0\b0 .\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\partightenfactor0 \cf0 \ -\b Python for macOS -\b0 consists of the Python programming language interpreter, plus a set of programs to allow easy access to it for macOS users including an integrated development environment -\b IDLE -\b0 .\ +\f1\b Python for macOS +\f0\b0 consists of the Python programming language interpreter, plus a set of programs to allow easy access to it for macOS users including an integrated development environment +\f1\b IDLE +\f0\b0 .\ \ -\b NEW in 3.6.5: -\b0 two installer variants (10.9+ 64-bit-only, 10.6+ 64-/32-bit), built-in Tcl/Tk 8.6 support in the 10.9+ variant (no additional third-party downloads!)\ +\f1\b NEW in 3.6.5: +\f0\b0 two installer variants (10.9+ 64-bit-only, 10.6+ 64-/32-bit), built-in Tcl/Tk 8.6 support in the 10.9+ variant (no additional third-party downloads!)\ \ -\b CHANGED in 3.6.6: -\b0 the 10.9+ 64-bit-only installer variant is now the default download} \ No newline at end of file +\f1\b CHANGED in 3.6.6: +\f0\b0 the 10.9+ 64-bit-only installer variant is now the default download\ +\ + +\f1\b CHANGED in 3.6.8: +\f0\b0 the 10.6+ variant now also uses a built-in Tcl/Tk 8.6\ +} \ No newline at end of file diff --git a/Misc/NEWS.d/next/macOS/2018-12-11-02-50-35.bpo-15663.6tnyd2.rst b/Misc/NEWS.d/next/macOS/2018-12-11-02-50-35.bpo-15663.6tnyd2.rst new file mode 100644 index 00000000000000..1aa7f11a05ef02 --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2018-12-11-02-50-35.bpo-15663.6tnyd2.rst @@ -0,0 +1,2 @@ +The macOS 10.6+ installer now provides a private copy of Tcl/Tk 8.6, like +the 10.9+ installer does. From be6ec444729f727f304ae10f3a7e2feda3cc3aaa Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 11 Dec 2018 02:13:14 -0800 Subject: [PATCH 2091/2287] bpo-35444: Fix error handling when fail to look up builtin "getattr". (GH-11047) (GH-11107) (GH-11108) (cherry picked from commit bb86bf4c4eaa30b1f5192dab9f389ce0bb61114d) (cherry picked from commit 3cae16d2e98ffaa89ddd311df70a857dfaff4020) Co-authored-by: Serhiy Storchaka --- Include/ceval.h | 4 +++- .../2018-12-09-13-09-39.bpo-35444.9kYn4V.rst | 2 ++ Modules/_pickle.c | 8 ++------ Objects/classobject.c | 7 ++----- Objects/descrobject.c | 17 ++++------------- Objects/methodobject.c | 7 ++----- Python/ceval.c | 14 ++++++++++++++ 7 files changed, 29 insertions(+), 30 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-12-09-13-09-39.bpo-35444.9kYn4V.rst diff --git a/Include/ceval.h b/Include/ceval.h index 38d470999f7350..f46aef18043f78 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -38,10 +38,12 @@ PyAPI_FUNC(PyObject *) PyEval_GetGlobals(void); PyAPI_FUNC(PyObject *) PyEval_GetLocals(void); PyAPI_FUNC(struct _frame *) PyEval_GetFrame(void); +#ifndef Py_LIMITED_API +/* Helper to look up a builtin object */ +PyAPI_FUNC(PyObject *) _PyEval_GetBuiltinId(_Py_Identifier *); /* Look at the current frame's (if any) code's co_flags, and turn on the corresponding compiler flags in cf->cf_flags. Return 1 if any flag was set, else return 0. */ -#ifndef Py_LIMITED_API PyAPI_FUNC(int) PyEval_MergeCompilerFlags(PyCompilerFlags *cf); #endif diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-09-13-09-39.bpo-35444.9kYn4V.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-09-13-09-39.bpo-35444.9kYn4V.rst new file mode 100644 index 00000000000000..22c3969f12762a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-12-09-13-09-39.bpo-35444.9kYn4V.rst @@ -0,0 +1,2 @@ +Fixed error handling in pickling methods when fail to look up builtin +"getattr". diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 8c8163560f1188..41b8fa7b3c2902 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -200,19 +200,15 @@ _Pickle_ClearState(PickleState *st) static int _Pickle_InitState(PickleState *st) { - PyObject *builtins; PyObject *copyreg = NULL; PyObject *compat_pickle = NULL; PyObject *codecs = NULL; PyObject *functools = NULL; + _Py_IDENTIFIER(getattr); - builtins = PyEval_GetBuiltins(); - if (builtins == NULL) - goto error; - st->getattr = PyDict_GetItemString(builtins, "getattr"); + st->getattr = _PyEval_GetBuiltinId(&PyId_getattr); if (st->getattr == NULL) goto error; - Py_INCREF(st->getattr); copyreg = PyImport_ImportModule("copyreg"); if (!copyreg) diff --git a/Objects/classobject.c b/Objects/classobject.c index b0ed02305695da..7071016d06b9dd 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -75,8 +75,6 @@ method_reduce(PyMethodObject *im) { PyObject *self = PyMethod_GET_SELF(im); PyObject *func = PyMethod_GET_FUNCTION(im); - PyObject *builtins; - PyObject *getattr; PyObject *funcname; _Py_IDENTIFIER(getattr); @@ -84,9 +82,8 @@ method_reduce(PyMethodObject *im) if (funcname == NULL) { return NULL; } - builtins = PyEval_GetBuiltins(); - getattr = _PyDict_GetItemId(builtins, &PyId_getattr); - return Py_BuildValue("O(ON)", getattr, self, funcname); + return Py_BuildValue("N(ON)", _PyEval_GetBuiltinId(&PyId_getattr), + self, funcname); } static PyMethodDef method_methods[] = { diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 9d258cf111d166..e897b10926164a 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -389,14 +389,9 @@ descr_get_qualname(PyDescrObject *descr, void *Py_UNUSED(ignored)) static PyObject * descr_reduce(PyDescrObject *descr) { - PyObject *builtins; - PyObject *getattr; _Py_IDENTIFIER(getattr); - - builtins = PyEval_GetBuiltins(); - getattr = _PyDict_GetItemId(builtins, &PyId_getattr); - return Py_BuildValue("O(OO)", getattr, PyDescr_TYPE(descr), - PyDescr_NAME(descr)); + return Py_BuildValue("N(OO)", _PyEval_GetBuiltinId(&PyId_getattr), + PyDescr_TYPE(descr), PyDescr_NAME(descr)); } static PyMethodDef descr_methods[] = { @@ -1098,13 +1093,9 @@ wrapper_repr(wrapperobject *wp) static PyObject * wrapper_reduce(wrapperobject *wp) { - PyObject *builtins; - PyObject *getattr; _Py_IDENTIFIER(getattr); - - builtins = PyEval_GetBuiltins(); - getattr = _PyDict_GetItemId(builtins, &PyId_getattr); - return Py_BuildValue("O(OO)", getattr, wp->self, PyDescr_NAME(wp->descr)); + return Py_BuildValue("N(OO)", _PyEval_GetBuiltinId(&PyId_getattr), + wp->self, PyDescr_NAME(wp->descr)); } static PyMethodDef wrapper_methods[] = { diff --git a/Objects/methodobject.c b/Objects/methodobject.c index fe52545667f2ed..6794bf21d9977e 100644 --- a/Objects/methodobject.c +++ b/Objects/methodobject.c @@ -320,16 +320,13 @@ meth_dealloc(PyCFunctionObject *m) static PyObject * meth_reduce(PyCFunctionObject *m) { - PyObject *builtins; - PyObject *getattr; _Py_IDENTIFIER(getattr); if (m->m_self == NULL || PyModule_Check(m->m_self)) return PyUnicode_FromString(m->m_ml->ml_name); - builtins = PyEval_GetBuiltins(); - getattr = _PyDict_GetItemId(builtins, &PyId_getattr); - return Py_BuildValue("O(Os)", getattr, m->m_self, m->m_ml->ml_name); + return Py_BuildValue("N(Os)", _PyEval_GetBuiltinId(&PyId_getattr), + m->m_self, m->m_ml->ml_name); } static PyMethodDef meth_methods[] = { diff --git a/Python/ceval.c b/Python/ceval.c index 36e966470dba54..0b30cc1d48d181 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4667,6 +4667,20 @@ PyEval_GetBuiltins(void) return current_frame->f_builtins; } +/* Convenience function to get a builtin from its name */ +PyObject * +_PyEval_GetBuiltinId(_Py_Identifier *name) +{ + PyObject *attr = _PyDict_GetItemIdWithError(PyEval_GetBuiltins(), name); + if (attr) { + Py_INCREF(attr); + } + else if (!PyErr_Occurred()) { + PyErr_SetObject(PyExc_AttributeError, _PyUnicode_FromId(name)); + } + return attr; +} + PyObject * PyEval_GetLocals(void) { From 7d9f21950927e7c7fe69e5edeb06023a963c6f68 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 11 Dec 2018 02:17:37 -0800 Subject: [PATCH 2092/2287] [3.6] bpo-33747: Avoid mutating the global sys.modules dict in unittest.mock tests (GH-8520) (GH-11032) (cherry picked from commit 3cf74384b53b998fa846dc2590cedf9ad2a0d5fd) Co-authored-by: Anirudha Bose https://bugs.python.org/issue33747 --- Lib/unittest/test/testmock/testpatch.py | 27 +++++++++++++++---------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/Lib/unittest/test/testmock/testpatch.py b/Lib/unittest/test/testmock/testpatch.py index fe4ecefd44058a..f05225730dafb2 100644 --- a/Lib/unittest/test/testmock/testpatch.py +++ b/Lib/unittest/test/testmock/testpatch.py @@ -9,6 +9,7 @@ from unittest.test.testmock import support from unittest.test.testmock.support import SomeClass, is_instance +from test.test_importlib.util import uncache from unittest.mock import ( NonCallableMock, CallableMixin, sentinel, MagicMock, Mock, NonCallableMagicMock, patch, _patch, @@ -1660,20 +1661,19 @@ def test_mock_calls_with_patch(self): def test_patch_imports_lazily(self): - sys.modules.pop('squizz', None) - p1 = patch('squizz.squozz') self.assertRaises(ImportError, p1.start) - squizz = Mock() - squizz.squozz = 6 - sys.modules['squizz'] = squizz - p1 = patch('squizz.squozz') - squizz.squozz = 3 - p1.start() - p1.stop() - self.assertEqual(squizz.squozz, 3) + with uncache('squizz'): + squizz = Mock() + sys.modules['squizz'] = squizz + squizz.squozz = 6 + p1 = patch('squizz.squozz') + squizz.squozz = 3 + p1.start() + p1.stop() + self.assertEqual(squizz.squozz, 3) def test_patch_propogrates_exc_on_exit(self): class holder: @@ -1696,7 +1696,12 @@ def with_custom_patch(target): def test(mock): raise RuntimeError - self.assertRaises(RuntimeError, test) + with uncache('squizz'): + squizz = Mock() + sys.modules['squizz'] = squizz + + self.assertRaises(RuntimeError, test) + self.assertIs(holder.exc_info[0], RuntimeError) self.assertIsNotNone(holder.exc_info[1], 'exception value not propgated') From 869e23e0af806ed3a10d0484827cb1b5f5cd5e5f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 11 Dec 2018 03:56:50 -0800 Subject: [PATCH 2093/2287] bpo-35426: Eliminate race condition in test_interprocess_signal (GH-11087) The test only except SIGUSR1Exception inside wait_signal(), but the signal can be sent during subprocess_send_signal() call. (cherry picked from commit 2ab2afd387084ba38a37f5944fcb0675113b64dc) Co-authored-by: Pablo Galindo --- Lib/test/signalinterproctester.py | 40 ++++++++++++++----------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/Lib/test/signalinterproctester.py b/Lib/test/signalinterproctester.py index 877be517c0ea85..168b5da0f2c0f9 100644 --- a/Lib/test/signalinterproctester.py +++ b/Lib/test/signalinterproctester.py @@ -21,25 +21,19 @@ def sigusr1_handler(self, signum, frame): self.got_signals['SIGUSR1'] += 1 raise SIGUSR1Exception - def wait_signal(self, child, signame, exc_class=None): - try: - if child is not None: - # This wait should be interrupted by exc_class - # (if set) - child.wait() - - timeout = 10.0 - deadline = time.monotonic() + timeout - - while time.monotonic() < deadline: - if self.got_signals[signame]: - return - signal.pause() - except BaseException as exc: - if exc_class is not None and isinstance(exc, exc_class): - # got the expected exception + def wait_signal(self, child, signame): + if child is not None: + # This wait should be interrupted by exc_class + # (if set) + child.wait() + + timeout = 10.0 + deadline = time.monotonic() + timeout + + while time.monotonic() < deadline: + if self.got_signals[signame]: return - raise + signal.pause() self.fail('signal %s not received after %s seconds' % (signame, timeout)) @@ -65,8 +59,9 @@ def test_interprocess_signal(self): self.assertEqual(self.got_signals, {'SIGHUP': 1, 'SIGUSR1': 0, 'SIGALRM': 0}) - with self.subprocess_send_signal(pid, "SIGUSR1") as child: - self.wait_signal(child, 'SIGUSR1', SIGUSR1Exception) + with self.assertRaises(SIGUSR1Exception): + with self.subprocess_send_signal(pid, "SIGUSR1") as child: + self.wait_signal(child, 'SIGUSR1') self.assertEqual(self.got_signals, {'SIGHUP': 1, 'SIGUSR1': 1, 'SIGALRM': 0}) @@ -75,8 +70,9 @@ def test_interprocess_signal(self): child.wait() try: - signal.alarm(1) - self.wait_signal(None, 'SIGALRM', KeyboardInterrupt) + with self.assertRaises(KeyboardInterrupt): + signal.alarm(1) + self.wait_signal(None, 'SIGALRM') self.assertEqual(self.got_signals, {'SIGHUP': 1, 'SIGUSR1': 1, 'SIGALRM': 0}) finally: From 97568761a6adb64d750fb0ea68484f67ae5e54f7 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 11 Dec 2018 04:22:53 -0800 Subject: [PATCH 2094/2287] bpo-35412: Skip test_multiprocessing_fork and test_multiprocessing_forkserver on Windows (GH-11086) Forkserver and fork are not available on Windows and therefore these test must be skipped. (cherry picked from commit a932d0b496767b5aac14191cbc17093e502b6cb4) Co-authored-by: Pablo Galindo --- Lib/test/test_multiprocessing_fork.py | 3 +++ Lib/test/test_multiprocessing_forkserver.py | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/Lib/test/test_multiprocessing_fork.py b/Lib/test/test_multiprocessing_fork.py index daadcd3cc3124a..5000edb7c5c299 100644 --- a/Lib/test/test_multiprocessing_fork.py +++ b/Lib/test/test_multiprocessing_fork.py @@ -7,6 +7,9 @@ if support.PGO: raise unittest.SkipTest("test is not helpful for PGO") +if sys.platform == "win32": + raise unittest.SkipTest("fork is not available on Windows") + if sys.platform == 'darwin': raise unittest.SkipTest("test may crash on macOS (bpo-33725)") diff --git a/Lib/test/test_multiprocessing_forkserver.py b/Lib/test/test_multiprocessing_forkserver.py index 407bb3f9b694c8..6ad5faf9e8a329 100644 --- a/Lib/test/test_multiprocessing_forkserver.py +++ b/Lib/test/test_multiprocessing_forkserver.py @@ -1,11 +1,15 @@ import unittest import test._test_multiprocessing +import sys from test import support if support.PGO: raise unittest.SkipTest("test is not helpful for PGO") +if sys.platform == "win32": + raise unittest.SkipTest("forkserver is not available on Windows") + test._test_multiprocessing.install_tests_in_module_dict(globals(), 'forkserver') if __name__ == '__main__': From 56f86fcc44f7d74c68b6fa508328d61ce973eebc Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Mon, 10 Dec 2018 22:05:14 -0500 Subject: [PATCH 2095/2287] macOS installer build: mitigate hdiutil resource busy bug --- Mac/BuildScript/build-installer.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index b1dede492058b6..6fc07ad3d3d1b1 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -1533,16 +1533,27 @@ def buildDMG(): imagepath = imagepath + '.dmg' os.mkdir(outdir) + + # Try to mitigate race condition in certain versions of macOS, e.g. 10.9, + # when hdiutil create fails with "Resource busy". For now, just retry + # the create a few times and hope that it eventually works. + volname='Python %s'%(getFullVersion()) - runCommand("hdiutil create -format UDRW -volname %s -srcfolder %s %s"%( + cmd = ("hdiutil create -format UDRW -volname %s -srcfolder %s -size 100m %s"%( shellQuote(volname), shellQuote(os.path.join(WORKDIR, 'installer')), shellQuote(imagepath + ".tmp.dmg" ))) - - # Try to mitigate race condition in certain versions of macOS, e.g. 10.9, - # when hdiutil fails with "Resource busy" - - time.sleep(10) + for i in range(5): + fd = os.popen(cmd, 'r') + data = fd.read() + xit = fd.close() + if not xit: + break + sys.stdout.write(data) + print(" -- retrying hdiutil create") + time.sleep(5) + else: + raise RuntimeError("command failed: %s"%(commandline,)) if not os.path.exists(os.path.join(WORKDIR, "mnt")): os.mkdir(os.path.join(WORKDIR, "mnt")) From 2c1c4a54a866a5c3d1ec44461d2ebc2e4e06d9d2 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 11 Dec 2018 16:03:42 -0500 Subject: [PATCH 2096/2287] Update macOS installer Welcome for 3.6.8 --- Mac/BuildScript/resources/Welcome.rtf | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Mac/BuildScript/resources/Welcome.rtf b/Mac/BuildScript/resources/Welcome.rtf index f55172ec606a43..5cd936add27773 100644 --- a/Mac/BuildScript/resources/Welcome.rtf +++ b/Mac/BuildScript/resources/Welcome.rtf @@ -1,5 +1,6 @@ {\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf100 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 Helvetica-Bold;} +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 Helvetica-Bold;\f2\fmodern\fcharset0 CourierNewPSMT; +} {\colortbl;\red255\green255\blue255;} {\*\expandedcolortbl;;} \paperw11905\paperh16837\margl1440\margr1440\vieww12200\viewh10880\viewkind0 @@ -18,6 +19,10 @@ \f1\b IDLE \f0\b0 .\ \ +At the end of this install, click on +\f2 Install Certificates +\f0 for SSL root certificates\ +\ \f1\b NEW in 3.6.5: \f0\b0 two installer variants (10.9+ 64-bit-only, 10.6+ 64-/32-bit), built-in Tcl/Tk 8.6 support in the 10.9+ variant (no additional third-party downloads!)\ From d23e1eae0dd5b236de20bc933563826f48828580 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 11 Dec 2018 16:28:57 -0500 Subject: [PATCH 2097/2287] Minor edits to NEWS entries --- .../next/Library/2018-12-06-00-31-25.bpo-34172.l7CIYt.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2018-12-06-00-31-25.bpo-34172.l7CIYt.rst b/Misc/NEWS.d/next/Library/2018-12-06-00-31-25.bpo-34172.l7CIYt.rst index e467cc96782591..fd4d2dc81aedb5 100644 --- a/Misc/NEWS.d/next/Library/2018-12-06-00-31-25.bpo-34172.l7CIYt.rst +++ b/Misc/NEWS.d/next/Library/2018-12-06-00-31-25.bpo-34172.l7CIYt.rst @@ -1,3 +1,5 @@ -REVERT: Fix a reference issue inside multiprocessing.Pool that caused the +Revert the fix for this issue previously released in 3.6.7 pending +further investigation: +Fix a reference issue inside multiprocessing.Pool that caused the pool to remain alive if it was deleted without being closed or terminated explicitly. From cc3e73212aa1b197f2f8ed636e0ecf73caaea302 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 11 Dec 2018 16:47:14 -0500 Subject: [PATCH 2098/2287] 3.6.8rc1 --- Include/patchlevel.h | 8 +- Lib/pydoc_data/topics.py | 196 ++-- Misc/NEWS.d/3.6.8rc1.rst | 879 ++++++++++++++++++ .../2017-09-08-11-48-11.bpo-31354.4f-VJK.rst | 1 - .../2017-09-28-23-21-20.bpo-31625.Bb2NXr.rst | 1 - .../2018-08-24-09-48-25.bpo-33015.s21y74.rst | 3 - .../2018-10-16-12-22-36.bpo-28015.ylSgFh.rst | 1 - .../2018-10-17-17-38-57.bpo-35011.GgoPIC.rst | 4 - .../2018-11-01-15-01-23.bpo-35139.XZTttb.rst | 1 - .../2018-12-04-15-33-28.bpo-35351.ZhhBfT.rst | 2 - .../2018-09-11-15-19-37.bpo-1621.7o19yG.rst | 2 - .../2018-09-27-11-10-02.bpo-34824.VLlCaU.rst | 2 - .../2018-10-13-16-42-03.bpo-34973.B5M-3g.rst | 2 - .../2018-10-13-22-24-19.bpo-34974.7LgTc2.rst | 3 - .../2018-10-23-15-03-53.bpo-35050.49wraS.rst | 1 - .../2018-10-25-20-53-32.bpo-29341.jH-AMF.rst | 2 - .../2018-11-08-23-00-04.bpo-35193.WK2PDg.rst | 3 - .../2018-11-12-11-38-06.bpo-35214.PCHKbX.rst | 4 - .../2018-11-13-00-40-35.bpo-35214.OQBjph.rst | 3 - .../2018-11-20-22-33-38.bpo-33954.RzSngM.rst | 3 - .../2018-12-01-19-20-53.bpo-35372.RwVJjZ.rst | 2 - .../2018-12-03-21-20-24.bpo-35357.rhhoiC.rst | 4 - .../2018-12-07-02-38-01.bpo-35436.0VW7p9.rst | 2 - .../2018-12-09-13-09-39.bpo-35444.9kYn4V.rst | 2 - .../2018-02-05-15-05-53.bpo-32613.TDjgM1.rst | 2 - .../2018-05-21-14-36-12.bpo-33594.-HRcyX.rst | 3 - .../2018-10-13-07-39-57.bpo-34967.E40tFP.rst | 2 - .../2018-10-21-02-20-36.bpo-35035.4zBObK.rst | 1 - .../2018-10-25-17-45-09.bpo-35038.2eVOYS.rst | 2 - .../2018-10-28-16-51-31.bpo-35089._stCpS.rst | 2 - .../2018-10-28-00-08-42.bpo-35087.G7gx2-.rst | 2 - .../2018-10-28-00-54-32.bpo-35088.r1lJZd.rst | 2 - .../2018-10-28-15-53-51.bpo-35093.cH-tli.rst | 2 - .../2018-10-28-20-17-14.bpo-35097.07tm66.rst | 2 - .../2018-11-05-20-43-08.bpo-35099.SVOZXC.rst | 3 - .../2018-11-05-23-23-00.bpo-23220.H3SAWE.rst | 1 - .../2018-11-06-23-10-54.bpo-33000.pQasCt.rst | 2 - .../2018-11-10-09-10-54.bpo-35202.TeJJrt.rst | 1 - .../2018-11-10-21-27-25.bpo-34864.Ci-G2q.rst | 3 - .../2018-11-11-17-13-50.bpo-34864.cw0PvO.rst | 2 - .../2018-11-12-00-20-01.bpo-35213.cqNgzT.rst | 1 - .../2017-10-12-22-39-55.bpo-22005.lGP-sc.rst | 3 - .../2017-12-16-11-40-52.bpo-29877.SfWhmz.rst | 2 - .../2018-07-24-16-37-40.bpo-34052.VbbFAE.rst | 7 - .../2018-09-04-09-32-54.bpo-34574.X4RwYI.rst | 2 - .../2018-09-07-10-16-34.bpo-34604.xL7-kG.rst | 3 - .../2018-09-14-10-38-18.bpo-31177.Sv91TN.rst | 2 - .../2018-09-19-16-51-04.bpo-34738.Pr3-iG.rst | 2 - .../2018-10-03-11-07-28.bpo-34866.ML6KpJ.rst | 2 - .../2018-10-05-05-55-53.bpo-34900.8RNiFu.rst | 2 - .../2018-10-08-21-05-11.bpo-34936.3tRqdq.rst | 2 - .../2018-10-09-14-42-16.bpo-34941.1Q5QKv.rst | 3 - .../2018-10-12-18-57-52.bpo-34966.WZeBHO.rst | 3 - .../2018-10-12-20-30-42.bpo-16965.xo5LAr.rst | 2 - .../2018-10-17-11-00-00.bpo-23420.Lq74Uu.rst | 2 - .../2018-10-17-11-54-04.bpo-35008.dotef_.rst | 3 - .../2018-10-21-14-53-19.bpo-34794.yt3R4-.rst | 2 - .../2018-10-25-09-37-03.bpo-31047.kBbX8r.rst | 2 - .../2018-10-26-00-11-21.bpo-35017.6Ez4Cv.rst | 3 - .../2018-10-26-22-53-16.bpo-35079.Tm5jvF.rst | 2 - .../2018-10-29-23-09-24.bpo-35062.dQS1ng.rst | 2 - .../2018-11-09-13-35-36.bpo-35189.gog-sl.rst | 2 - .../2018-11-15-07-14-32.bpo-35226.wJPEEe.rst | 3 - .../2018-11-19-07-22-04.bpo-35277.dsD-2E.rst | 1 - .../2018-11-20-13-34-01.bpo-28604.iiih5h.rst | 3 - .../2018-11-29-12-14-04.bpo-27903.ia8xgT.rst | 2 - .../2018-12-01-13-44-12.bpo-35371.fTAwlX.rst | 2 - .../2018-12-03-14-41-11.bpo-35380.SdRF9l.rst | 1 - .../2018-12-03-19-45-00.bpo-35310.9k28gR.rst | 4 - .../2018-12-05-13-37-39.bpo-10496.VH-1Lp.rst | 5 - .../2018-12-06-00-31-25.bpo-34172.l7CIYt.rst | 5 - .../2018-12-06-00-43-13.bpo-35330.abB4BN.rst | 4 - .../2018-12-10-09-48-27.bpo-35052.xE1ymg.rst | 2 - .../2018-09-24-18-49-25.bpo-34791.78GmIG.rst | 3 - .../2018-11-23-15-00-23.bpo-34812.84VQnb.rst | 4 - .../2018-10-27-13-41-55.bpo-34279.v0Xqxe.rst | 3 - .../2018-11-04-20-17-09.bpo-21263.T3qo9r.rst | 4 - .../2018-11-26-16-54-21.bpo-35317.jByGP2.rst | 3 - .../2018-11-30-17-18-56.bpo-35352.8bD7GC.rst | 1 - .../2018-12-09-01-27-29.bpo-33725.TaGayj.rst | 2 - .../2018-10-15-13-22-28.bpo-34989.hU4fra.rst | 2 - .../2018-03-08-20-02-38.bpo-32890.3jzFzY.rst | 2 - .../2018-12-10-15-01-13.bpo-35401.9L1onG.rst | 1 - .../2018-10-17-14-36-08.bpo-24658.Naddgx.rst | 1 - .../2018-10-18-23-54-55.bpo-35025.X4LFJg.rst | 2 - .../2018-12-10-02-37-11.bpo-35401.sFhD5z.rst | 1 - .../2018-12-10-02-44-48.bpo-35402.xzn8qJ.rst | 1 - .../2018-12-11-02-50-35.bpo-15663.6tnyd2.rst | 2 - README.rst | 4 +- configure | 15 +- 90 files changed, 980 insertions(+), 320 deletions(-) create mode 100644 Misc/NEWS.d/3.6.8rc1.rst delete mode 100644 Misc/NEWS.d/next/Build/2017-09-08-11-48-11.bpo-31354.4f-VJK.rst delete mode 100644 Misc/NEWS.d/next/Build/2017-09-28-23-21-20.bpo-31625.Bb2NXr.rst delete mode 100644 Misc/NEWS.d/next/Build/2018-08-24-09-48-25.bpo-33015.s21y74.rst delete mode 100644 Misc/NEWS.d/next/Build/2018-10-16-12-22-36.bpo-28015.ylSgFh.rst delete mode 100644 Misc/NEWS.d/next/Build/2018-10-17-17-38-57.bpo-35011.GgoPIC.rst delete mode 100644 Misc/NEWS.d/next/Build/2018-11-01-15-01-23.bpo-35139.XZTttb.rst delete mode 100644 Misc/NEWS.d/next/Build/2018-12-04-15-33-28.bpo-35351.ZhhBfT.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-09-11-15-19-37.bpo-1621.7o19yG.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-09-27-11-10-02.bpo-34824.VLlCaU.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-10-13-16-42-03.bpo-34973.B5M-3g.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-10-13-22-24-19.bpo-34974.7LgTc2.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-10-23-15-03-53.bpo-35050.49wraS.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-10-25-20-53-32.bpo-29341.jH-AMF.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-11-08-23-00-04.bpo-35193.WK2PDg.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-11-12-11-38-06.bpo-35214.PCHKbX.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-11-13-00-40-35.bpo-35214.OQBjph.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-11-20-22-33-38.bpo-33954.RzSngM.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-12-01-19-20-53.bpo-35372.RwVJjZ.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-12-03-21-20-24.bpo-35357.rhhoiC.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-12-07-02-38-01.bpo-35436.0VW7p9.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-12-09-13-09-39.bpo-35444.9kYn4V.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2018-02-05-15-05-53.bpo-32613.TDjgM1.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2018-05-21-14-36-12.bpo-33594.-HRcyX.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2018-10-13-07-39-57.bpo-34967.E40tFP.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2018-10-21-02-20-36.bpo-35035.4zBObK.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2018-10-25-17-45-09.bpo-35038.2eVOYS.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2018-10-28-16-51-31.bpo-35089._stCpS.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2018-10-28-00-08-42.bpo-35087.G7gx2-.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2018-10-28-00-54-32.bpo-35088.r1lJZd.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2018-10-28-15-53-51.bpo-35093.cH-tli.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2018-10-28-20-17-14.bpo-35097.07tm66.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2018-11-05-20-43-08.bpo-35099.SVOZXC.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2018-11-05-23-23-00.bpo-23220.H3SAWE.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2018-11-06-23-10-54.bpo-33000.pQasCt.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2018-11-10-09-10-54.bpo-35202.TeJJrt.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2018-11-10-21-27-25.bpo-34864.Ci-G2q.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2018-11-11-17-13-50.bpo-34864.cw0PvO.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2018-11-12-00-20-01.bpo-35213.cqNgzT.rst delete mode 100644 Misc/NEWS.d/next/Library/2017-10-12-22-39-55.bpo-22005.lGP-sc.rst delete mode 100644 Misc/NEWS.d/next/Library/2017-12-16-11-40-52.bpo-29877.SfWhmz.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-07-24-16-37-40.bpo-34052.VbbFAE.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-09-04-09-32-54.bpo-34574.X4RwYI.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-09-07-10-16-34.bpo-34604.xL7-kG.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-09-14-10-38-18.bpo-31177.Sv91TN.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-09-19-16-51-04.bpo-34738.Pr3-iG.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-10-03-11-07-28.bpo-34866.ML6KpJ.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-10-05-05-55-53.bpo-34900.8RNiFu.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-10-08-21-05-11.bpo-34936.3tRqdq.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-10-09-14-42-16.bpo-34941.1Q5QKv.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-10-12-18-57-52.bpo-34966.WZeBHO.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-10-12-20-30-42.bpo-16965.xo5LAr.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-10-17-11-00-00.bpo-23420.Lq74Uu.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-10-17-11-54-04.bpo-35008.dotef_.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-10-21-14-53-19.bpo-34794.yt3R4-.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-10-25-09-37-03.bpo-31047.kBbX8r.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-10-26-00-11-21.bpo-35017.6Ez4Cv.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-10-26-22-53-16.bpo-35079.Tm5jvF.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-10-29-23-09-24.bpo-35062.dQS1ng.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-11-09-13-35-36.bpo-35189.gog-sl.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-11-15-07-14-32.bpo-35226.wJPEEe.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-11-19-07-22-04.bpo-35277.dsD-2E.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-11-20-13-34-01.bpo-28604.iiih5h.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-11-29-12-14-04.bpo-27903.ia8xgT.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-12-01-13-44-12.bpo-35371.fTAwlX.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-12-03-14-41-11.bpo-35380.SdRF9l.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-12-03-19-45-00.bpo-35310.9k28gR.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-12-05-13-37-39.bpo-10496.VH-1Lp.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-12-06-00-31-25.bpo-34172.l7CIYt.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-12-06-00-43-13.bpo-35330.abB4BN.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-12-10-09-48-27.bpo-35052.xE1ymg.rst delete mode 100644 Misc/NEWS.d/next/Security/2018-09-24-18-49-25.bpo-34791.78GmIG.rst delete mode 100644 Misc/NEWS.d/next/Security/2018-11-23-15-00-23.bpo-34812.84VQnb.rst delete mode 100644 Misc/NEWS.d/next/Tests/2018-10-27-13-41-55.bpo-34279.v0Xqxe.rst delete mode 100644 Misc/NEWS.d/next/Tests/2018-11-04-20-17-09.bpo-21263.T3qo9r.rst delete mode 100644 Misc/NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst delete mode 100644 Misc/NEWS.d/next/Tests/2018-11-30-17-18-56.bpo-35352.8bD7GC.rst delete mode 100644 Misc/NEWS.d/next/Tests/2018-12-09-01-27-29.bpo-33725.TaGayj.rst delete mode 100644 Misc/NEWS.d/next/Tools-Demos/2018-10-15-13-22-28.bpo-34989.hU4fra.rst delete mode 100644 Misc/NEWS.d/next/Windows/2018-03-08-20-02-38.bpo-32890.3jzFzY.rst delete mode 100644 Misc/NEWS.d/next/Windows/2018-12-10-15-01-13.bpo-35401.9L1onG.rst delete mode 100644 Misc/NEWS.d/next/macOS/2018-10-17-14-36-08.bpo-24658.Naddgx.rst delete mode 100644 Misc/NEWS.d/next/macOS/2018-10-18-23-54-55.bpo-35025.X4LFJg.rst delete mode 100644 Misc/NEWS.d/next/macOS/2018-12-10-02-37-11.bpo-35401.sFhD5z.rst delete mode 100644 Misc/NEWS.d/next/macOS/2018-12-10-02-44-48.bpo-35402.xzn8qJ.rst delete mode 100644 Misc/NEWS.d/next/macOS/2018-12-11-02-50-35.bpo-15663.6tnyd2.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 1d12db3b560751..a0b45a3109d202 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -18,12 +18,12 @@ /*--start constants--*/ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 6 -#define PY_MICRO_VERSION 7 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL -#define PY_RELEASE_SERIAL 0 +#define PY_MICRO_VERSION 8 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA +#define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.6.7+" +#define PY_VERSION "3.6.8rc1" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 9dc4a716208988..2d34529e813b1b 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Sat Oct 20 01:13:41 2018 +# Autogenerated by Sphinx on Tue Dec 11 16:32:37 2018 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -26,7 +26,8 @@ 'implementation, the built-in variable "__debug__" is "True" under\n' 'normal circumstances, "False" when optimization is requested ' '(command\n' - 'line option -O). The current code generator emits no code for an\n' + 'line option "-O"). The current code generator emits no code for ' + 'an\n' 'assert statement when optimization is requested at compile time. ' 'Note\n' 'that it is unnecessary to include the source code for the ' @@ -87,23 +88,16 @@ 'parentheses or square brackets, is recursively defined as ' 'follows.\n' '\n' - '* If the target list is empty: The object must also be an ' - 'empty\n' - ' iterable.\n' - '\n' - '* If the target list is a single target in parentheses: The ' - 'object\n' - ' is assigned to that target.\n' + '* If the target list is a single target with no trailing ' + 'comma,\n' + ' optionally in parentheses, the object is assigned to that ' + 'target.\n' '\n' - '* If the target list is a comma-separated list of targets, or ' - 'a\n' - ' single target in square brackets: The object must be an ' - 'iterable\n' - ' with the same number of items as there are targets in the ' - 'target\n' - ' list, and the items are assigned, from left to right, to ' - 'the\n' - ' corresponding targets.\n' + '* Else: The object must be an iterable with the same number of ' + 'items\n' + ' as there are targets in the target list, and the items are ' + 'assigned,\n' + ' from left to right, to the corresponding targets.\n' '\n' ' * If the target list contains one target prefixed with an\n' ' asterisk, called a “starred” target: The object must be ' @@ -400,9 +394,21 @@ 'the last\n' '"__setitem__()" or "__setattr__()" call.\n' '\n' - 'See also: **PEP 526** - Variable and attribute annotation ' - 'syntax\n' - ' **PEP 484** - Type hints\n', + 'See also:\n' + '\n' + ' **PEP 526** - Syntax for Variable Annotations\n' + ' The proposal that added syntax for annotating the types ' + 'of\n' + ' variables (including class variables and instance ' + 'variables),\n' + ' instead of expressing them through comments.\n' + '\n' + ' **PEP 484** - Type hints\n' + ' The proposal that added the "typing" module to provide a ' + 'standard\n' + ' syntax for type annotations that can be used in static ' + 'analysis\n' + ' tools and IDEs.\n', 'atom-identifiers': 'Identifiers (Names)\n' '*******************\n' '\n' @@ -1176,7 +1182,7 @@ 'is\n' 'returned.\n' '\n' - '(Note that neither "and" nor "or" restrict the value and type ' + 'Note that neither "and" nor "or" restrict the value and type ' 'they\n' 'return to "False" and "True", but rather return the last ' 'evaluated\n' @@ -1442,7 +1448,7 @@ 'original global namespace. (Usually, the suite contains mostly\n' 'function definitions.) When the class’s suite finishes execution, ' 'its\n' - 'execution frame is discarded but its local namespace is saved. [4] ' + 'execution frame is discarded but its local namespace is saved. [3] ' 'A\n' 'class object is then created using the inheritance list for the ' 'base\n' @@ -1492,8 +1498,18 @@ 'unexpected results. Descriptors can be used to create instance\n' 'variables with different implementation details.\n' '\n' - 'See also: **PEP 3115** - Metaclasses in Python 3 **PEP 3129** -\n' - ' Class Decorators\n', + 'See also:\n' + '\n' + ' **PEP 3115** - Metaclasses in Python 3000\n' + ' The proposal that changed the declaration of metaclasses to ' + 'the\n' + ' current syntax, and the semantics for how classes with\n' + ' metaclasses are constructed.\n' + '\n' + ' **PEP 3129** - Class Decorators\n' + ' The proposal that added class decorators. Function and ' + 'method\n' + ' decorators were introduced in **PEP 318**.\n', 'comparisons': 'Comparisons\n' '***********\n' '\n' @@ -2198,9 +2214,11 @@ 'returning\n' 'from a function that handled an exception.\n' '\n' - 'The optional "else" clause is executed if and when control flows ' - 'off\n' - 'the end of the "try" clause. [2] Exceptions in the "else" clause ' + 'The optional "else" clause is executed if the control flow ' + 'leaves the\n' + '"try" suite, no exception was raised, and no "return", ' + '"continue", or\n' + '"break" statement was executed. Exceptions in the "else" clause ' 'are\n' 'not handled by the preceding "except" clauses.\n' '\n' @@ -2388,7 +2406,7 @@ '\n' 'The function definition does not execute the function body; this ' 'gets\n' - 'executed only when the function is called. [3]\n' + 'executed only when the function is called. [2]\n' '\n' 'A function definition may be wrapped by one or more *decorator*\n' 'expressions. Decorator expressions are evaluated when the ' @@ -2561,7 +2579,7 @@ 'function definitions.) When the class’s suite finishes ' 'execution, its\n' 'execution frame is discarded but its local namespace is saved. ' - '[4] A\n' + '[3] A\n' 'class object is then created using the inheritance list for the ' 'base\n' 'classes and the saved local namespace for the attribute ' @@ -2613,8 +2631,18 @@ 'unexpected results. Descriptors can be used to create instance\n' 'variables with different implementation details.\n' '\n' - 'See also: **PEP 3115** - Metaclasses in Python 3 **PEP 3129** -\n' - ' Class Decorators\n' + 'See also:\n' + '\n' + ' **PEP 3115** - Metaclasses in Python 3000\n' + ' The proposal that changed the declaration of metaclasses to ' + 'the\n' + ' current syntax, and the semantics for how classes with\n' + ' metaclasses are constructed.\n' + '\n' + ' **PEP 3129** - Class Decorators\n' + ' The proposal that added class decorators. Function and ' + 'method\n' + ' decorators were introduced in **PEP 318**.\n' '\n' '\n' 'Coroutines\n' @@ -2731,7 +2759,12 @@ 'an\n' '"async def" function.\n' '\n' - 'See also: **PEP 492** - Coroutines with async and await syntax\n' + 'See also:\n' + '\n' + ' **PEP 492** - Coroutines with async and await syntax\n' + ' The proposal that made coroutines a proper standalone ' + 'concept in\n' + ' Python, and added supporting syntax.\n' '\n' '-[ Footnotes ]-\n' '\n' @@ -2740,16 +2773,11 @@ ' exception. That new exception causes the old one to be ' 'lost.\n' '\n' - '[2] Currently, control “flows off the end” except in the case ' - 'of\n' - ' an exception or the execution of a "return", "continue", or\n' - ' "break" statement.\n' - '\n' - '[3] A string literal appearing as the first statement in the\n' + '[2] A string literal appearing as the first statement in the\n' ' function body is transformed into the function’s "__doc__"\n' ' attribute and therefore the function’s *docstring*.\n' '\n' - '[4] A string literal appearing as the first statement in the ' + '[3] A string literal appearing as the first statement in the ' 'class\n' ' body is transformed into the namespace’s "__doc__" item and\n' ' therefore the class’s *docstring*.\n', @@ -4172,7 +4200,7 @@ 'argument to the interpreter) is a code block. A script command ' '(a\n' 'command specified on the interpreter command line with the ' - '‘**-c**’\n' + '"-c"\n' 'option) is a code block. The string argument passed to the ' 'built-in\n' 'functions "eval()" and "exec()" is a code block.\n' @@ -5188,7 +5216,7 @@ '\n' 'The new format syntax also supports new and different ' 'options, shown\n' - 'in the follow examples.\n' + 'in the following examples.\n' '\n' 'Accessing arguments by position:\n' '\n' @@ -5368,7 +5396,7 @@ '\n' 'The function definition does not execute the function body; this ' 'gets\n' - 'executed only when the function is called. [3]\n' + 'executed only when the function is called. [2]\n' '\n' 'A function definition may be wrapped by one or more *decorator*\n' 'expressions. Decorator expressions are evaluated when the ' @@ -6119,8 +6147,9 @@ 'lambda': 'Lambdas\n' '*******\n' '\n' - ' lambda_expr ::= "lambda" [parameter_list]: expression\n' - ' lambda_expr_nocond ::= "lambda" [parameter_list]: ' + ' lambda_expr ::= "lambda" [parameter_list] ":" ' + 'expression\n' + ' lambda_expr_nocond ::= "lambda" [parameter_list] ":" ' 'expression_nocond\n' '\n' 'Lambda expressions (sometimes called lambda forms) are used to ' @@ -7222,12 +7251,6 @@ 'of the\n' ' sequence.\n' '\n' - 'object.__missing__(self, key)\n' - '\n' - ' Called by "dict"."__getitem__()" to implement ' - '"self[key]" for dict\n' - ' subclasses when key is not in the dictionary.\n' - '\n' 'object.__setitem__(self, key, value)\n' '\n' ' Called to implement assignment to "self[key]". Same ' @@ -7255,6 +7278,12 @@ ' raised for improper *key* values as for the ' '"__getitem__()" method.\n' '\n' + 'object.__missing__(self, key)\n' + '\n' + ' Called by "dict"."__getitem__()" to implement ' + '"self[key]" for dict\n' + ' subclasses when key is not in the dictionary.\n' + '\n' 'object.__iter__(self)\n' '\n' ' This method is called when an iterator is required for ' @@ -8632,8 +8661,8 @@ ' Describes the implicit "__class__" closure reference\n' '\n' '\n' - 'Metaclass example\n' - '-----------------\n' + 'Uses for metaclasses\n' + '--------------------\n' '\n' 'The potential uses for metaclasses are boundless. Some ideas ' 'that have\n' @@ -8643,48 +8672,6 @@ 'frameworks, and\n' 'automatic resource locking/synchronization.\n' '\n' - 'Here is an example of a metaclass that uses an\n' - '"collections.OrderedDict" to remember the order that class ' - 'variables\n' - 'are defined:\n' - '\n' - ' class OrderedClass(type):\n' - '\n' - ' @classmethod\n' - ' def __prepare__(metacls, name, bases, **kwds):\n' - ' return collections.OrderedDict()\n' - '\n' - ' def __new__(cls, name, bases, namespace, **kwds):\n' - ' result = type.__new__(cls, name, bases, ' - 'dict(namespace))\n' - ' result.members = tuple(namespace)\n' - ' return result\n' - '\n' - ' class A(metaclass=OrderedClass):\n' - ' def one(self): pass\n' - ' def two(self): pass\n' - ' def three(self): pass\n' - ' def four(self): pass\n' - '\n' - ' >>> A.members\n' - " ('__module__', 'one', 'two', 'three', 'four')\n" - '\n' - 'When the class definition for *A* gets executed, the process ' - 'begins\n' - 'with calling the metaclass’s "__prepare__()" method which ' - 'returns an\n' - 'empty "collections.OrderedDict". That mapping records the ' - 'methods and\n' - 'attributes of *A* as they are defined within the body of the ' - 'class\n' - 'statement. Once those definitions are executed, the ordered ' - 'dictionary\n' - 'is fully populated and the metaclass’s "__new__()" method ' - 'gets\n' - 'invoked. That method builds the new type and it saves the ' - 'ordered\n' - 'dictionary keys in an attribute called "members".\n' - '\n' '\n' 'Customizing instance and subclass checks\n' '========================================\n' @@ -8884,12 +8871,6 @@ 'the\n' ' sequence.\n' '\n' - 'object.__missing__(self, key)\n' - '\n' - ' Called by "dict"."__getitem__()" to implement "self[key]" ' - 'for dict\n' - ' subclasses when key is not in the dictionary.\n' - '\n' 'object.__setitem__(self, key, value)\n' '\n' ' Called to implement assignment to "self[key]". Same note ' @@ -8917,6 +8898,12 @@ ' raised for improper *key* values as for the ' '"__getitem__()" method.\n' '\n' + 'object.__missing__(self, key)\n' + '\n' + ' Called by "dict"."__getitem__()" to implement "self[key]" ' + 'for dict\n' + ' subclasses when key is not in the dictionary.\n' + '\n' 'object.__iter__(self)\n' '\n' ' This method is called when an iterator is required for a ' @@ -10556,8 +10543,11 @@ 'restored to their previous values (before the call) when returning\n' 'from a function that handled an exception.\n' '\n' - 'The optional "else" clause is executed if and when control flows off\n' - 'the end of the "try" clause. [2] Exceptions in the "else" clause are\n' + 'The optional "else" clause is executed if the control flow leaves ' + 'the\n' + '"try" suite, no exception was raised, and no "return", "continue", ' + 'or\n' + '"break" statement was executed. Exceptions in the "else" clause are\n' 'not handled by the preceding "except" clauses.\n' '\n' 'If "finally" is present, it specifies a ‘cleanup’ handler. The ' diff --git a/Misc/NEWS.d/3.6.8rc1.rst b/Misc/NEWS.d/3.6.8rc1.rst new file mode 100644 index 00000000000000..48d55a0d027d13 --- /dev/null +++ b/Misc/NEWS.d/3.6.8rc1.rst @@ -0,0 +1,879 @@ +.. bpo: 34812 +.. date: 2018-11-23-15-00-23 +.. nonce: 84VQnb +.. release date: 2018-12-11 +.. section: Security + +The :option:`-I` command line option (run Python in isolated mode) is now +also copied by the :mod:`multiprocessing` and :mod:`distutils` modules when +spawning child processes. Previously, only :option:`-E` and :option:`-s` +options (enabled by :option:`-I`) were copied. + +.. + +.. bpo: 34791 +.. date: 2018-09-24-18-49-25 +.. nonce: 78GmIG +.. section: Security + +The xml.sax and xml.dom.domreg no longer use environment variables to +override parser implementations when sys.flags.ignore_environment is set by +-E or -I arguments. + +.. + +.. bpo: 35444 +.. date: 2018-12-09-13-09-39 +.. nonce: 9kYn4V +.. section: Core and Builtins + +Fixed error handling in pickling methods when fail to look up builtin +"getattr". + +.. + +.. bpo: 35436 +.. date: 2018-12-07-02-38-01 +.. nonce: 0VW7p9 +.. section: Core and Builtins + +Fix various issues with memory allocation error handling. Patch by Zackery +Spytz. + +.. + +.. bpo: 35357 +.. date: 2018-12-03-21-20-24 +.. nonce: rhhoiC +.. section: Core and Builtins + +Internal attributes' names of unittest.mock._Call and +unittest.mock.MagicProxy (name, parent & from_kall) are now prefixed with +_mock_ in order to prevent clashes with widely used object attributes. Fixed +minor typo in test function name. + +.. + +.. bpo: 35372 +.. date: 2018-12-01-19-20-53 +.. nonce: RwVJjZ +.. section: Core and Builtins + +Fixed the code page decoder for input longer than 2 GiB containing +undecodable bytes. + +.. + +.. bpo: 33954 +.. date: 2018-11-20-22-33-38 +.. nonce: RzSngM +.. section: Core and Builtins + +For :meth:`str.format`, :meth:`float.__format__` and +:meth:`complex.__format__` methods for non-ASCII decimal point when using +the "n" formatter. + +.. + +.. bpo: 35214 +.. date: 2018-11-13-00-40-35 +.. nonce: OQBjph +.. section: Core and Builtins + +Fixed an out of bounds memory access when parsing a truncated unicode escape +sequence at the end of a string such as ``'\N'``. It would read one byte +beyond the end of the memory allocation. + +.. + +.. bpo: 35214 +.. date: 2018-11-12-11-38-06 +.. nonce: PCHKbX +.. section: Core and Builtins + +The interpreter and extension modules have had annotations added so that +they work properly under clang's Memory Sanitizer. A new configure flag +--with-memory-sanitizer has been added to make test builds of this nature +easier to perform. + +.. + +.. bpo: 35193 +.. date: 2018-11-08-23-00-04 +.. nonce: WK2PDg +.. section: Core and Builtins + +Fix an off by one error in the bytecode peephole optimizer where it could +read bytes beyond the end of bounds of an array when removing unreachable +code. This bug was present in every release of Python 3.6 until now. + +.. + +.. bpo: 29341 +.. date: 2018-10-25-20-53-32 +.. nonce: jH-AMF +.. section: Core and Builtins + +Clarify in the docstrings of :mod:`os` methods that path-like objects are +also accepted as input parameters. + +.. + +.. bpo: 35050 +.. date: 2018-10-23-15-03-53 +.. nonce: 49wraS +.. section: Core and Builtins + +:mod:`socket`: Fix off-by-one bug in length check for ``AF_ALG`` name and +type. + +.. + +.. bpo: 34974 +.. date: 2018-10-13-22-24-19 +.. nonce: 7LgTc2 +.. section: Core and Builtins + +:class:`bytes` and :class:`bytearray` constructors no longer convert +unexpected exceptions (e.g. :exc:`MemoryError` and :exc:`KeyboardInterrupt`) +to :exc:`TypeError`. + +.. + +.. bpo: 34973 +.. date: 2018-10-13-16-42-03 +.. nonce: B5M-3g +.. section: Core and Builtins + +Fixed crash in :func:`bytes` when the :class:`list` argument is mutated +while it is iterated. + +.. + +.. bpo: 34824 +.. date: 2018-09-27-11-10-02 +.. nonce: VLlCaU +.. section: Core and Builtins + +Fix a possible null pointer dereference in Modules/_ssl.c. Patch by Zackery +Spytz. + +.. + +.. bpo: 1621 +.. date: 2018-09-11-15-19-37 +.. nonce: 7o19yG +.. section: Core and Builtins + +Do not assume signed integer overflow behavior (C undefined behavior) when +performing set hash table resizing. + +.. + +.. bpo: 35052 +.. date: 2018-12-10-09-48-27 +.. nonce: xE1ymg +.. section: Library + +Fix xml.dom.minidom cloneNode() on a document with an entity: pass the +correct arguments to the user data handler of an entity. + +.. + +.. bpo: 35330 +.. date: 2018-12-06-00-43-13 +.. nonce: abB4BN +.. section: Library + +When a :class:`Mock` instance was used to wrap an object, if `side_effect` +is used in one of the mocks of it methods, don't call the original +implementation and return the result of using the side effect the same way +that it is done with return_value. + +.. + +.. bpo: 34172 +.. date: 2018-12-06-00-31-25 +.. nonce: l7CIYt +.. section: Library + +Revert the fix for this issue previously released in 3.6.7 pending further +investigation: Fix a reference issue inside multiprocessing.Pool that caused +the pool to remain alive if it was deleted without being closed or +terminated explicitly. + +.. + +.. bpo: 10496 +.. date: 2018-12-05-13-37-39 +.. nonce: VH-1Lp +.. section: Library + +:func:`posixpath.expanduser` now returns the input *path* unchanged if the +``HOME`` environment variable is not set and the current user has no home +directory (if the current user identifier doesn't exist in the password +database). This change fix the :mod:`site` module if the current user +doesn't exist in the password database (if the user has no home directory). + +.. + +.. bpo: 35310 +.. date: 2018-12-03-19-45-00 +.. nonce: 9k28gR +.. section: Library + +Fix a bug in :func:`select.select` where, in some cases, the file descriptor +sequences were returned unmodified after a signal interruption, even though +the file descriptors might not be ready yet. :func:`select.select` will now +always return empty lists if a timeout has occurred. Patch by Oran Avraham. + +.. + +.. bpo: 35380 +.. date: 2018-12-03-14-41-11 +.. nonce: SdRF9l +.. section: Library + +Enable TCP_NODELAY on Windows for proactor asyncio event loop. + +.. + +.. bpo: 35371 +.. date: 2018-12-01-13-44-12 +.. nonce: fTAwlX +.. section: Library + +Fixed possible crash in ``os.utime()`` on Windows when pass incorrect +arguments. + +.. + +.. bpo: 27903 +.. date: 2018-11-29-12-14-04 +.. nonce: ia8xgT +.. section: Library + +Fix ``ResourceWarning`` in :func:`platform.dist` on SuSE and Caldera +OpenLinux. Patch by Ville Skyttä. + +.. + +.. bpo: 28604 +.. date: 2018-11-20-13-34-01 +.. nonce: iiih5h +.. section: Library + +:func:`locale.localeconv` now sets temporarily the ``LC_CTYPE`` locale to +the ``LC_MONETARY`` locale if the two locales are different and monetary +strings are non-ASCII. This temporary change affects other threads. + +.. + +.. bpo: 35277 +.. date: 2018-11-19-07-22-04 +.. nonce: dsD-2E +.. section: Library + +Update ensurepip to install pip 18.1 and setuptools 40.6.2. + +.. + +.. bpo: 35226 +.. date: 2018-11-15-07-14-32 +.. nonce: wJPEEe +.. section: Library + +Recursively check arguments when testing for equality of +:class:`unittest.mock.call` objects and add note that tracking of parameters +used to create ancestors of mocks in ``mock_calls`` is not possible. + +.. + +.. bpo: 35189 +.. date: 2018-11-09-13-35-36 +.. nonce: gog-sl +.. section: Library + +Modify the following fnctl function to retry if interrupted by a signal +(EINTR): flock, lockf, fnctl + +.. + +.. bpo: 35062 +.. date: 2018-10-29-23-09-24 +.. nonce: dQS1ng +.. section: Library + +Fix incorrect parsing of :class:`_io.IncrementalNewlineDecoder`'s +*translate* argument. + +.. + +.. bpo: 35079 +.. date: 2018-10-26-22-53-16 +.. nonce: Tm5jvF +.. section: Library + +Improve difflib.SequenceManager.get_matching_blocks doc by adding +'non-overlapping' and changing '!=' to '<'. + +.. + +.. bpo: 35017 +.. date: 2018-10-26-00-11-21 +.. nonce: 6Ez4Cv +.. section: Library + +:meth:`socketserver.BaseServer.serve_forever` now exits immediately if it's +:meth:`~socketserver.BaseServer.shutdown` method is called while it is +polling for new events. + +.. + +.. bpo: 31047 +.. date: 2018-10-25-09-37-03 +.. nonce: kBbX8r +.. section: Library + +Fix ``ntpath.abspath`` regression where it didn't remove a trailing +separator on Windows. Patch by Tim Graham. + +.. + +.. bpo: 34794 +.. date: 2018-10-21-14-53-19 +.. nonce: yt3R4- +.. section: Library + +Fixed a leak in Tkinter when pass the Python wrapper around Tcl_Obj back to +Tcl/Tk. + +.. + +.. bpo: 35008 +.. date: 2018-10-17-11-54-04 +.. nonce: dotef_ +.. section: Library + +Fixed references leaks when call the ``__setstate__()`` method of +:class:`xml.etree.ElementTree.Element` in the C implementation for already +initialized element. + +.. + +.. bpo: 23420 +.. date: 2018-10-17-11-00-00 +.. nonce: Lq74Uu +.. section: Library + +Verify the value for the parameter '-s' of the cProfile CLI. Patch by Robert +Kuska + +.. + +.. bpo: 16965 +.. date: 2018-10-12-20-30-42 +.. nonce: xo5LAr +.. section: Library + +The :term:`2to3` :2to3fixer:`execfile` fixer now opens the file with mode +``'rb'``. Patch by Zackery Spytz. + +.. + +.. bpo: 34966 +.. date: 2018-10-12-18-57-52 +.. nonce: WZeBHO +.. section: Library + +:mod:`pydoc` now supports aliases not only to methods defined in the end +class, but also to inherited methods. The docstring is not duplicated for +aliases. + +.. + +.. bpo: 34941 +.. date: 2018-10-09-14-42-16 +.. nonce: 1Q5QKv +.. section: Library + +Methods ``find()``, ``findtext()`` and ``findall()`` of the ``Element`` +class in the :mod:`xml.etree.ElementTree` module are now able to find +children which are instances of ``Element`` subclasses. + +.. + +.. bpo: 34936 +.. date: 2018-10-08-21-05-11 +.. nonce: 3tRqdq +.. section: Library + +Fix ``TclError`` in ``tkinter.Spinbox.selection_element()``. Patch by +Juliette Monsel. + +.. + +.. bpo: 34900 +.. date: 2018-10-05-05-55-53 +.. nonce: 8RNiFu +.. section: Library + +Fixed :meth:`unittest.TestCase.debug` when used to call test methods with +subtests. Patch by Bruno Oliveira. + +.. + +.. bpo: 34866 +.. date: 2018-10-03-11-07-28 +.. nonce: ML6KpJ +.. section: Library + +Adding ``max_num_fields`` to ``cgi.FieldStorage`` to make DOS attacks harder +by limiting the number of ``MiniFieldStorage`` objects created by +``FieldStorage``. + +.. + +.. bpo: 34738 +.. date: 2018-09-19-16-51-04 +.. nonce: Pr3-iG +.. section: Library + +ZIP files created by :mod:`distutils` will now include entries for +directories. + +.. + +.. bpo: 31177 +.. date: 2018-09-14-10-38-18 +.. nonce: Sv91TN +.. section: Library + +Fix bug that prevented using :meth:`reset_mock +` on mock instances with deleted attributes + +.. + +.. bpo: 34604 +.. date: 2018-09-07-10-16-34 +.. nonce: xL7-kG +.. section: Library + +Fix possible mojibake in the error message of `pwd.getpwnam` and +`grp.getgrnam` using string representation because of invisible characters +or trailing whitespaces. Patch by William Grzybowski. + +.. + +.. bpo: 34574 +.. date: 2018-09-04-09-32-54 +.. nonce: X4RwYI +.. section: Library + +OrderedDict iterators are not exhausted during pickling anymore. Patch by +Sergey Fedoseev. + +.. + +.. bpo: 34052 +.. date: 2018-07-24-16-37-40 +.. nonce: VbbFAE +.. section: Library + +:meth:`sqlite3.Connection.create_aggregate`, +:meth:`sqlite3.Connection.create_function`, +:meth:`sqlite3.Connection.set_authorizer`, +:meth:`sqlite3.Connection.set_progress_handler` methods raises TypeError +when unhashable objects are passed as callable. These methods now don't pass +such objects to SQLite API. Previous behavior could lead to segfaults. Patch +by Sergey Fedoseev. + +.. + +.. bpo: 29877 +.. date: 2017-12-16-11-40-52 +.. nonce: SfWhmz +.. section: Library + +compileall: import ProcessPoolExecutor only when needed, preventing hangs on +low resource platforms + +.. + +.. bpo: 22005 +.. date: 2017-10-12-22-39-55 +.. nonce: lGP-sc +.. section: Library + +Implemented unpickling instances of :class:`~datetime.datetime`, +:class:`~datetime.date` and :class:`~datetime.time` pickled by Python 2. +``encoding='latin1'`` should be used for successful decoding. + +.. + +.. bpo: 35089 +.. date: 2018-10-28-16-51-31 +.. nonce: _stCpS +.. section: Documentation + +Remove mention of ``typing.io`` and ``typing.re``. Their types should be +imported from ``typing`` directly. + +.. + +.. bpo: 35038 +.. date: 2018-10-25-17-45-09 +.. nonce: 2eVOYS +.. section: Documentation + +Fix the documentation about an unexisting `f_restricted` attribute in the +frame object. Patch by Stéphane Wirtel + +.. + +.. bpo: 35035 +.. date: 2018-10-21-02-20-36 +.. nonce: 4zBObK +.. section: Documentation + +Rename documentation for :mod:`email.utils` to ``email.utils.rst``. + +.. + +.. bpo: 34967 +.. date: 2018-10-13-07-39-57 +.. nonce: E40tFP +.. section: Documentation + +Use app.add_object_type() instead of the deprecated Sphinx function +app.description_unit() + +.. + +.. bpo: 33594 +.. date: 2018-05-21-14-36-12 +.. nonce: -HRcyX +.. section: Documentation + +Document ``getargspec``, ``from_function`` and ``from_builtin`` as +deprecated in their respective docstring, and include version since +deprecation in DeprecationWarning message. + +.. + +.. bpo: 32613 +.. date: 2018-02-05-15-05-53 +.. nonce: TDjgM1 +.. section: Documentation + +Update the faq/windows.html to use the py command from PEP 397 instead of +python. + +.. + +.. bpo: 33725 +.. date: 2018-12-09-01-27-29 +.. nonce: TaGayj +.. section: Tests + +test_multiprocessing_fork may crash on recent versions of macOS. Until the +issue is resolved, skip the test on macOS. + +.. + +.. bpo: 35352 +.. date: 2018-11-30-17-18-56 +.. nonce: 8bD7GC +.. section: Tests + +Modify test_asyncio to use the certificate set from the test directory. + +.. + +.. bpo: 35317 +.. date: 2018-11-26-16-54-21 +.. nonce: jByGP2 +.. section: Tests + +Fix ``mktime()`` overflow error in ``test_email``: run +``test_localtime_daylight_true_dst_true()`` and +``test_localtime_daylight_false_dst_true()`` with a specific timezone. + +.. + +.. bpo: 21263 +.. date: 2018-11-04-20-17-09 +.. nonce: T3qo9r +.. section: Tests + +After several reports that test_gdb does not work properly on macOS and +since gdb is not shipped by default anymore, test_gdb is now skipped on +macOS when LLVM Clang has been used to compile Python. Patch by Lysandros +Nikolaou + +.. + +.. bpo: 34279 +.. date: 2018-10-27-13-41-55 +.. nonce: v0Xqxe +.. section: Tests + +regrtest issue a warning when no tests have been executed in a particular +test file. Also, a new final result state is issued if no test have been +executed across all test files. Patch by Pablo Galindo. + +.. + +.. bpo: 35351 +.. date: 2018-12-04-15-33-28 +.. nonce: ZhhBfT +.. section: Build + +When building Python with clang and LTO, LTO flags are no longer passed into +CFLAGS to build third-party C extensions through distutils. + +.. + +.. bpo: 35139 +.. date: 2018-11-01-15-01-23 +.. nonce: XZTttb +.. section: Build + +Fix a compiler error when statically linking `pyexpat` in `Modules/Setup`. + +.. + +.. bpo: 35011 +.. date: 2018-10-17-17-38-57 +.. nonce: GgoPIC +.. section: Build + +Restores the use of pyexpatns.h to isolate our embedded copy of the expat C +library so that its symbols do not conflict at link or dynamic loading time +with an embedding application or other extension modules with their own +version of libexpat. + +.. + +.. bpo: 28015 +.. date: 2018-10-16-12-22-36 +.. nonce: ylSgFh +.. section: Build + +Have --with-lto works correctly with clang. + +.. + +.. bpo: 33015 +.. date: 2018-08-24-09-48-25 +.. nonce: s21y74 +.. section: Build + +Fix an undefined behaviour in the pthread implementation of +:c:func:`PyThread_start_new_thread`: add a function wrapper to always return +``NULL``. + +.. + +.. bpo: 31625 +.. date: 2017-09-28-23-21-20 +.. nonce: Bb2NXr +.. section: Build + +Stop using ranlib on static libraries. Instead, we assume ar supports the +'s' flag. + +.. + +.. bpo: 31354 +.. date: 2017-09-08-11-48-11 +.. nonce: 4f-VJK +.. section: Build + +Allow --with-lto to be used on all builds, not just `make profile-opt`. + +.. + +.. bpo: 35401 +.. date: 2018-12-10-15-01-13 +.. nonce: 9L1onG +.. section: Windows + +Updates Windows build to OpenSSL 1.0.2q + +.. + +.. bpo: 32890 +.. date: 2018-03-08-20-02-38 +.. nonce: 3jzFzY +.. section: Windows + +Fix usage of GetLastError() instead of errno in os.execve() and +os.truncate(). + +.. + +.. bpo: 15663 +.. date: 2018-12-11-02-50-35 +.. nonce: 6tnyd2 +.. section: macOS + +The macOS 10.6+ installer now provides a private copy of Tcl/Tk 8.6, like +the 10.9+ installer does. + +.. + +.. bpo: 35402 +.. date: 2018-12-10-02-44-48 +.. nonce: xzn8qJ +.. section: macOS + +Update macOS installer to use Tcl/Tk 8.6.9.1. + +.. + +.. bpo: 35401 +.. date: 2018-12-10-02-37-11 +.. nonce: sFhD5z +.. section: macOS + +Update macOS installer to use OpenSSL 1.0.2q. + +.. + +.. bpo: 35025 +.. date: 2018-10-18-23-54-55 +.. nonce: X4LFJg +.. section: macOS + +Properly guard the use of the ``CLOCK_GETTIME`` et al. macros in +``timemodule`` on macOS. + +.. + +.. bpo: 24658 +.. date: 2018-10-17-14-36-08 +.. nonce: Naddgx +.. section: macOS + +On macOS, fix reading from and writing into a file with a size larger than 2 +GiB. + +.. + +.. bpo: 35213 +.. date: 2018-11-12-00-20-01 +.. nonce: cqNgzT +.. section: IDLE + +Where appropriate, use 'macOS' in idlelib. + +.. + +.. bpo: 34864 +.. date: 2018-11-11-17-13-50 +.. nonce: cw0PvO +.. section: IDLE + +On macOS, warn if the system preference "Prefer tabs when opening documents" +is set to "Always". + +.. + +.. bpo: 34864 +.. date: 2018-11-10-21-27-25 +.. nonce: Ci-G2q +.. section: IDLE + +Document two IDLE on MacOS issues. The System Preferences Dock "prefer tabs +always" setting disables some IDLE features. Menus are a bit different than +as described for Windows and Linux. + +.. + +.. bpo: 35202 +.. date: 2018-11-10-09-10-54 +.. nonce: TeJJrt +.. section: IDLE + +Remove unused imports from lib/idlelib + +.. + +.. bpo: 33000 +.. date: 2018-11-06-23-10-54 +.. nonce: pQasCt +.. section: IDLE + +Document that IDLE's shell has no line limit. A program that runs +indefinitely can overfill memory. + +.. + +.. bpo: 23220 +.. date: 2018-11-05-23-23-00 +.. nonce: H3SAWE +.. section: IDLE + +Explain how IDLE's Shell displays output. + +.. + +.. bpo: 35099 +.. date: 2018-11-05-20-43-08 +.. nonce: SVOZXC +.. section: IDLE + +Improve the doc about IDLE running user code. The section is renamed from +"IDLE -- console differences" is renamed "Running user code". It mostly +covers the implications of using custom sys.stdxxx objects. + +.. + +.. bpo: 35097 +.. date: 2018-10-28-20-17-14 +.. nonce: 07tm66 +.. section: IDLE + +Add IDLE doc subsection explaining editor windows. Topics include opening, +title and status bar, .py* extension, and running. + +.. + +.. bpo: 35093 +.. date: 2018-10-28-15-53-51 +.. nonce: cH-tli +.. section: IDLE + +Document the IDLE document viewer in the IDLE doc. Add a paragraph in "Help +and preferences", "Help sources" subsection. + +.. + +.. bpo: 35088 +.. date: 2018-10-28-00-54-32 +.. nonce: r1lJZd +.. section: IDLE + +Update idlelib.help.copy_string docstring. We now use git and backporting +instead of hg and forward merging. + +.. + +.. bpo: 35087 +.. date: 2018-10-28-00-08-42 +.. nonce: G7gx2- +.. section: IDLE + +Update idlelib help files for the current doc build. The main change is the +elimination of chapter-section numbers. + +.. + +.. bpo: 34989 +.. date: 2018-10-15-13-22-28 +.. nonce: hU4fra +.. section: Tools/Demos + +python-gdb.py now handles errors on computing the line number of a Python +frame. diff --git a/Misc/NEWS.d/next/Build/2017-09-08-11-48-11.bpo-31354.4f-VJK.rst b/Misc/NEWS.d/next/Build/2017-09-08-11-48-11.bpo-31354.4f-VJK.rst deleted file mode 100644 index b63c9ea6e01f86..00000000000000 --- a/Misc/NEWS.d/next/Build/2017-09-08-11-48-11.bpo-31354.4f-VJK.rst +++ /dev/null @@ -1 +0,0 @@ -Allow --with-lto to be used on all builds, not just `make profile-opt`. diff --git a/Misc/NEWS.d/next/Build/2017-09-28-23-21-20.bpo-31625.Bb2NXr.rst b/Misc/NEWS.d/next/Build/2017-09-28-23-21-20.bpo-31625.Bb2NXr.rst deleted file mode 100644 index dbd078f00308fe..00000000000000 --- a/Misc/NEWS.d/next/Build/2017-09-28-23-21-20.bpo-31625.Bb2NXr.rst +++ /dev/null @@ -1 +0,0 @@ -Stop using ranlib on static libraries. Instead, we assume ar supports the 's' flag. diff --git a/Misc/NEWS.d/next/Build/2018-08-24-09-48-25.bpo-33015.s21y74.rst b/Misc/NEWS.d/next/Build/2018-08-24-09-48-25.bpo-33015.s21y74.rst deleted file mode 100644 index 8c5a0c91a46b46..00000000000000 --- a/Misc/NEWS.d/next/Build/2018-08-24-09-48-25.bpo-33015.s21y74.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix an undefined behaviour in the pthread implementation of -:c:func:`PyThread_start_new_thread`: add a function wrapper to always return -``NULL``. diff --git a/Misc/NEWS.d/next/Build/2018-10-16-12-22-36.bpo-28015.ylSgFh.rst b/Misc/NEWS.d/next/Build/2018-10-16-12-22-36.bpo-28015.ylSgFh.rst deleted file mode 100644 index 5a7a43c773076d..00000000000000 --- a/Misc/NEWS.d/next/Build/2018-10-16-12-22-36.bpo-28015.ylSgFh.rst +++ /dev/null @@ -1 +0,0 @@ -Have --with-lto works correctly with clang. diff --git a/Misc/NEWS.d/next/Build/2018-10-17-17-38-57.bpo-35011.GgoPIC.rst b/Misc/NEWS.d/next/Build/2018-10-17-17-38-57.bpo-35011.GgoPIC.rst deleted file mode 100644 index 4411ffea45ce96..00000000000000 --- a/Misc/NEWS.d/next/Build/2018-10-17-17-38-57.bpo-35011.GgoPIC.rst +++ /dev/null @@ -1,4 +0,0 @@ -Restores the use of pyexpatns.h to isolate our embedded copy of the expat C -library so that its symbols do not conflict at link or dynamic loading time -with an embedding application or other extension modules with their own -version of libexpat. diff --git a/Misc/NEWS.d/next/Build/2018-11-01-15-01-23.bpo-35139.XZTttb.rst b/Misc/NEWS.d/next/Build/2018-11-01-15-01-23.bpo-35139.XZTttb.rst deleted file mode 100644 index aa65088be80936..00000000000000 --- a/Misc/NEWS.d/next/Build/2018-11-01-15-01-23.bpo-35139.XZTttb.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a compiler error when statically linking `pyexpat` in `Modules/Setup`. diff --git a/Misc/NEWS.d/next/Build/2018-12-04-15-33-28.bpo-35351.ZhhBfT.rst b/Misc/NEWS.d/next/Build/2018-12-04-15-33-28.bpo-35351.ZhhBfT.rst deleted file mode 100644 index ee6c870b060f6a..00000000000000 --- a/Misc/NEWS.d/next/Build/2018-12-04-15-33-28.bpo-35351.ZhhBfT.rst +++ /dev/null @@ -1,2 +0,0 @@ -When building Python with clang and LTO, LTO flags are no longer passed into -CFLAGS to build third-party C extensions through distutils. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-09-11-15-19-37.bpo-1621.7o19yG.rst b/Misc/NEWS.d/next/Core and Builtins/2018-09-11-15-19-37.bpo-1621.7o19yG.rst deleted file mode 100644 index 4047ff3bfe866f..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-09-11-15-19-37.bpo-1621.7o19yG.rst +++ /dev/null @@ -1,2 +0,0 @@ -Do not assume signed integer overflow behavior (C undefined behavior) when -performing set hash table resizing. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-09-27-11-10-02.bpo-34824.VLlCaU.rst b/Misc/NEWS.d/next/Core and Builtins/2018-09-27-11-10-02.bpo-34824.VLlCaU.rst deleted file mode 100644 index fe95b8973c09a4..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-09-27-11-10-02.bpo-34824.VLlCaU.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a possible null pointer dereference in Modules/_ssl.c. Patch by Zackery -Spytz. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-10-13-16-42-03.bpo-34973.B5M-3g.rst b/Misc/NEWS.d/next/Core and Builtins/2018-10-13-16-42-03.bpo-34973.B5M-3g.rst deleted file mode 100644 index 6e403cd4cec6be..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-10-13-16-42-03.bpo-34973.B5M-3g.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed crash in :func:`bytes` when the :class:`list` argument is mutated -while it is iterated. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-10-13-22-24-19.bpo-34974.7LgTc2.rst b/Misc/NEWS.d/next/Core and Builtins/2018-10-13-22-24-19.bpo-34974.7LgTc2.rst deleted file mode 100644 index 2a7e773648ec62..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-10-13-22-24-19.bpo-34974.7LgTc2.rst +++ /dev/null @@ -1,3 +0,0 @@ -:class:`bytes` and :class:`bytearray` constructors no longer convert -unexpected exceptions (e.g. :exc:`MemoryError` and :exc:`KeyboardInterrupt`) -to :exc:`TypeError`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-10-23-15-03-53.bpo-35050.49wraS.rst b/Misc/NEWS.d/next/Core and Builtins/2018-10-23-15-03-53.bpo-35050.49wraS.rst deleted file mode 100644 index 9a33416089a2a6..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-10-23-15-03-53.bpo-35050.49wraS.rst +++ /dev/null @@ -1 +0,0 @@ -:mod:`socket`: Fix off-by-one bug in length check for ``AF_ALG`` name and type. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-10-25-20-53-32.bpo-29341.jH-AMF.rst b/Misc/NEWS.d/next/Core and Builtins/2018-10-25-20-53-32.bpo-29341.jH-AMF.rst deleted file mode 100644 index 954ce8cbc09a45..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-10-25-20-53-32.bpo-29341.jH-AMF.rst +++ /dev/null @@ -1,2 +0,0 @@ -Clarify in the docstrings of :mod:`os` methods that path-like objects are also accepted -as input parameters. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-11-08-23-00-04.bpo-35193.WK2PDg.rst b/Misc/NEWS.d/next/Core and Builtins/2018-11-08-23-00-04.bpo-35193.WK2PDg.rst deleted file mode 100644 index a6b3c64beab77e..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-11-08-23-00-04.bpo-35193.WK2PDg.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix an off by one error in the bytecode peephole optimizer where it could -read bytes beyond the end of bounds of an array when removing unreachable -code. This bug was present in every release of Python 3.6 until now. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-11-12-11-38-06.bpo-35214.PCHKbX.rst b/Misc/NEWS.d/next/Core and Builtins/2018-11-12-11-38-06.bpo-35214.PCHKbX.rst deleted file mode 100644 index c7842f331698ec..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-11-12-11-38-06.bpo-35214.PCHKbX.rst +++ /dev/null @@ -1,4 +0,0 @@ -The interpreter and extension modules have had annotations added so that -they work properly under clang's Memory Sanitizer. A new configure flag ---with-memory-sanitizer has been added to make test builds of this nature -easier to perform. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-11-13-00-40-35.bpo-35214.OQBjph.rst b/Misc/NEWS.d/next/Core and Builtins/2018-11-13-00-40-35.bpo-35214.OQBjph.rst deleted file mode 100644 index d462c97d804095..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-11-13-00-40-35.bpo-35214.OQBjph.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fixed an out of bounds memory access when parsing a truncated unicode -escape sequence at the end of a string such as ``'\N'``. It would read -one byte beyond the end of the memory allocation. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-11-20-22-33-38.bpo-33954.RzSngM.rst b/Misc/NEWS.d/next/Core and Builtins/2018-11-20-22-33-38.bpo-33954.RzSngM.rst deleted file mode 100644 index 9bfbe1644e16ac..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-11-20-22-33-38.bpo-33954.RzSngM.rst +++ /dev/null @@ -1,3 +0,0 @@ -For :meth:`str.format`, :meth:`float.__format__` and -:meth:`complex.__format__` methods for non-ASCII decimal point when using -the "n" formatter. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-01-19-20-53.bpo-35372.RwVJjZ.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-01-19-20-53.bpo-35372.RwVJjZ.rst deleted file mode 100644 index dc2de44b4f6373..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-12-01-19-20-53.bpo-35372.RwVJjZ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed the code page decoder for input longer than 2 GiB containing -undecodable bytes. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-03-21-20-24.bpo-35357.rhhoiC.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-03-21-20-24.bpo-35357.rhhoiC.rst deleted file mode 100644 index 1dade5baf4e013..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-12-03-21-20-24.bpo-35357.rhhoiC.rst +++ /dev/null @@ -1,4 +0,0 @@ -Internal attributes' names of unittest.mock._Call and -unittest.mock.MagicProxy (name, parent & from_kall) are now prefixed with -_mock_ in order to prevent clashes with widely used object attributes. -Fixed minor typo in test function name. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-07-02-38-01.bpo-35436.0VW7p9.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-07-02-38-01.bpo-35436.0VW7p9.rst deleted file mode 100644 index 542fe93a00eb17..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-12-07-02-38-01.bpo-35436.0VW7p9.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix various issues with memory allocation error handling. Patch by Zackery -Spytz. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-09-13-09-39.bpo-35444.9kYn4V.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-09-13-09-39.bpo-35444.9kYn4V.rst deleted file mode 100644 index 22c3969f12762a..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-12-09-13-09-39.bpo-35444.9kYn4V.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed error handling in pickling methods when fail to look up builtin -"getattr". diff --git a/Misc/NEWS.d/next/Documentation/2018-02-05-15-05-53.bpo-32613.TDjgM1.rst b/Misc/NEWS.d/next/Documentation/2018-02-05-15-05-53.bpo-32613.TDjgM1.rst deleted file mode 100644 index d4701c224e70c3..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-02-05-15-05-53.bpo-32613.TDjgM1.rst +++ /dev/null @@ -1,2 +0,0 @@ -Update the faq/windows.html to use the py command from PEP 397 instead of -python. diff --git a/Misc/NEWS.d/next/Documentation/2018-05-21-14-36-12.bpo-33594.-HRcyX.rst b/Misc/NEWS.d/next/Documentation/2018-05-21-14-36-12.bpo-33594.-HRcyX.rst deleted file mode 100644 index a63c4a5004c66d..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-05-21-14-36-12.bpo-33594.-HRcyX.rst +++ /dev/null @@ -1,3 +0,0 @@ -Document ``getargspec``, ``from_function`` and ``from_builtin`` as -deprecated in their respective docstring, and include version since -deprecation in DeprecationWarning message. diff --git a/Misc/NEWS.d/next/Documentation/2018-10-13-07-39-57.bpo-34967.E40tFP.rst b/Misc/NEWS.d/next/Documentation/2018-10-13-07-39-57.bpo-34967.E40tFP.rst deleted file mode 100644 index 6341296663aefc..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-10-13-07-39-57.bpo-34967.E40tFP.rst +++ /dev/null @@ -1,2 +0,0 @@ -Use app.add_object_type() instead of the deprecated Sphinx function -app.description_unit() diff --git a/Misc/NEWS.d/next/Documentation/2018-10-21-02-20-36.bpo-35035.4zBObK.rst b/Misc/NEWS.d/next/Documentation/2018-10-21-02-20-36.bpo-35035.4zBObK.rst deleted file mode 100644 index 46436f1b979b86..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-10-21-02-20-36.bpo-35035.4zBObK.rst +++ /dev/null @@ -1 +0,0 @@ -Rename documentation for :mod:`email.utils` to ``email.utils.rst``. diff --git a/Misc/NEWS.d/next/Documentation/2018-10-25-17-45-09.bpo-35038.2eVOYS.rst b/Misc/NEWS.d/next/Documentation/2018-10-25-17-45-09.bpo-35038.2eVOYS.rst deleted file mode 100644 index 3558cf47d5d5f9..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-10-25-17-45-09.bpo-35038.2eVOYS.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix the documentation about an unexisting `f_restricted` attribute in the -frame object. Patch by Stéphane Wirtel diff --git a/Misc/NEWS.d/next/Documentation/2018-10-28-16-51-31.bpo-35089._stCpS.rst b/Misc/NEWS.d/next/Documentation/2018-10-28-16-51-31.bpo-35089._stCpS.rst deleted file mode 100644 index 4a469290ad733a..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-10-28-16-51-31.bpo-35089._stCpS.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove mention of ``typing.io`` and ``typing.re``. Their types should be -imported from ``typing`` directly. diff --git a/Misc/NEWS.d/next/IDLE/2018-10-28-00-08-42.bpo-35087.G7gx2-.rst b/Misc/NEWS.d/next/IDLE/2018-10-28-00-08-42.bpo-35087.G7gx2-.rst deleted file mode 100644 index 0fd26699a96c79..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-10-28-00-08-42.bpo-35087.G7gx2-.rst +++ /dev/null @@ -1,2 +0,0 @@ -Update idlelib help files for the current doc build. The main change is the -elimination of chapter-section numbers. diff --git a/Misc/NEWS.d/next/IDLE/2018-10-28-00-54-32.bpo-35088.r1lJZd.rst b/Misc/NEWS.d/next/IDLE/2018-10-28-00-54-32.bpo-35088.r1lJZd.rst deleted file mode 100644 index 993ff51d74e570..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-10-28-00-54-32.bpo-35088.r1lJZd.rst +++ /dev/null @@ -1,2 +0,0 @@ -Update idlelib.help.copy_string docstring. We now use git and backporting -instead of hg and forward merging. diff --git a/Misc/NEWS.d/next/IDLE/2018-10-28-15-53-51.bpo-35093.cH-tli.rst b/Misc/NEWS.d/next/IDLE/2018-10-28-15-53-51.bpo-35093.cH-tli.rst deleted file mode 100644 index a330b990761a21..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-10-28-15-53-51.bpo-35093.cH-tli.rst +++ /dev/null @@ -1,2 +0,0 @@ -Document the IDLE document viewer in the IDLE doc. Add a paragraph in "Help -and preferences", "Help sources" subsection. diff --git a/Misc/NEWS.d/next/IDLE/2018-10-28-20-17-14.bpo-35097.07tm66.rst b/Misc/NEWS.d/next/IDLE/2018-10-28-20-17-14.bpo-35097.07tm66.rst deleted file mode 100644 index a1e58ee5983c06..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-10-28-20-17-14.bpo-35097.07tm66.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add IDLE doc subsection explaining editor windows. Topics include opening, -title and status bar, .py* extension, and running. diff --git a/Misc/NEWS.d/next/IDLE/2018-11-05-20-43-08.bpo-35099.SVOZXC.rst b/Misc/NEWS.d/next/IDLE/2018-11-05-20-43-08.bpo-35099.SVOZXC.rst deleted file mode 100644 index 1459f20cb78f62..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-11-05-20-43-08.bpo-35099.SVOZXC.rst +++ /dev/null @@ -1,3 +0,0 @@ -Improve the doc about IDLE running user code. The section is renamed from -"IDLE -- console differences" is renamed "Running user code". -It mostly covers the implications of using custom sys.stdxxx objects. diff --git a/Misc/NEWS.d/next/IDLE/2018-11-05-23-23-00.bpo-23220.H3SAWE.rst b/Misc/NEWS.d/next/IDLE/2018-11-05-23-23-00.bpo-23220.H3SAWE.rst deleted file mode 100644 index 77c71268dddd4e..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-11-05-23-23-00.bpo-23220.H3SAWE.rst +++ /dev/null @@ -1 +0,0 @@ -Explain how IDLE's Shell displays output. diff --git a/Misc/NEWS.d/next/IDLE/2018-11-06-23-10-54.bpo-33000.pQasCt.rst b/Misc/NEWS.d/next/IDLE/2018-11-06-23-10-54.bpo-33000.pQasCt.rst deleted file mode 100644 index c6ba9e4669d584..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-11-06-23-10-54.bpo-33000.pQasCt.rst +++ /dev/null @@ -1,2 +0,0 @@ -Document that IDLE's shell has no line limit. A program that runs -indefinitely can overfill memory. diff --git a/Misc/NEWS.d/next/IDLE/2018-11-10-09-10-54.bpo-35202.TeJJrt.rst b/Misc/NEWS.d/next/IDLE/2018-11-10-09-10-54.bpo-35202.TeJJrt.rst deleted file mode 100644 index 1824536f3db1f1..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-11-10-09-10-54.bpo-35202.TeJJrt.rst +++ /dev/null @@ -1 +0,0 @@ -Remove unused imports from lib/idlelib diff --git a/Misc/NEWS.d/next/IDLE/2018-11-10-21-27-25.bpo-34864.Ci-G2q.rst b/Misc/NEWS.d/next/IDLE/2018-11-10-21-27-25.bpo-34864.Ci-G2q.rst deleted file mode 100644 index fb0083e337a5a0..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-11-10-21-27-25.bpo-34864.Ci-G2q.rst +++ /dev/null @@ -1,3 +0,0 @@ -Document two IDLE on MacOS issues. The System Preferences Dock "prefer tabs -always" setting disables some IDLE features. Menus are a bit different than -as described for Windows and Linux. diff --git a/Misc/NEWS.d/next/IDLE/2018-11-11-17-13-50.bpo-34864.cw0PvO.rst b/Misc/NEWS.d/next/IDLE/2018-11-11-17-13-50.bpo-34864.cw0PvO.rst deleted file mode 100644 index 8d2b61d599ff56..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-11-11-17-13-50.bpo-34864.cw0PvO.rst +++ /dev/null @@ -1,2 +0,0 @@ -On macOS, warn if the system preference "Prefer tabs when opening documents" -is set to "Always". \ No newline at end of file diff --git a/Misc/NEWS.d/next/IDLE/2018-11-12-00-20-01.bpo-35213.cqNgzT.rst b/Misc/NEWS.d/next/IDLE/2018-11-12-00-20-01.bpo-35213.cqNgzT.rst deleted file mode 100644 index 9d0e4e1220bb5f..00000000000000 --- a/Misc/NEWS.d/next/IDLE/2018-11-12-00-20-01.bpo-35213.cqNgzT.rst +++ /dev/null @@ -1 +0,0 @@ -Where appropriate, use 'macOS' in idlelib. diff --git a/Misc/NEWS.d/next/Library/2017-10-12-22-39-55.bpo-22005.lGP-sc.rst b/Misc/NEWS.d/next/Library/2017-10-12-22-39-55.bpo-22005.lGP-sc.rst deleted file mode 100644 index 951098d0a7a308..00000000000000 --- a/Misc/NEWS.d/next/Library/2017-10-12-22-39-55.bpo-22005.lGP-sc.rst +++ /dev/null @@ -1,3 +0,0 @@ -Implemented unpickling instances of :class:`~datetime.datetime`, -:class:`~datetime.date` and :class:`~datetime.time` pickled by Python 2. -``encoding='latin1'`` should be used for successful decoding. diff --git a/Misc/NEWS.d/next/Library/2017-12-16-11-40-52.bpo-29877.SfWhmz.rst b/Misc/NEWS.d/next/Library/2017-12-16-11-40-52.bpo-29877.SfWhmz.rst deleted file mode 100644 index cc09533b71247c..00000000000000 --- a/Misc/NEWS.d/next/Library/2017-12-16-11-40-52.bpo-29877.SfWhmz.rst +++ /dev/null @@ -1,2 +0,0 @@ -compileall: import ProcessPoolExecutor only when needed, preventing hangs on -low resource platforms diff --git a/Misc/NEWS.d/next/Library/2018-07-24-16-37-40.bpo-34052.VbbFAE.rst b/Misc/NEWS.d/next/Library/2018-07-24-16-37-40.bpo-34052.VbbFAE.rst deleted file mode 100644 index 5aa3cc9a81d7f3..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-07-24-16-37-40.bpo-34052.VbbFAE.rst +++ /dev/null @@ -1,7 +0,0 @@ -:meth:`sqlite3.Connection.create_aggregate`, -:meth:`sqlite3.Connection.create_function`, -:meth:`sqlite3.Connection.set_authorizer`, -:meth:`sqlite3.Connection.set_progress_handler` methods raises TypeError -when unhashable objects are passed as callable. These methods now don't pass -such objects to SQLite API. Previous behavior could lead to segfaults. Patch -by Sergey Fedoseev. diff --git a/Misc/NEWS.d/next/Library/2018-09-04-09-32-54.bpo-34574.X4RwYI.rst b/Misc/NEWS.d/next/Library/2018-09-04-09-32-54.bpo-34574.X4RwYI.rst deleted file mode 100644 index de718ad1e6f102..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-09-04-09-32-54.bpo-34574.X4RwYI.rst +++ /dev/null @@ -1,2 +0,0 @@ -OrderedDict iterators are not exhausted during pickling anymore. Patch by -Sergey Fedoseev. diff --git a/Misc/NEWS.d/next/Library/2018-09-07-10-16-34.bpo-34604.xL7-kG.rst b/Misc/NEWS.d/next/Library/2018-09-07-10-16-34.bpo-34604.xL7-kG.rst deleted file mode 100644 index 958b74fd0da69f..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-09-07-10-16-34.bpo-34604.xL7-kG.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix possible mojibake in the error message of `pwd.getpwnam` and -`grp.getgrnam` using string representation because of invisible characters -or trailing whitespaces. Patch by William Grzybowski. diff --git a/Misc/NEWS.d/next/Library/2018-09-14-10-38-18.bpo-31177.Sv91TN.rst b/Misc/NEWS.d/next/Library/2018-09-14-10-38-18.bpo-31177.Sv91TN.rst deleted file mode 100644 index f385571e99ccf2..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-09-14-10-38-18.bpo-31177.Sv91TN.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix bug that prevented using :meth:`reset_mock ` -on mock instances with deleted attributes diff --git a/Misc/NEWS.d/next/Library/2018-09-19-16-51-04.bpo-34738.Pr3-iG.rst b/Misc/NEWS.d/next/Library/2018-09-19-16-51-04.bpo-34738.Pr3-iG.rst deleted file mode 100644 index c3f402d39ae0a6..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-09-19-16-51-04.bpo-34738.Pr3-iG.rst +++ /dev/null @@ -1,2 +0,0 @@ -ZIP files created by :mod:`distutils` will now include entries for -directories. diff --git a/Misc/NEWS.d/next/Library/2018-10-03-11-07-28.bpo-34866.ML6KpJ.rst b/Misc/NEWS.d/next/Library/2018-10-03-11-07-28.bpo-34866.ML6KpJ.rst deleted file mode 100644 index 90c146ce834edf..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-10-03-11-07-28.bpo-34866.ML6KpJ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Adding ``max_num_fields`` to ``cgi.FieldStorage`` to make DOS attacks harder by -limiting the number of ``MiniFieldStorage`` objects created by ``FieldStorage``. diff --git a/Misc/NEWS.d/next/Library/2018-10-05-05-55-53.bpo-34900.8RNiFu.rst b/Misc/NEWS.d/next/Library/2018-10-05-05-55-53.bpo-34900.8RNiFu.rst deleted file mode 100644 index 20e3a0e2d5a19b..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-10-05-05-55-53.bpo-34900.8RNiFu.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed :meth:`unittest.TestCase.debug` when used to call test methods with -subtests. Patch by Bruno Oliveira. diff --git a/Misc/NEWS.d/next/Library/2018-10-08-21-05-11.bpo-34936.3tRqdq.rst b/Misc/NEWS.d/next/Library/2018-10-08-21-05-11.bpo-34936.3tRqdq.rst deleted file mode 100644 index 7c1f7bb59760e4..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-10-08-21-05-11.bpo-34936.3tRqdq.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``TclError`` in ``tkinter.Spinbox.selection_element()``. Patch by -Juliette Monsel. diff --git a/Misc/NEWS.d/next/Library/2018-10-09-14-42-16.bpo-34941.1Q5QKv.rst b/Misc/NEWS.d/next/Library/2018-10-09-14-42-16.bpo-34941.1Q5QKv.rst deleted file mode 100644 index 402372489beff2..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-10-09-14-42-16.bpo-34941.1Q5QKv.rst +++ /dev/null @@ -1,3 +0,0 @@ -Methods ``find()``, ``findtext()`` and ``findall()`` of the ``Element`` -class in the :mod:`xml.etree.ElementTree` module are now able to find -children which are instances of ``Element`` subclasses. diff --git a/Misc/NEWS.d/next/Library/2018-10-12-18-57-52.bpo-34966.WZeBHO.rst b/Misc/NEWS.d/next/Library/2018-10-12-18-57-52.bpo-34966.WZeBHO.rst deleted file mode 100644 index b861405297f4f6..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-10-12-18-57-52.bpo-34966.WZeBHO.rst +++ /dev/null @@ -1,3 +0,0 @@ -:mod:`pydoc` now supports aliases not only to methods defined in -the end class, but also to inherited methods. The docstring is not -duplicated for aliases. diff --git a/Misc/NEWS.d/next/Library/2018-10-12-20-30-42.bpo-16965.xo5LAr.rst b/Misc/NEWS.d/next/Library/2018-10-12-20-30-42.bpo-16965.xo5LAr.rst deleted file mode 100644 index 8e9d2f9482d28c..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-10-12-20-30-42.bpo-16965.xo5LAr.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :term:`2to3` :2to3fixer:`execfile` fixer now opens the file with mode -``'rb'``. Patch by Zackery Spytz. diff --git a/Misc/NEWS.d/next/Library/2018-10-17-11-00-00.bpo-23420.Lq74Uu.rst b/Misc/NEWS.d/next/Library/2018-10-17-11-00-00.bpo-23420.Lq74Uu.rst deleted file mode 100644 index 034e7e53970adf..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-10-17-11-00-00.bpo-23420.Lq74Uu.rst +++ /dev/null @@ -1,2 +0,0 @@ -Verify the value for the parameter '-s' of the cProfile CLI. Patch by Robert -Kuska diff --git a/Misc/NEWS.d/next/Library/2018-10-17-11-54-04.bpo-35008.dotef_.rst b/Misc/NEWS.d/next/Library/2018-10-17-11-54-04.bpo-35008.dotef_.rst deleted file mode 100644 index 3d12a918fc730e..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-10-17-11-54-04.bpo-35008.dotef_.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fixed references leaks when call the ``__setstate__()`` method of -:class:`xml.etree.ElementTree.Element` in the C implementation for already -initialized element. diff --git a/Misc/NEWS.d/next/Library/2018-10-21-14-53-19.bpo-34794.yt3R4-.rst b/Misc/NEWS.d/next/Library/2018-10-21-14-53-19.bpo-34794.yt3R4-.rst deleted file mode 100644 index 770807fc765365..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-10-21-14-53-19.bpo-34794.yt3R4-.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed a leak in Tkinter when pass the Python wrapper around Tcl_Obj back to -Tcl/Tk. diff --git a/Misc/NEWS.d/next/Library/2018-10-25-09-37-03.bpo-31047.kBbX8r.rst b/Misc/NEWS.d/next/Library/2018-10-25-09-37-03.bpo-31047.kBbX8r.rst deleted file mode 100644 index 1e47bf4174e7c0..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-10-25-09-37-03.bpo-31047.kBbX8r.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``ntpath.abspath`` regression where it didn't remove a trailing -separator on Windows. Patch by Tim Graham. diff --git a/Misc/NEWS.d/next/Library/2018-10-26-00-11-21.bpo-35017.6Ez4Cv.rst b/Misc/NEWS.d/next/Library/2018-10-26-00-11-21.bpo-35017.6Ez4Cv.rst deleted file mode 100644 index 5682717adf70f9..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-10-26-00-11-21.bpo-35017.6Ez4Cv.rst +++ /dev/null @@ -1,3 +0,0 @@ -:meth:`socketserver.BaseServer.serve_forever` now exits immediately if it's -:meth:`~socketserver.BaseServer.shutdown` method is called while it is -polling for new events. diff --git a/Misc/NEWS.d/next/Library/2018-10-26-22-53-16.bpo-35079.Tm5jvF.rst b/Misc/NEWS.d/next/Library/2018-10-26-22-53-16.bpo-35079.Tm5jvF.rst deleted file mode 100644 index 991bae38ec722a..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-10-26-22-53-16.bpo-35079.Tm5jvF.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve difflib.SequenceManager.get_matching_blocks doc by adding -'non-overlapping' and changing '!=' to '<'. diff --git a/Misc/NEWS.d/next/Library/2018-10-29-23-09-24.bpo-35062.dQS1ng.rst b/Misc/NEWS.d/next/Library/2018-10-29-23-09-24.bpo-35062.dQS1ng.rst deleted file mode 100644 index b77ed8685bfcbd..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-10-29-23-09-24.bpo-35062.dQS1ng.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix incorrect parsing of :class:`_io.IncrementalNewlineDecoder`'s -*translate* argument. diff --git a/Misc/NEWS.d/next/Library/2018-11-09-13-35-36.bpo-35189.gog-sl.rst b/Misc/NEWS.d/next/Library/2018-11-09-13-35-36.bpo-35189.gog-sl.rst deleted file mode 100644 index 3408ca4eec4422..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-11-09-13-35-36.bpo-35189.gog-sl.rst +++ /dev/null @@ -1,2 +0,0 @@ -Modify the following fnctl function to retry if interrupted by a signal -(EINTR): flock, lockf, fnctl diff --git a/Misc/NEWS.d/next/Library/2018-11-15-07-14-32.bpo-35226.wJPEEe.rst b/Misc/NEWS.d/next/Library/2018-11-15-07-14-32.bpo-35226.wJPEEe.rst deleted file mode 100644 index b95cc979573e54..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-11-15-07-14-32.bpo-35226.wJPEEe.rst +++ /dev/null @@ -1,3 +0,0 @@ -Recursively check arguments when testing for equality of -:class:`unittest.mock.call` objects and add note that tracking of parameters -used to create ancestors of mocks in ``mock_calls`` is not possible. diff --git a/Misc/NEWS.d/next/Library/2018-11-19-07-22-04.bpo-35277.dsD-2E.rst b/Misc/NEWS.d/next/Library/2018-11-19-07-22-04.bpo-35277.dsD-2E.rst deleted file mode 100644 index ff76988e33e7d5..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-11-19-07-22-04.bpo-35277.dsD-2E.rst +++ /dev/null @@ -1 +0,0 @@ -Update ensurepip to install pip 18.1 and setuptools 40.6.2. diff --git a/Misc/NEWS.d/next/Library/2018-11-20-13-34-01.bpo-28604.iiih5h.rst b/Misc/NEWS.d/next/Library/2018-11-20-13-34-01.bpo-28604.iiih5h.rst deleted file mode 100644 index 289e484c35d646..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-11-20-13-34-01.bpo-28604.iiih5h.rst +++ /dev/null @@ -1,3 +0,0 @@ -:func:`locale.localeconv` now sets temporarily the ``LC_CTYPE`` locale to the -``LC_MONETARY`` locale if the two locales are different and monetary strings -are non-ASCII. This temporary change affects other threads. diff --git a/Misc/NEWS.d/next/Library/2018-11-29-12-14-04.bpo-27903.ia8xgT.rst b/Misc/NEWS.d/next/Library/2018-11-29-12-14-04.bpo-27903.ia8xgT.rst deleted file mode 100644 index 8cdf75bc10c93d..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-11-29-12-14-04.bpo-27903.ia8xgT.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``ResourceWarning`` in :func:`platform.dist` on SuSE and Caldera -OpenLinux. Patch by Ville Skyttä. diff --git a/Misc/NEWS.d/next/Library/2018-12-01-13-44-12.bpo-35371.fTAwlX.rst b/Misc/NEWS.d/next/Library/2018-12-01-13-44-12.bpo-35371.fTAwlX.rst deleted file mode 100644 index f40d13939311ef..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-01-13-44-12.bpo-35371.fTAwlX.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed possible crash in ``os.utime()`` on Windows when pass incorrect -arguments. diff --git a/Misc/NEWS.d/next/Library/2018-12-03-14-41-11.bpo-35380.SdRF9l.rst b/Misc/NEWS.d/next/Library/2018-12-03-14-41-11.bpo-35380.SdRF9l.rst deleted file mode 100644 index 91f86e604ea865..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-03-14-41-11.bpo-35380.SdRF9l.rst +++ /dev/null @@ -1 +0,0 @@ -Enable TCP_NODELAY on Windows for proactor asyncio event loop. diff --git a/Misc/NEWS.d/next/Library/2018-12-03-19-45-00.bpo-35310.9k28gR.rst b/Misc/NEWS.d/next/Library/2018-12-03-19-45-00.bpo-35310.9k28gR.rst deleted file mode 100644 index 1ab2e168c86a27..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-03-19-45-00.bpo-35310.9k28gR.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fix a bug in :func:`select.select` where, in some cases, the file descriptor -sequences were returned unmodified after a signal interruption, even though the -file descriptors might not be ready yet. :func:`select.select` will now always -return empty lists if a timeout has occurred. Patch by Oran Avraham. diff --git a/Misc/NEWS.d/next/Library/2018-12-05-13-37-39.bpo-10496.VH-1Lp.rst b/Misc/NEWS.d/next/Library/2018-12-05-13-37-39.bpo-10496.VH-1Lp.rst deleted file mode 100644 index 232fcc6503b029..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-05-13-37-39.bpo-10496.VH-1Lp.rst +++ /dev/null @@ -1,5 +0,0 @@ -:func:`posixpath.expanduser` now returns the input *path* unchanged if the -``HOME`` environment variable is not set and the current user has no home -directory (if the current user identifier doesn't exist in the password -database). This change fix the :mod:`site` module if the current user doesn't -exist in the password database (if the user has no home directory). diff --git a/Misc/NEWS.d/next/Library/2018-12-06-00-31-25.bpo-34172.l7CIYt.rst b/Misc/NEWS.d/next/Library/2018-12-06-00-31-25.bpo-34172.l7CIYt.rst deleted file mode 100644 index fd4d2dc81aedb5..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-06-00-31-25.bpo-34172.l7CIYt.rst +++ /dev/null @@ -1,5 +0,0 @@ -Revert the fix for this issue previously released in 3.6.7 pending -further investigation: -Fix a reference issue inside multiprocessing.Pool that caused the -pool to remain alive if it was deleted without being closed or terminated -explicitly. diff --git a/Misc/NEWS.d/next/Library/2018-12-06-00-43-13.bpo-35330.abB4BN.rst b/Misc/NEWS.d/next/Library/2018-12-06-00-43-13.bpo-35330.abB4BN.rst deleted file mode 100644 index 24d0ab84fb16a2..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-06-00-43-13.bpo-35330.abB4BN.rst +++ /dev/null @@ -1,4 +0,0 @@ -When a :class:`Mock` instance was used to wrap an object, if `side_effect` -is used in one of the mocks of it methods, don't call the original -implementation and return the result of using the side effect the same way -that it is done with return_value. diff --git a/Misc/NEWS.d/next/Library/2018-12-10-09-48-27.bpo-35052.xE1ymg.rst b/Misc/NEWS.d/next/Library/2018-12-10-09-48-27.bpo-35052.xE1ymg.rst deleted file mode 100644 index 4877188a294424..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-10-09-48-27.bpo-35052.xE1ymg.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix xml.dom.minidom cloneNode() on a document with an entity: pass the -correct arguments to the user data handler of an entity. diff --git a/Misc/NEWS.d/next/Security/2018-09-24-18-49-25.bpo-34791.78GmIG.rst b/Misc/NEWS.d/next/Security/2018-09-24-18-49-25.bpo-34791.78GmIG.rst deleted file mode 100644 index afb59f8cb0ebf0..00000000000000 --- a/Misc/NEWS.d/next/Security/2018-09-24-18-49-25.bpo-34791.78GmIG.rst +++ /dev/null @@ -1,3 +0,0 @@ -The xml.sax and xml.dom.domreg no longer use environment variables to -override parser implementations when sys.flags.ignore_environment is set by --E or -I arguments. diff --git a/Misc/NEWS.d/next/Security/2018-11-23-15-00-23.bpo-34812.84VQnb.rst b/Misc/NEWS.d/next/Security/2018-11-23-15-00-23.bpo-34812.84VQnb.rst deleted file mode 100644 index 860404f019d2b3..00000000000000 --- a/Misc/NEWS.d/next/Security/2018-11-23-15-00-23.bpo-34812.84VQnb.rst +++ /dev/null @@ -1,4 +0,0 @@ -The :option:`-I` command line option (run Python in isolated mode) is now -also copied by the :mod:`multiprocessing` and :mod:`distutils` modules when -spawning child processes. Previously, only :option:`-E` and :option:`-s` options -(enabled by :option:`-I`) were copied. diff --git a/Misc/NEWS.d/next/Tests/2018-10-27-13-41-55.bpo-34279.v0Xqxe.rst b/Misc/NEWS.d/next/Tests/2018-10-27-13-41-55.bpo-34279.v0Xqxe.rst deleted file mode 100644 index a82fa6b304ac1b..00000000000000 --- a/Misc/NEWS.d/next/Tests/2018-10-27-13-41-55.bpo-34279.v0Xqxe.rst +++ /dev/null @@ -1,3 +0,0 @@ -regrtest issue a warning when no tests have been executed in a particular -test file. Also, a new final result state is issued if no test have been -executed across all test files. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Tests/2018-11-04-20-17-09.bpo-21263.T3qo9r.rst b/Misc/NEWS.d/next/Tests/2018-11-04-20-17-09.bpo-21263.T3qo9r.rst deleted file mode 100644 index 9c6b4ef90706b3..00000000000000 --- a/Misc/NEWS.d/next/Tests/2018-11-04-20-17-09.bpo-21263.T3qo9r.rst +++ /dev/null @@ -1,4 +0,0 @@ -After several reports that test_gdb does not work properly on macOS and -since gdb is not shipped by default anymore, test_gdb is now skipped on -macOS when LLVM Clang has been used to compile Python. Patch by -Lysandros Nikolaou diff --git a/Misc/NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst b/Misc/NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst deleted file mode 100644 index 73a30f71927f1a..00000000000000 --- a/Misc/NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix ``mktime()`` overflow error in ``test_email``: run -``test_localtime_daylight_true_dst_true()`` and -``test_localtime_daylight_false_dst_true()`` with a specific timezone. diff --git a/Misc/NEWS.d/next/Tests/2018-11-30-17-18-56.bpo-35352.8bD7GC.rst b/Misc/NEWS.d/next/Tests/2018-11-30-17-18-56.bpo-35352.8bD7GC.rst deleted file mode 100644 index e479e9612e72e9..00000000000000 --- a/Misc/NEWS.d/next/Tests/2018-11-30-17-18-56.bpo-35352.8bD7GC.rst +++ /dev/null @@ -1 +0,0 @@ -Modify test_asyncio to use the certificate set from the test directory. diff --git a/Misc/NEWS.d/next/Tests/2018-12-09-01-27-29.bpo-33725.TaGayj.rst b/Misc/NEWS.d/next/Tests/2018-12-09-01-27-29.bpo-33725.TaGayj.rst deleted file mode 100644 index 425048cb37cfb2..00000000000000 --- a/Misc/NEWS.d/next/Tests/2018-12-09-01-27-29.bpo-33725.TaGayj.rst +++ /dev/null @@ -1,2 +0,0 @@ -test_multiprocessing_fork may crash on recent versions of macOS. Until the -issue is resolved, skip the test on macOS. diff --git a/Misc/NEWS.d/next/Tools-Demos/2018-10-15-13-22-28.bpo-34989.hU4fra.rst b/Misc/NEWS.d/next/Tools-Demos/2018-10-15-13-22-28.bpo-34989.hU4fra.rst deleted file mode 100644 index 53bb425ea7b487..00000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2018-10-15-13-22-28.bpo-34989.hU4fra.rst +++ /dev/null @@ -1,2 +0,0 @@ -python-gdb.py now handles errors on computing the line number of a Python -frame. diff --git a/Misc/NEWS.d/next/Windows/2018-03-08-20-02-38.bpo-32890.3jzFzY.rst b/Misc/NEWS.d/next/Windows/2018-03-08-20-02-38.bpo-32890.3jzFzY.rst deleted file mode 100644 index e8a63b3341924a..00000000000000 --- a/Misc/NEWS.d/next/Windows/2018-03-08-20-02-38.bpo-32890.3jzFzY.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix usage of GetLastError() instead of errno in os.execve() and -os.truncate(). diff --git a/Misc/NEWS.d/next/Windows/2018-12-10-15-01-13.bpo-35401.9L1onG.rst b/Misc/NEWS.d/next/Windows/2018-12-10-15-01-13.bpo-35401.9L1onG.rst deleted file mode 100644 index a804473fd6dbb0..00000000000000 --- a/Misc/NEWS.d/next/Windows/2018-12-10-15-01-13.bpo-35401.9L1onG.rst +++ /dev/null @@ -1 +0,0 @@ -Updates Windows build to OpenSSL 1.0.2q diff --git a/Misc/NEWS.d/next/macOS/2018-10-17-14-36-08.bpo-24658.Naddgx.rst b/Misc/NEWS.d/next/macOS/2018-10-17-14-36-08.bpo-24658.Naddgx.rst deleted file mode 100644 index ff660a125c64f3..00000000000000 --- a/Misc/NEWS.d/next/macOS/2018-10-17-14-36-08.bpo-24658.Naddgx.rst +++ /dev/null @@ -1 +0,0 @@ -On macOS, fix reading from and writing into a file with a size larger than 2 GiB. \ No newline at end of file diff --git a/Misc/NEWS.d/next/macOS/2018-10-18-23-54-55.bpo-35025.X4LFJg.rst b/Misc/NEWS.d/next/macOS/2018-10-18-23-54-55.bpo-35025.X4LFJg.rst deleted file mode 100644 index aebd1af9351c11..00000000000000 --- a/Misc/NEWS.d/next/macOS/2018-10-18-23-54-55.bpo-35025.X4LFJg.rst +++ /dev/null @@ -1,2 +0,0 @@ -Properly guard the use of the ``CLOCK_GETTIME`` et al. macros in ``timemodule`` -on macOS. diff --git a/Misc/NEWS.d/next/macOS/2018-12-10-02-37-11.bpo-35401.sFhD5z.rst b/Misc/NEWS.d/next/macOS/2018-12-10-02-37-11.bpo-35401.sFhD5z.rst deleted file mode 100644 index 113329d0f23162..00000000000000 --- a/Misc/NEWS.d/next/macOS/2018-12-10-02-37-11.bpo-35401.sFhD5z.rst +++ /dev/null @@ -1 +0,0 @@ -Update macOS installer to use OpenSSL 1.0.2q. diff --git a/Misc/NEWS.d/next/macOS/2018-12-10-02-44-48.bpo-35402.xzn8qJ.rst b/Misc/NEWS.d/next/macOS/2018-12-10-02-44-48.bpo-35402.xzn8qJ.rst deleted file mode 100644 index d6b503d10527d9..00000000000000 --- a/Misc/NEWS.d/next/macOS/2018-12-10-02-44-48.bpo-35402.xzn8qJ.rst +++ /dev/null @@ -1 +0,0 @@ -Update macOS installer to use Tcl/Tk 8.6.9.1. diff --git a/Misc/NEWS.d/next/macOS/2018-12-11-02-50-35.bpo-15663.6tnyd2.rst b/Misc/NEWS.d/next/macOS/2018-12-11-02-50-35.bpo-15663.6tnyd2.rst deleted file mode 100644 index 1aa7f11a05ef02..00000000000000 --- a/Misc/NEWS.d/next/macOS/2018-12-11-02-50-35.bpo-15663.6tnyd2.rst +++ /dev/null @@ -1,2 +0,0 @@ -The macOS 10.6+ installer now provides a private copy of Tcl/Tk 8.6, like -the 10.9+ installer does. diff --git a/README.rst b/README.rst index c9da1a1b88bd2e..39f672a3eb4a76 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.6.7+ -============================= +This is Python version 3.6.8 candidate 1 +======================================== .. image:: https://travis-ci.org/python/cpython.svg?branch=3.6 :alt: CPython build status on Travis CI diff --git a/configure b/configure index 8cd730d219e346..7286e6eb494d50 100755 --- a/configure +++ b/configure @@ -696,6 +696,7 @@ READELF ARFLAGS ac_ct_AR AR +USE_INLINE GNULD LINKCC LDVERSION @@ -783,7 +784,6 @@ infodir docdir oldincludedir includedir -runstatedir localstatedir sharedstatedir sysconfdir @@ -897,7 +897,6 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' -runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1150,15 +1149,6 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; - -runstatedir | --runstatedir | --runstatedi | --runstated \ - | --runstate | --runstat | --runsta | --runst | --runs \ - | --run | --ru | --r) - ac_prev=runstatedir ;; - -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ - | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ - | --run=* | --ru=* | --r=*) - runstatedir=$ac_optarg ;; - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1296,7 +1286,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir runstatedir + libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1449,7 +1439,6 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] From f2df9b9129193020b3ecacc6d1e9ee314963d08f Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 11 Dec 2018 21:08:25 -0500 Subject: [PATCH 2099/2287] Post release bump --- Include/patchlevel.h | 2 +- README.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index a0b45a3109d202..50ae6cb345d25c 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -23,7 +23,7 @@ #define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.6.8rc1" +#define PY_VERSION "3.6.8rc1+" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/README.rst b/README.rst index 39f672a3eb4a76..3e392b7efc3591 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.6.8 candidate 1 -======================================== +This is Python version 3.6.8 candidate 1+ +========================================= .. image:: https://travis-ci.org/python/cpython.svg?branch=3.6 :alt: CPython build status on Travis CI From 1fb312ce1f147ea84ecb6f5993a20d1a85c53dc3 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 14 Dec 2018 12:37:45 -0800 Subject: [PATCH 2100/2287] bpo-35450: reflect in docs that venv module is not always creating a copy of the Python binary (GH-11144) (GH-11168) --- Doc/using/venv-create.inc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Doc/using/venv-create.inc b/Doc/using/venv-create.inc index 7e8ae4a85f8af7..d2f76afc2789c9 100644 --- a/Doc/using/venv-create.inc +++ b/Doc/using/venv-create.inc @@ -7,9 +7,10 @@ Running this command creates the target directory (creating any parent directories that don't exist already) and places a ``pyvenv.cfg`` file in it with a ``home`` key pointing to the Python installation from which the command was run. It also creates a ``bin`` (or ``Scripts`` on Windows) subdirectory -containing a copy of the ``python`` binary (or binaries, in the case of -Windows). It also creates an (initially empty) ``lib/pythonX.Y/site-packages`` -subdirectory (on Windows, this is ``Lib\site-packages``). If an existing +containing a copy/symlink of the Python binary/binaries (as appropriate for the +platform or arguments used at environment creation time). It also creates an +(initially empty) ``lib/pythonX.Y/site-packages`` subdirectory +(on Windows, this is ``Lib\site-packages``). If an existing directory is specified, it will be re-used. .. deprecated:: 3.6 From 789b0ee023f14385a2fd635272768c3b55a99773 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Thu, 20 Dec 2018 11:11:39 -0800 Subject: [PATCH 2101/2287] bpo-35482: Fixes HTML escaping in CHM index and build location of NEWS file (GH-11224) (GH-11251) --- Doc/make.bat | 10 ++++++---- Doc/tools/extensions/escape4chm.py | 20 +++++++++++++++++++- Doc/tools/extensions/pyspecific.py | 6 ++++-- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/Doc/make.bat b/Doc/make.bat index d28dae78e86d4f..562beb35ae5b63 100644 --- a/Doc/make.bat +++ b/Doc/make.bat @@ -16,7 +16,7 @@ if not defined SPHINXBUILD ( %PYTHON% -m pip install sphinx if errorlevel 1 exit /B ) - set SPHINXBUILD=%PYTHON% -c "import sphinx, sys; sys.argv[0] = 'sphinx-build'; sys.exit(sphinx.main())" + set SPHINXBUILD=%PYTHON% -c "import sphinx.cmd.build, sys; sys.exit(sphinx.cmd.build.main())" ) %PYTHON% -c "import python_docs_theme" > nul 2> nul @@ -115,13 +115,15 @@ goto end :build if not exist "%BUILDDIR%" mkdir "%BUILDDIR%" +rem PY_MISC_NEWS_DIR is also used by our Sphinx extension in tools/extensions/pyspecific.py +if not defined PY_MISC_NEWS_DIR set PY_MISC_NEWS_DIR=%BUILDDIR%\%1 if exist ..\Misc\NEWS ( - echo.Copying Misc\NEWS to build\NEWS - copy ..\Misc\NEWS build\NEWS > nul + echo.Copying Misc\NEWS to %PY_MISC_NEWS_DIR%\NEWS + copy ..\Misc\NEWS "%PY_MISC_NEWS_DIR%\NEWS" > nul ) else if exist ..\Misc\NEWS.D ( if defined BLURB ( echo.Merging Misc/NEWS with %BLURB% - %BLURB% merge -f build\NEWS + %BLURB% merge -f "%PY_MISC_NEWS_DIR%\NEWS" ) else ( echo.No Misc/NEWS file and Blurb is not available. exit /B 1 diff --git a/Doc/tools/extensions/escape4chm.py b/Doc/tools/extensions/escape4chm.py index 6f2e35725b3791..e9999716251734 100644 --- a/Doc/tools/extensions/escape4chm.py +++ b/Doc/tools/extensions/escape4chm.py @@ -8,6 +8,8 @@ import re from html.entities import codepoint2name +from sphinx.util.logging import getLogger + # escape the characters which codepoint > 0x7F def _process(string): def escape(matchobj): @@ -23,7 +25,7 @@ def escape(matchobj): def escape_for_chm(app, pagename, templatename, context, doctree): # only works for .chm output - if not hasattr(app.builder, 'name') or app.builder.name != 'htmlhelp': + if getattr(app.builder, 'name', '') != 'htmlhelp': return # escape the `body` part to 7-bit ASCII @@ -31,9 +33,25 @@ def escape_for_chm(app, pagename, templatename, context, doctree): if body is not None: context['body'] = _process(body) +def fixup_keywords(app, exception): + # only works for .chm output + if getattr(app.builder, 'name', '') != 'htmlhelp' or exception: + return + + getLogger(__name__).info('fixing HTML escapes in keywords file...') + outdir = app.builder.outdir + outname = app.builder.config.htmlhelp_basename + with app.builder.open_file(outdir, outname + '.hhk', 'r') as f: + index = f.read() + with app.builder.open_file(outdir, outname + '.hhk', 'w') as f: + f.write(index.replace(''', ''')) + def setup(app): # `html-page-context` event emitted when the HTML builder has # created a context dictionary to render a template with. app.connect('html-page-context', escape_for_chm) + # `build-finished` event emitted when all the files have been + # output. + app.connect('build-finished', fixup_keywords) return {'version': '1.0', 'parallel_read_safe': True} diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index 5b2c3156376698..dec7f0c779ab06 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -11,7 +11,7 @@ import re import codecs -from os import path +from os import getenv, path from time import asctime from pprint import pformat from docutils.io import StringOutput @@ -253,7 +253,9 @@ def run(self): fname = self.arguments[0] source = self.state_machine.input_lines.source( self.lineno - self.state_machine.input_offset - 1) - source_dir = path.dirname(path.abspath(source)) + source_dir = getenv('PY_MISC_NEWS_DIR') + if not source_dir: + source_dir = path.dirname(path.abspath(source)) fpath = path.join(source_dir, fname) self.state.document.settings.record_dependencies.add(fpath) try: From 782e1d537778d93eb4cba1343f71bfc51e7e3c00 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 20 Dec 2018 20:46:07 +0100 Subject: [PATCH 2102/2287] bpo-35499: make profile-opt don't override CFLAGS_NODIST (GH-11164) (GH-11267) "make profile-opt" no longer replaces CFLAGS_NODIST with CFLAGS. It now adds profile-guided optimization (PGO) flags to CFLAGS_NODIST, existing CFLAGS_NODIST flags are kept. (cherry picked from commit 640ed520dd6a43a8bf470b79542f58b5d57af9de) --- Makefile.pre.in | 4 ++-- .../next/Build/2018-12-14-19-36-05.bpo-35499.9yAldM.rst | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2018-12-14-19-36-05.bpo-35499.9yAldM.rst diff --git a/Makefile.pre.in b/Makefile.pre.in index 258236d3645096..af9504dfac7f3b 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -472,7 +472,7 @@ profile-opt: $(MAKE) profile-removal build_all_generate_profile: - $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS) $(PGO_PROF_GEN_FLAG)" LDFLAGS="$(LDFLAGS) $(PGO_PROF_GEN_FLAG)" LIBS="$(LIBS)" + $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS_NODIST) $(PGO_PROF_GEN_FLAG)" LDFLAGS="$(LDFLAGS) $(PGO_PROF_GEN_FLAG)" LIBS="$(LIBS)" run_profile_task: : # FIXME: can't run for a cross build @@ -482,7 +482,7 @@ build_all_merge_profile: $(LLVM_PROF_MERGER) build_all_use_profile: - $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS) $(PGO_PROF_USE_FLAG)" LDFLAGS="$(LDFLAGS)" + $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS_NODIST) $(PGO_PROF_USE_FLAG)" LDFLAGS="$(LDFLAGS)" # Compile and run with gcov .PHONY=coverage coverage-lcov coverage-report diff --git a/Misc/NEWS.d/next/Build/2018-12-14-19-36-05.bpo-35499.9yAldM.rst b/Misc/NEWS.d/next/Build/2018-12-14-19-36-05.bpo-35499.9yAldM.rst new file mode 100644 index 00000000000000..ed730b9d9b4a49 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2018-12-14-19-36-05.bpo-35499.9yAldM.rst @@ -0,0 +1,3 @@ +``make profile-opt`` no longer replaces ``CFLAGS_NODIST`` with ``CFLAGS``. It +now adds profile-guided optimization (PGO) flags to ``CFLAGS_NODIST``: existing +``CFLAGS_NODIST`` flags are kept. From 70db385944ecf2ceed10ed7d91fce68399f9ca8a Mon Sep 17 00:00:00 2001 From: Myles Borins Date: Thu, 20 Dec 2018 15:28:28 -0500 Subject: [PATCH 2103/2287] [3.6] bpo-31715 Add mimetype for extension .mjs (GH-3908) (GH-10976) (cherry picked from commit 0854b92cd2) --- Lib/mimetypes.py | 1 + .../NEWS.d/next/Library/2018-08-15-16-22-30.bpo-31715.Iw8jS8.rst | 1 + 2 files changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2018-08-15-16-22-30.bpo-31715.Iw8jS8.rst diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py index 5a7e6493bf51ff..7321354ccc1356 100644 --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -450,6 +450,7 @@ def _default_mime_types(): '.mht' : 'message/rfc822', '.mhtml' : 'message/rfc822', '.mif' : 'application/x-mif', + '.mjs' : 'application/javascript', '.mov' : 'video/quicktime', '.movie' : 'video/x-sgi-movie', '.mp2' : 'audio/mpeg', diff --git a/Misc/NEWS.d/next/Library/2018-08-15-16-22-30.bpo-31715.Iw8jS8.rst b/Misc/NEWS.d/next/Library/2018-08-15-16-22-30.bpo-31715.Iw8jS8.rst new file mode 100644 index 00000000000000..eacba28f9fd987 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-08-15-16-22-30.bpo-31715.Iw8jS8.rst @@ -0,0 +1 @@ +Associate ``.mjs`` file extension with ``application/javascript`` MIME Type. From a21bedf9edeacce6f0de3b2df0783e2ad6aa3b18 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 20 Dec 2018 21:31:22 +0100 Subject: [PATCH 2104/2287] [3.6] bpo-35257: Avoid leaking LTO linker flags into distutils (GH-10900) (GH-11265) When compiling 3rd party C extensions, the linker flags used by the compiler for the interpreter and the stdlib modules, will get leaked into distutils. In order to avoid that, the PY_CORE_LDFLAGS and PY_LDFLAGS_NODIST are introduced to keep those flags separated. (cherry picked from commit cf10a750f4b50b6775719cfb17bee00bc3a9c60b) --- Lib/_osx_support.py | 2 +- Lib/test/pythoninfo.py | 2 ++ Lib/test/test__osx_support.py | 2 +- Makefile.pre.in | 25 ++++++++++++------- .../2018-12-05-22-28-40.bpo-35257.dmcd_s.rst | 2 ++ configure | 4 ++- configure.ac | 3 ++- setup.py | 15 +++++++---- 8 files changed, 37 insertions(+), 18 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2018-12-05-22-28-40.bpo-35257.dmcd_s.rst diff --git a/Lib/_osx_support.py b/Lib/_osx_support.py index e37852e2536c33..db6674ea293fb0 100644 --- a/Lib/_osx_support.py +++ b/Lib/_osx_support.py @@ -17,7 +17,7 @@ _UNIVERSAL_CONFIG_VARS = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS', 'BASECFLAGS', 'BLDSHARED', 'LDSHARED', 'CC', 'CXX', 'PY_CFLAGS', 'PY_LDFLAGS', 'PY_CPPFLAGS', - 'PY_CORE_CFLAGS') + 'PY_CORE_CFLAGS', 'PY_CORE_LDFLAGS') # configuration variables that may contain compiler calls _COMPILER_CONFIG_VARS = ('BLDSHARED', 'LDSHARED', 'CC', 'CXX') diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index c453340b80d7c5..c5586b45a5ff56 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -407,7 +407,9 @@ def collect_sysconfig(info_add): 'OPT', 'PY_CFLAGS', 'PY_CFLAGS_NODIST', + 'PY_CORE_LDFLAGS', 'PY_LDFLAGS', + 'PY_LDFLAGS_NODIST', 'Py_DEBUG', 'Py_ENABLE_SHARED', 'SHELL', diff --git a/Lib/test/test__osx_support.py b/Lib/test/test__osx_support.py index bcba8caa296484..388a2b1a84b17c 100644 --- a/Lib/test/test__osx_support.py +++ b/Lib/test/test__osx_support.py @@ -24,7 +24,7 @@ def setUp(self): for cv in ('CFLAGS', 'LDFLAGS', 'CPPFLAGS', 'BASECFLAGS', 'BLDSHARED', 'LDSHARED', 'CC', 'CXX', 'PY_CFLAGS', 'PY_LDFLAGS', 'PY_CPPFLAGS', - 'PY_CORE_CFLAGS'): + 'PY_CORE_CFLAGS', 'PY_CORE_LDFLAGS'): if cv in self.env: self.env.unset(cv) diff --git a/Makefile.pre.in b/Makefile.pre.in index af9504dfac7f3b..da259f89de6304 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -84,6 +84,10 @@ CONFIGURE_CFLAGS= @CFLAGS@ # Use it when a compiler flag should _not_ be part of the distutils CFLAGS # once Python is installed (Issue #21121). CONFIGURE_CFLAGS_NODIST=@CFLAGS_NODIST@ +# LDFLAGS_NODIST is used in the same manner as CFLAGS_NODIST. +# Use it when a linker flag should _not_ be part of the distutils LDFLAGS +# once Python is installed (bpo-35257) +CONFIGURE_LDFLAGS_NODIST=@LDFLAGS_NODIST@ CONFIGURE_CPPFLAGS= @CPPFLAGS@ CONFIGURE_LDFLAGS= @LDFLAGS@ # Avoid assigning CFLAGS, LDFLAGS, etc. so users can use them on the @@ -96,6 +100,7 @@ PY_CFLAGS_NODIST=$(CONFIGURE_CFLAGS_NODIST) $(CFLAGS_NODIST) # environment variables PY_CPPFLAGS= $(BASECPPFLAGS) -I. -I$(srcdir)/Include $(CONFIGURE_CPPFLAGS) $(CPPFLAGS) PY_LDFLAGS= $(CONFIGURE_LDFLAGS) $(LDFLAGS) +PY_LDFLAGS_NODIST=$(CONFIGURE_LDFLAGS_NODIST) $(LDFLAGS_NODIST) NO_AS_NEEDED= @NO_AS_NEEDED@ LDLAST= @LDLAST@ SGI_ABI= @SGI_ABI@ @@ -106,6 +111,8 @@ ARFLAGS= @ARFLAGS@ CFLAGSFORSHARED=@CFLAGSFORSHARED@ # C flags used for building the interpreter object files PY_CORE_CFLAGS= $(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED) -DPy_BUILD_CORE +# Linker flags used for building the interpreter object files +PY_CORE_LDFLAGS=$(PY_LDFLAGS) $(PY_LDFLAGS_NODIST) # Strict or non-strict aliasing flags used to compile dtoa.c, see above CFLAGS_ALIASING=@CFLAGS_ALIASING@ @@ -145,7 +152,7 @@ CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(LDVERSION) SHLIB_SUFFIX= @SHLIB_SUFFIX@ EXT_SUFFIX= @EXT_SUFFIX@ LDSHARED= @LDSHARED@ $(PY_LDFLAGS) -BLDSHARED= @BLDSHARED@ $(PY_LDFLAGS) +BLDSHARED= @BLDSHARED@ $(PY_LDFLAGS_NODIST) LDCXXSHARED= @LDCXXSHARED@ DESTSHARED= $(BINLIBDEST)/lib-dynload @@ -472,7 +479,7 @@ profile-opt: $(MAKE) profile-removal build_all_generate_profile: - $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS_NODIST) $(PGO_PROF_GEN_FLAG)" LDFLAGS="$(LDFLAGS) $(PGO_PROF_GEN_FLAG)" LIBS="$(LIBS)" + $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS_NODIST) $(PGO_PROF_GEN_FLAG)" LDFLAGS_NODIST="$(LDFLAGS_NODIST) $(PGO_PROF_GEN_FLAG)" LIBS="$(LIBS)" run_profile_task: : # FIXME: can't run for a cross build @@ -482,7 +489,7 @@ build_all_merge_profile: $(LLVM_PROF_MERGER) build_all_use_profile: - $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS_NODIST) $(PGO_PROF_USE_FLAG)" LDFLAGS="$(LDFLAGS)" + $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS_NODIST) $(PGO_PROF_USE_FLAG)" LDFLAGS_NODIST="$(LDFLAGS_NODIST)" # Compile and run with gcov .PHONY=coverage coverage-lcov coverage-report @@ -543,7 +550,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c # Build the interpreter $(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) - $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) + $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) platform: $(BUILDPYTHON) pybuilddir.txt $(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import sys ; from sysconfig import get_platform ; print("%s-%d.%d" % (get_platform(), *sys.version_info[:2]))' >platform @@ -608,7 +615,7 @@ libpython3.so: libpython$(LDVERSION).so $(BLDSHARED) $(NO_AS_NEEDED) -o $@ -Wl,-h$@ $^ libpython$(LDVERSION).dylib: $(LIBRARY_OBJS) - $(CC) -dynamiclib -Wl,-single_module $(PY_LDFLAGS) -undefined dynamic_lookup -Wl,-install_name,$(prefix)/lib/libpython$(LDVERSION).dylib -Wl,-compatibility_version,$(VERSION) -Wl,-current_version,$(VERSION) -o $@ $(LIBRARY_OBJS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \ + $(CC) -dynamiclib -Wl,-single_module $(PY_CORE_LDFLAGS) -undefined dynamic_lookup -Wl,-install_name,$(prefix)/lib/libpython$(LDVERSION).dylib -Wl,-compatibility_version,$(VERSION) -Wl,-current_version,$(VERSION) -o $@ $(LIBRARY_OBJS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \ libpython$(VERSION).sl: $(LIBRARY_OBJS) @@ -633,7 +640,7 @@ $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK): \ $(LIBRARY) \ $(RESSRCDIR)/Info.plist $(INSTALL) -d -m $(DIRMODE) $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION) - $(CC) -o $(LDLIBRARY) $(PY_LDFLAGS) -dynamiclib \ + $(CC) -o $(LDLIBRARY) $(PY_CORE_LDFLAGS) -dynamiclib \ -all_load $(LIBRARY) -Wl,-single_module \ -install_name $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK) \ -compatibility_version $(VERSION) \ @@ -686,7 +693,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.dist fi Programs/_testembed: Programs/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) - $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) + $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) ############################################################################ # Importlib @@ -694,7 +701,7 @@ Programs/_testembed: Programs/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) Programs/_freeze_importlib.o: Programs/_freeze_importlib.c Makefile Programs/_freeze_importlib: Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) - $(LINKCC) $(PY_LDFLAGS) -o $@ Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) + $(LINKCC) $(PY_CORE_LDFLAGS) -o $@ Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) .PHONY: regen-importlib regen-importlib: Programs/_freeze_importlib @@ -776,7 +783,7 @@ Python/sysmodule.o: $(srcdir)/Python/sysmodule.c Makefile $(IO_OBJS): $(IO_H) $(PGEN): $(PGENOBJS) - $(CC) $(OPT) $(PY_LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN) + $(CC) $(OPT) $(PY_CORE_LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN) .PHONY: regen-grammar regen-grammar: $(PGEN) diff --git a/Misc/NEWS.d/next/Build/2018-12-05-22-28-40.bpo-35257.dmcd_s.rst b/Misc/NEWS.d/next/Build/2018-12-05-22-28-40.bpo-35257.dmcd_s.rst new file mode 100644 index 00000000000000..fad25257829939 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2018-12-05-22-28-40.bpo-35257.dmcd_s.rst @@ -0,0 +1,2 @@ +Avoid leaking the linker flags from Link Time Optimizations (LTO) +into distutils when compiling C extensions. \ No newline at end of file diff --git a/configure b/configure index 7286e6eb494d50..e39c16eee2b903 100755 --- a/configure +++ b/configure @@ -666,6 +666,7 @@ SHLIB_SUFFIX LIBTOOL_CRUFT OTHER_LIBTOOL_OPT UNIVERSAL_ARCH_FLAGS +LDFLAGS_NODIST CFLAGS_NODIST BASECFLAGS CFLAGS_ALIASING @@ -6716,7 +6717,7 @@ $as_echo "$as_me: llvm-ar found via xcrun: ${LLVM_AR}" >&6;} fi CFLAGS_NODIST="$CFLAGS_NODIST $LTOFLAGS" - LDFLAGS="$LDFLAGS $LTOFLAGS" + LDFLAGS_NODIST="$LDFLAGS_NODIST $LTOFLAGS" fi # Enable PGO flags. @@ -6968,6 +6969,7 @@ fi + # The -arch flags for universal builds on OSX UNIVERSAL_ARCH_FLAGS= diff --git a/configure.ac b/configure.ac index bb14a87e5463b3..cf280506bd011f 100644 --- a/configure.ac +++ b/configure.ac @@ -1401,7 +1401,7 @@ if test "$Py_LTO" = 'true' ; then fi CFLAGS_NODIST="$CFLAGS_NODIST $LTOFLAGS" - LDFLAGS="$LDFLAGS $LTOFLAGS" + LDFLAGS_NODIST="$LDFLAGS_NODIST $LTOFLAGS" fi # Enable PGO flags. @@ -1561,6 +1561,7 @@ fi AC_SUBST(BASECFLAGS) AC_SUBST(CFLAGS_NODIST) +AC_SUBST(LDFLAGS_NODIST) # The -arch flags for universal builds on OSX UNIVERSAL_ARCH_FLAGS= diff --git a/setup.py b/setup.py index 49193f67a6117a..fb95fb5298f36e 100644 --- a/setup.py +++ b/setup.py @@ -18,11 +18,16 @@ cross_compiling = "_PYTHON_HOST_PLATFORM" in os.environ -# Add special CFLAGS reserved for building the interpreter and the stdlib -# modules (Issue #21121). -cflags = sysconfig.get_config_var('CFLAGS') -py_cflags_nodist = sysconfig.get_config_var('PY_CFLAGS_NODIST') -sysconfig.get_config_vars()['CFLAGS'] = cflags + ' ' + py_cflags_nodist +# Set common compiler and linker flags derived from the Makefile, +# reserved for building the interpreter and the stdlib modules. +# See bpo-21121 and bpo-35257 +def set_compiler_flags(compiler_flags, compiler_py_flags_nodist): + flags = sysconfig.get_config_var(compiler_flags) + py_flags_nodist = sysconfig.get_config_var(compiler_py_flags_nodist) + sysconfig.get_config_vars()[compiler_flags] = flags + ' ' + py_flags_nodist + +set_compiler_flags('CFLAGS', 'PY_CFLAGS_NODIST') +set_compiler_flags('LDFLAGS', 'PY_LDFLAGS_NODIST') class Dummy: """Hack for parallel build""" From 75f187478603de33c15f501a947207bfe8ba833f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 20 Dec 2018 12:50:00 -0800 Subject: [PATCH 2105/2287] bpo-35475: Add more PyImport* functions in refcounts.dat. (GH-11142) (GH-11199) (cherry picked from commit bdabb0737c631835b246c9823852d20331243315) Co-authored-by: Serhiy Storchaka --- Doc/data/refcounts.dat | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat index 8b469f4aac9a48..0ac62abc7d4cd9 100644 --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -516,6 +516,9 @@ Py_InitModule4:int:apiver::usually provided by Py_InitModule or Py_InitModule3 PyImport_AddModule:PyObject*::0:reference borrowed from sys.modules PyImport_AddModule:const char*:name:: +PyImport_AddModuleObject:PyObject*::0:reference borrowed from sys.modules +PyImport_AddModuleObject:PyObject*:name:0: + PyImport_Cleanup:void::: PyImport_ExecCodeModule:PyObject*::+1: @@ -527,6 +530,21 @@ PyImport_ExecCodeModuleEx:const char*:name:: PyImport_ExecCodeModuleEx:PyObject*:co:0: PyImport_ExecCodeModuleEx:const char*:pathname:: +PyImport_ExecCodeModuleObject:PyObject*::+1: +PyImport_ExecCodeModuleObject:const char*:name:: +PyImport_ExecCodeModuleObject:PyObject*:co:0: +PyImport_ExecCodeModuleObject:PyObject*:pathname:0: +PyImport_ExecCodeModuleObject:PyObject*:cpathname:0: + +PyImport_ExecCodeModuleWithPathnames:PyObject*::+1: +PyImport_ExecCodeModuleWithPathnames:const char*:name:: +PyImport_ExecCodeModuleWithPathnames:PyObject*:co:0: +PyImport_ExecCodeModuleWithPathnames:const char*:pathname:: +PyImport_ExecCodeModuleWithPathnames:const char*:cpathname:: + +PyImport_GetImporter:PyObject*::+1: +PyImport_GetImporter:PyObject*:path:0: + PyImport_GetMagicNumber:long::: PyImport_GetModuleDict:PyObject*::0: @@ -537,6 +555,9 @@ PyImport_Import:PyObject*:name:0: PyImport_ImportFrozenModule:int::: PyImport_ImportFrozenModule:const char*::: +PyImport_ImportFrozenModuleObject:int::: +PyImport_ImportFrozenModuleObject:PyObject*::+1: + PyImport_ImportModule:PyObject*::+1: PyImport_ImportModule:const char*:name:: @@ -553,6 +574,13 @@ PyImport_ImportModuleLevel:PyObject*:locals:0:??? PyImport_ImportModuleLevel:PyObject*:fromlist:0:??? PyImport_ImportModuleLevel:int:level:: +PyImport_ImportModuleLevelObject:PyObject*::+1: +PyImport_ImportModuleLevelObject:PyObject*:name:0: +PyImport_ImportModuleLevelObject:PyObject*:globals:0:??? +PyImport_ImportModuleLevelObject:PyObject*:locals:0:??? +PyImport_ImportModuleLevelObject:PyObject*:fromlist:0:??? +PyImport_ImportModuleLevelObject:int:level:: + PyImport_ReloadModule:PyObject*::+1: PyImport_ReloadModule:PyObject*:m:0: From ff740db42326082fac7d415ae9aff148628a83ed Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 20 Dec 2018 13:28:30 -0800 Subject: [PATCH 2106/2287] bpo-35461: Document C API functions which suppress exceptions. (GH-11119) (GH-11210) (cherry picked from commit 3fcc1e08db6fb7e17acc4a8f63be3e42f52f094b) Co-authored-by: Serhiy Storchaka --- Doc/c-api/buffer.rst | 4 ++-- Doc/c-api/codec.rst | 2 +- Doc/c-api/dict.rst | 9 +++++++++ Doc/c-api/mapping.rst | 8 ++++++++ Doc/c-api/number.rst | 1 + Doc/c-api/objbuffer.rst | 6 +++++- Doc/c-api/object.rst | 9 +++++++++ 7 files changed, 35 insertions(+), 4 deletions(-) diff --git a/Doc/c-api/buffer.rst b/Doc/c-api/buffer.rst index 33abb5bb94d9de..c7c1e3cc745ac4 100644 --- a/Doc/c-api/buffer.rst +++ b/Doc/c-api/buffer.rst @@ -429,7 +429,7 @@ Buffer-related functions Return ``1`` if *obj* supports the buffer interface otherwise ``0``. When ``1`` is returned, it doesn't guarantee that :c:func:`PyObject_GetBuffer` will - succeed. + succeed. This function always succeeds. .. c:function:: int PyObject_GetBuffer(PyObject *exporter, Py_buffer *view, int flags) @@ -470,7 +470,7 @@ Buffer-related functions Return ``1`` if the memory defined by the *view* is C-style (*order* is ``'C'``) or Fortran-style (*order* is ``'F'``) :term:`contiguous` or either one - (*order* is ``'A'``). Return ``0`` otherwise. + (*order* is ``'A'``). Return ``0`` otherwise. This function always succeeds. .. c:function:: int PyBuffer_ToContiguous(void *buf, Py_buffer *src, Py_ssize_t len, char order) diff --git a/Doc/c-api/codec.rst b/Doc/c-api/codec.rst index dfe3d436e5f4b7..c55f19970e125d 100644 --- a/Doc/c-api/codec.rst +++ b/Doc/c-api/codec.rst @@ -13,7 +13,7 @@ Codec registry and support functions .. c:function:: int PyCodec_KnownEncoding(const char *encoding) Return ``1`` or ``0`` depending on whether there is a registered codec for - the given *encoding*. + the given *encoding*. This function always succeeds. .. c:function:: PyObject* PyCodec_Encode(PyObject *object, const char *encoding, const char *errors) diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst index cfa5e13b9feef8..68ca25ca548d60 100644 --- a/Doc/c-api/dict.rst +++ b/Doc/c-api/dict.rst @@ -95,6 +95,10 @@ Dictionary Objects Return the object from dictionary *p* which has a key *key*. Return *NULL* if the key *key* is not present, but *without* setting an exception. + Note that exceptions which occur while calling :meth:`__hash__` and + :meth:`__eq__` methods will get suppressed. + To get error reporting use :c:func:`PyDict_GetItemWithError()` instead. + .. c:function:: PyObject* PyDict_GetItemWithError(PyObject *p, PyObject *key) @@ -109,6 +113,11 @@ Dictionary Objects This is the same as :c:func:`PyDict_GetItem`, but *key* is specified as a :c:type:`char\*`, rather than a :c:type:`PyObject\*`. + Note that exceptions which occur while calling :meth:`__hash__` and + :meth:`__eq__` methods and creating a temporary string object + will get suppressed. + To get error reporting use :c:func:`PyDict_GetItemWithError()` instead. + .. c:function:: PyObject* PyDict_SetDefault(PyObject *p, PyObject *key, PyObject *default) diff --git a/Doc/c-api/mapping.rst b/Doc/c-api/mapping.rst index c16fcf4439d4da..cb68ef82ca8344 100644 --- a/Doc/c-api/mapping.rst +++ b/Doc/c-api/mapping.rst @@ -60,6 +60,10 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and This is equivalent to the Python expression ``key in o``. This function always succeeds. + Note that exceptions which occur while calling the :meth:`__getitem__` + method will get suppressed. + To get error reporting use :c:func:`PyObject_GetItem()` instead. + .. c:function:: int PyMapping_HasKeyString(PyObject *o, const char *key) @@ -67,6 +71,10 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and This is equivalent to the Python expression ``key in o``. This function always succeeds. + Note that exceptions which occur while calling the :meth:`__getitem__` + method and creating a temporary string object will get suppressed. + To get error reporting use :c:func:`PyMapping_GetItemString()` instead. + .. c:function:: PyObject* PyMapping_Keys(PyObject *o) diff --git a/Doc/c-api/number.rst b/Doc/c-api/number.rst index 3c7605a67fa226..296b21c132b79a 100644 --- a/Doc/c-api/number.rst +++ b/Doc/c-api/number.rst @@ -280,3 +280,4 @@ Number Protocol Returns ``1`` if *o* is an index integer (has the nb_index slot of the tp_as_number structure filled in), and ``0`` otherwise. + This function always succeeds. diff --git a/Doc/c-api/objbuffer.rst b/Doc/c-api/objbuffer.rst index e7f4fde00256db..9ad7c571c4d8c1 100644 --- a/Doc/c-api/objbuffer.rst +++ b/Doc/c-api/objbuffer.rst @@ -39,7 +39,11 @@ an object, and :c:func:`PyBuffer_Release` when the buffer view can be released. .. c:function:: int PyObject_CheckReadBuffer(PyObject *o) Returns ``1`` if *o* supports the single-segment readable buffer interface. - Otherwise returns ``0``. + Otherwise returns ``0``. This function always succeeds. + + Note that this function tries to get and release a buffer, and exceptions + which occur while calling correspoding functions will get suppressed. + To get error reporting use :c:func:`PyObject_GetBuffer()` instead. .. c:function:: int PyObject_AsWriteBuffer(PyObject *obj, void **buffer, Py_ssize_t *buffer_len) diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index 8692a2c14ca20f..ea0aa8df31e609 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -33,6 +33,10 @@ Object Protocol is equivalent to the Python expression ``hasattr(o, attr_name)``. This function always succeeds. + Note that exceptions which occur while calling :meth:`__getattr__` and + :meth:`__getattribute__` methods will get suppressed. + To get error reporting use :c:func:`PyObject_GetAttr()` instead. + .. c:function:: int PyObject_HasAttrString(PyObject *o, const char *attr_name) @@ -40,6 +44,11 @@ Object Protocol is equivalent to the Python expression ``hasattr(o, attr_name)``. This function always succeeds. + Note that exceptions which occur while calling :meth:`__getattr__` and + :meth:`__getattribute__` methods and creating a temporary string object + will get suppressed. + To get error reporting use :c:func:`PyObject_GetAttrString()` instead. + .. c:function:: PyObject* PyObject_GetAttr(PyObject *o, PyObject *attr_name) From 3a26b59ed61c0779622f7184f440328858d5d23b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 20 Dec 2018 13:34:21 -0800 Subject: [PATCH 2107/2287] Fix documented signatures for C API functions. (GH-11236) (GH-11240) (cherry picked from commit 57dd79e6f7f33bb4e6817ac58c9cb91de99675e0) Co-authored-by: Serhiy Storchaka --- Doc/c-api/tuple.rst | 2 +- Doc/c-api/unicode.rst | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/c-api/tuple.rst b/Doc/c-api/tuple.rst index 3922d50f80a2d2..ab8ee9abf4c46a 100644 --- a/Doc/c-api/tuple.rst +++ b/Doc/c-api/tuple.rst @@ -209,7 +209,7 @@ type. This function "steals" a reference to *o*. -.. c:function:: PyObject* PyStructSequence_SET_ITEM(PyObject *p, Py_ssize_t *pos, PyObject *o) +.. c:function:: void PyStructSequence_SET_ITEM(PyObject *p, Py_ssize_t *pos, PyObject *o) Macro equivalent of :c:func:`PyStructSequence_SetItem`. diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index b9acaec949b252..55d5b070ff3abb 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -925,7 +925,7 @@ wchar_t Support Return *NULL* on failure. -.. c:function:: Py_ssize_t PyUnicode_AsWideChar(PyUnicodeObject *unicode, wchar_t *w, Py_ssize_t size) +.. c:function:: Py_ssize_t PyUnicode_AsWideChar(PyObject *unicode, wchar_t *w, Py_ssize_t size) Copy the Unicode object contents into the :c:type:`wchar_t` buffer *w*. At most *size* :c:type:`wchar_t` characters are copied (excluding a possibly trailing @@ -1324,7 +1324,7 @@ These are the "Raw Unicode Escape" codec APIs: .. c:function:: PyObject* PyUnicode_EncodeRawUnicodeEscape(const Py_UNICODE *s, \ - Py_ssize_t size, const char *errors) + Py_ssize_t size) Encode the :c:type:`Py_UNICODE` buffer of the given *size* using Raw-Unicode-Escape and return a bytes object. Return *NULL* if an exception was raised by the codec. @@ -1493,8 +1493,8 @@ the user settings on the machine running the codec. Return *NULL* if an exception was raised by the codec. -.. c:function:: PyObject* PyUnicode_DecodeMBCSStateful(const char *s, int size, \ - const char *errors, int *consumed) +.. c:function:: PyObject* PyUnicode_DecodeMBCSStateful(const char *s, Py_ssize_t size, \ + const char *errors, Py_ssize_t *consumed) If *consumed* is *NULL*, behave like :c:func:`PyUnicode_DecodeMBCS`. If *consumed* is not *NULL*, :c:func:`PyUnicode_DecodeMBCSStateful` will not decode From 5241ecff161ccf34083b6a824d1ae6d79917d889 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 20 Dec 2018 13:52:09 -0800 Subject: [PATCH 2108/2287] bpo-35259: Limit `Py_FinalizeEx()` to `Py_LIMITED_API >= 0x03060000`. (GH-10620) (GH-11269) (cherry picked from commit 3e8f962e63c2f929604443531a9a3aced242f3e8) Co-authored-by: Arthur Neufeld --- Include/pylifecycle.h | 2 ++ Misc/NEWS.d/next/C API/2018-11-22-13-52-36.bpo-35259.p07c61.rst | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/C API/2018-11-22-13-52-36.bpo-35259.p07c61.rst diff --git a/Include/pylifecycle.h b/Include/pylifecycle.h index 01abfa9fcd6fb7..9a528218e48150 100644 --- a/Include/pylifecycle.h +++ b/Include/pylifecycle.h @@ -27,7 +27,9 @@ PyAPI_FUNC(void) Py_InitializeEx(int); PyAPI_FUNC(void) _Py_InitializeEx_Private(int, int); #endif PyAPI_FUNC(void) Py_Finalize(void); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 PyAPI_FUNC(int) Py_FinalizeEx(void); +#endif PyAPI_FUNC(int) Py_IsInitialized(void); PyAPI_FUNC(PyThreadState *) Py_NewInterpreter(void); PyAPI_FUNC(void) Py_EndInterpreter(PyThreadState *); diff --git a/Misc/NEWS.d/next/C API/2018-11-22-13-52-36.bpo-35259.p07c61.rst b/Misc/NEWS.d/next/C API/2018-11-22-13-52-36.bpo-35259.p07c61.rst new file mode 100644 index 00000000000000..1f4801cbfb715a --- /dev/null +++ b/Misc/NEWS.d/next/C API/2018-11-22-13-52-36.bpo-35259.p07c61.rst @@ -0,0 +1,2 @@ +Conditionally declare :c:func:`Py_FinalizeEx()` (new in 3.6) based on +Py_LIMITED_API. Patch by Arthur Neufeld. From 68f5dfd955ee7a16fabf90d7c370159cc0ca9b75 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 23 Dec 2018 12:54:57 -0800 Subject: [PATCH 2109/2287] bpo-35257: fix broken BLDSHARED - needs LDFLAGS too (GH-11297) (GH-11299) `BLDSHARED` needs to have both `LDFLAGS` and `LDFLAGS_NODIST`, not just `LDFLAGS_NODIST`; `PY_CORE_LDFLAGS` provides both. For example, as it stands now with just `LDFLAGS_NODIST`, macOS universal builds are broken as the necessary `-arch` flags are no longer passed to the standard library extension module link step from `setup.py` resulting in extension modules being single architecture only. https://bugs.python.org/issue35257 (cherry picked from commit 44a3ee07e30e18d83e2730c093d8b0e930f0a06c) Co-authored-by: Ned Deily --- Makefile.pre.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index da259f89de6304..d15d93509d13b6 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -152,7 +152,7 @@ CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(LDVERSION) SHLIB_SUFFIX= @SHLIB_SUFFIX@ EXT_SUFFIX= @EXT_SUFFIX@ LDSHARED= @LDSHARED@ $(PY_LDFLAGS) -BLDSHARED= @BLDSHARED@ $(PY_LDFLAGS_NODIST) +BLDSHARED= @BLDSHARED@ $(PY_CORE_LDFLAGS) LDCXXSHARED= @LDCXXSHARED@ DESTSHARED= $(BINLIBDEST)/lib-dynload From 3c6b436a57893dd1fae4e072768f41a199076252 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Sun, 23 Dec 2018 16:37:14 -0500 Subject: [PATCH 2110/2287] 3.6.8final --- Include/patchlevel.h | 6 +-- Lib/pydoc_data/topics.py | 2 +- Misc/NEWS.d/3.6.8.rst | 38 +++++++++++++++++++ .../2018-12-05-22-28-40.bpo-35257.dmcd_s.rst | 2 - .../2018-12-14-19-36-05.bpo-35499.9yAldM.rst | 3 -- .../2018-11-22-13-52-36.bpo-35259.p07c61.rst | 2 - .../2018-08-15-16-22-30.bpo-31715.Iw8jS8.rst | 1 - README.rst | 4 +- 8 files changed, 44 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/3.6.8.rst delete mode 100644 Misc/NEWS.d/next/Build/2018-12-05-22-28-40.bpo-35257.dmcd_s.rst delete mode 100644 Misc/NEWS.d/next/Build/2018-12-14-19-36-05.bpo-35499.9yAldM.rst delete mode 100644 Misc/NEWS.d/next/C API/2018-11-22-13-52-36.bpo-35259.p07c61.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-08-15-16-22-30.bpo-31715.Iw8jS8.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 50ae6cb345d25c..065b0cc66b6cd5 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -19,11 +19,11 @@ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 6 #define PY_MICRO_VERSION 8 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA -#define PY_RELEASE_SERIAL 1 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL +#define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.6.8rc1+" +#define PY_VERSION "3.6.8" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 2d34529e813b1b..e4c63058087e51 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Tue Dec 11 16:32:37 2018 +# Autogenerated by Sphinx on Sun Dec 23 16:24:21 2018 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' diff --git a/Misc/NEWS.d/3.6.8.rst b/Misc/NEWS.d/3.6.8.rst new file mode 100644 index 00000000000000..fc510142bee624 --- /dev/null +++ b/Misc/NEWS.d/3.6.8.rst @@ -0,0 +1,38 @@ +.. bpo: 31715 +.. date: 2018-08-15-16-22-30 +.. nonce: Iw8jS8 +.. release date: 2018-12-23 +.. section: Library + +Associate ``.mjs`` file extension with ``application/javascript`` MIME Type. + +.. + +.. bpo: 35499 +.. date: 2018-12-14-19-36-05 +.. nonce: 9yAldM +.. section: Build + +``make profile-opt`` no longer replaces ``CFLAGS_NODIST`` with ``CFLAGS``. +It now adds profile-guided optimization (PGO) flags to ``CFLAGS_NODIST``: +existing ``CFLAGS_NODIST`` flags are kept. + +.. + +.. bpo: 35257 +.. date: 2018-12-05-22-28-40 +.. nonce: dmcd_s +.. section: Build + +Avoid leaking the linker flags from Link Time Optimizations (LTO) into +distutils when compiling C extensions. + +.. + +.. bpo: 35259 +.. date: 2018-11-22-13-52-36 +.. nonce: p07c61 +.. section: C API + +Conditionally declare :c:func:`Py_FinalizeEx()` (new in 3.6) based on +Py_LIMITED_API. Patch by Arthur Neufeld. diff --git a/Misc/NEWS.d/next/Build/2018-12-05-22-28-40.bpo-35257.dmcd_s.rst b/Misc/NEWS.d/next/Build/2018-12-05-22-28-40.bpo-35257.dmcd_s.rst deleted file mode 100644 index fad25257829939..00000000000000 --- a/Misc/NEWS.d/next/Build/2018-12-05-22-28-40.bpo-35257.dmcd_s.rst +++ /dev/null @@ -1,2 +0,0 @@ -Avoid leaking the linker flags from Link Time Optimizations (LTO) -into distutils when compiling C extensions. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Build/2018-12-14-19-36-05.bpo-35499.9yAldM.rst b/Misc/NEWS.d/next/Build/2018-12-14-19-36-05.bpo-35499.9yAldM.rst deleted file mode 100644 index ed730b9d9b4a49..00000000000000 --- a/Misc/NEWS.d/next/Build/2018-12-14-19-36-05.bpo-35499.9yAldM.rst +++ /dev/null @@ -1,3 +0,0 @@ -``make profile-opt`` no longer replaces ``CFLAGS_NODIST`` with ``CFLAGS``. It -now adds profile-guided optimization (PGO) flags to ``CFLAGS_NODIST``: existing -``CFLAGS_NODIST`` flags are kept. diff --git a/Misc/NEWS.d/next/C API/2018-11-22-13-52-36.bpo-35259.p07c61.rst b/Misc/NEWS.d/next/C API/2018-11-22-13-52-36.bpo-35259.p07c61.rst deleted file mode 100644 index 1f4801cbfb715a..00000000000000 --- a/Misc/NEWS.d/next/C API/2018-11-22-13-52-36.bpo-35259.p07c61.rst +++ /dev/null @@ -1,2 +0,0 @@ -Conditionally declare :c:func:`Py_FinalizeEx()` (new in 3.6) based on -Py_LIMITED_API. Patch by Arthur Neufeld. diff --git a/Misc/NEWS.d/next/Library/2018-08-15-16-22-30.bpo-31715.Iw8jS8.rst b/Misc/NEWS.d/next/Library/2018-08-15-16-22-30.bpo-31715.Iw8jS8.rst deleted file mode 100644 index eacba28f9fd987..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-08-15-16-22-30.bpo-31715.Iw8jS8.rst +++ /dev/null @@ -1 +0,0 @@ -Associate ``.mjs`` file extension with ``application/javascript`` MIME Type. diff --git a/README.rst b/README.rst index 3e392b7efc3591..0531cb570302ee 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.6.8 candidate 1+ -========================================= +This is Python version 3.6.8 +============================ .. image:: https://travis-ci.org/python/cpython.svg?branch=3.6 :alt: CPython build status on Travis CI From e5fdab2a8053d4c24d8ddb21362e17f0f636a5d0 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Mon, 24 Dec 2018 01:49:16 -0500 Subject: [PATCH 2111/2287] Revert "bpo-35402: Update macOS installer to use Tcl 8.6.9 / Tk 8.6.9.1 (GH-11101)" This reverts commit 37607f26697351751165a042f91f04530ce333f7. Due to regressions found with using Tk 8.6.9.1, the python.org macOS installers for 3.6.8 and 3.7.2 are shipping with Tcl/Tk 8.6.8 as used in previous releases. --- Mac/BuildScript/build-installer.py | 18 +++++++++--------- Mac/BuildScript/tk868_on_10_8_10_9.patch | 18 ++++++++++++++++++ Misc/NEWS.d/3.6.8rc1.rst | 5 ++++- 3 files changed, 31 insertions(+), 10 deletions(-) create mode 100644 Mac/BuildScript/tk868_on_10_8_10_9.patch diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 6fc07ad3d3d1b1..74d1e84f4a9bfe 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -225,9 +225,9 @@ def library_recipes(): if internalTk(): result.extend([ dict( - name="Tcl 8.6.9", - url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tcl8.6.9-src.tar.gz", - checksum='aa0a121d95a0e7b73a036f26028538d4', + name="Tcl 8.6.8", + url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tcl8.6.8-src.tar.gz", + checksum='81656d3367af032e0ae6157eff134f89', buildDir="unix", configure_pre=[ '--enable-shared', @@ -241,9 +241,12 @@ def library_recipes(): }, ), dict( - name="Tk 8.6.9.1", - url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tk8.6.9.1-src.tar.gz", - checksum='9efe3976468352dc894dae0c4e785a8e', + name="Tk 8.6.8", + url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tk8.6.8-src.tar.gz", + checksum='5e0faecba458ee1386078fb228d008ba', + patches=[ + "tk868_on_10_8_10_9.patch", + ], buildDir="unix", configure_pre=[ '--enable-aqua', @@ -705,7 +708,6 @@ def extractArchive(builddir, archiveName): work for current Tcl and Tk source releases where the basename of the archive ends with "-src" but the uncompressed directory does not. For now, just special case Tcl and Tk tar.gz downloads. - Another special case: the tk8.6.9.1 tarball extracts to tk8.6.9. """ curdir = os.getcwd() try: @@ -715,8 +717,6 @@ def extractArchive(builddir, archiveName): if ((retval.startswith('tcl') or retval.startswith('tk')) and retval.endswith('-src')): retval = retval[:-4] - if retval == 'tk8.6.9.1': - retval = 'tk8.6.9' if os.path.exists(retval): shutil.rmtree(retval) fp = os.popen("tar zxf %s 2>&1"%(shellQuote(archiveName),), 'r') diff --git a/Mac/BuildScript/tk868_on_10_8_10_9.patch b/Mac/BuildScript/tk868_on_10_8_10_9.patch new file mode 100644 index 00000000000000..8fe10604a68cb8 --- /dev/null +++ b/Mac/BuildScript/tk868_on_10_8_10_9.patch @@ -0,0 +1,18 @@ +Fix build failure with +quartz variant on OS X 10.8 and 10.9. +Even though Gestalt was deprecated in OS X 10.8, it should work fine +through OS X 10.9, and its replacement NSOperatingSystemVersion was +not introduced until OS X 10.10. + +Patch from MacPorts project and reported upstream: +https://trac.macports.org/ticket/55649 +--- tk8.6.8/macosx/tkMacOSXXStubs.c.orig 2017-12-06 09:25:08.000000000 -0600 ++++ tk8.6.8-patched/macosx/tkMacOSXXStubs.c 2018-01-06 19:34:17.000000000 -0600 +@@ -175,7 +175,7 @@ + { + int major, minor, patch; + +-#if MAC_OS_X_VERSION_MIN_REQUIRED < 1080 ++#if MAC_OS_X_VERSION_MIN_REQUIRED < 101000 + Gestalt(gestaltSystemVersionMajor, (SInt32*)&major); + Gestalt(gestaltSystemVersionMinor, (SInt32*)&minor); + Gestalt(gestaltSystemVersionBugFix, (SInt32*)&patch); diff --git a/Misc/NEWS.d/3.6.8rc1.rst b/Misc/NEWS.d/3.6.8rc1.rst index 48d55a0d027d13..fca18f1c62fa88 100644 --- a/Misc/NEWS.d/3.6.8rc1.rst +++ b/Misc/NEWS.d/3.6.8rc1.rst @@ -728,7 +728,10 @@ the 10.9+ installer does. .. nonce: xzn8qJ .. section: macOS -Update macOS installer to use Tcl/Tk 8.6.9.1. +Update macOS installer to use Tcl/Tk 8.6.9.1. [NOTE: This change was +reverted for the released python.org 3.6.8 macOS installers due to +regressions found in Tk 8.6.9.1. For now, the installers provide +Tcl/Tk 8.6.8.] .. From be77fb7a6e94f2fc8e2ed0cf56d882fd12127d4a Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Mon, 24 Dec 2018 04:03:37 -0500 Subject: [PATCH 2112/2287] Post release bump --- Include/patchlevel.h | 2 +- README.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 065b0cc66b6cd5..7289d41e6c812d 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -23,7 +23,7 @@ #define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.6.8" +#define PY_VERSION "3.6.8+" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/README.rst b/README.rst index 0531cb570302ee..8c260626d74e16 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.6.8 -============================ +This is Python version 3.6.8+ +============================= .. image:: https://travis-ci.org/python/cpython.svg?branch=3.6 :alt: CPython build status on Travis CI From de66b8d498e47ed9d70607ac9b9f72468241da77 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 1 Jan 2019 18:04:25 -0800 Subject: [PATCH 2113/2287] closes bpo-35630: Use code tag for 'python3' in 'README.rst' (GH-11400) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 7e3fb40b923cb09ecc67816d3191197868593737) Co-authored-by: Suriyaa ✌️️ --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 8c260626d74e16..99558b8c551d2d 100644 --- a/README.rst +++ b/README.rst @@ -59,7 +59,7 @@ On Unix, Linux, BSD, macOS, and Cygwin:: make test sudo make install -This will install Python as python3. +This will install Python as ``python3``. You can pass many options to the configure script; run ``./configure --help`` to find out more. On macOS and Cygwin, the executable is called ``python.exe``; From c2340619a772849eb7c4b038ca57ca093c738ed8 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Wed, 2 Jan 2019 08:23:51 -0800 Subject: [PATCH 2114/2287] [3.6] Bump copyright years to 2019. (GH-11407) (cherry picked from commit 9a69ae8a78785105ded02b083b2e5cd2dd939307) --- Doc/copyright.rst | 2 +- Doc/license.rst | 2 +- LICENSE | 4 ++-- Mac/IDLE/IDLE.app/Contents/Info.plist | 2 +- Mac/PythonLauncher/Info.plist.in | 2 +- Mac/Resources/app/Info.plist.in | 2 +- Mac/Resources/framework/Info.plist.in | 4 ++-- Python/getcopyright.c | 2 +- README.rst | 8 ++++---- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Doc/copyright.rst b/Doc/copyright.rst index 540ff5ef0593af..393a1f03751f82 100644 --- a/Doc/copyright.rst +++ b/Doc/copyright.rst @@ -4,7 +4,7 @@ Copyright Python and this documentation is: -Copyright © 2001-2018 Python Software Foundation. All rights reserved. +Copyright © 2001-2019 Python Software Foundation. All rights reserved. Copyright © 2000 BeOpen.com. All rights reserved. diff --git a/Doc/license.rst b/Doc/license.rst index aa4b1450e91ac3..a7df1b9920448a 100644 --- a/Doc/license.rst +++ b/Doc/license.rst @@ -87,7 +87,7 @@ PSF LICENSE AGREEMENT FOR PYTHON |release| analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python |release| alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of - copyright, i.e., "Copyright © 2001-2018 Python Software Foundation; All Rights + copyright, i.e., "Copyright © 2001-2019 Python Software Foundation; All Rights Reserved" are retained in Python |release| alone or in any derivative version prepared by Licensee. diff --git a/LICENSE b/LICENSE index 1afbedba92b33c..9dc010d80348fc 100644 --- a/LICENSE +++ b/LICENSE @@ -73,8 +73,8 @@ analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 Python Software Foundation; All -Rights Reserved" are retained in Python alone or in any derivative version +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation; +All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee. 3. In the event Licensee prepares a derivative work that is based on diff --git a/Mac/IDLE/IDLE.app/Contents/Info.plist b/Mac/IDLE/IDLE.app/Contents/Info.plist index 826d3793f75a1b..04a0a08c836395 100644 --- a/Mac/IDLE/IDLE.app/Contents/Info.plist +++ b/Mac/IDLE/IDLE.app/Contents/Info.plist @@ -36,7 +36,7 @@ CFBundleExecutable IDLE CFBundleGetInfoString - %version%, © 2001-2018 Python Software Foundation + %version%, © 2001-2019 Python Software Foundation CFBundleIconFile IDLE.icns CFBundleIdentifier diff --git a/Mac/PythonLauncher/Info.plist.in b/Mac/PythonLauncher/Info.plist.in index 5fa346ed4d3d5c..9fb4e0affd9c43 100644 --- a/Mac/PythonLauncher/Info.plist.in +++ b/Mac/PythonLauncher/Info.plist.in @@ -40,7 +40,7 @@ CFBundleExecutable Python Launcher CFBundleGetInfoString - %VERSION%, © 2001-2018 Python Software Foundation + %VERSION%, © 2001-2019 Python Software Foundation CFBundleIconFile PythonLauncher.icns CFBundleIdentifier diff --git a/Mac/Resources/app/Info.plist.in b/Mac/Resources/app/Info.plist.in index abe9ae23e341a7..b7581984dd6764 100644 --- a/Mac/Resources/app/Info.plist.in +++ b/Mac/Resources/app/Info.plist.in @@ -37,7 +37,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - %version%, (c) 2001-2018 Python Software Foundation. + %version%, (c) 2001-2019 Python Software Foundation. CFBundleName Python CFBundlePackageType diff --git a/Mac/Resources/framework/Info.plist.in b/Mac/Resources/framework/Info.plist.in index c1ea9f6889209b..0dc2e17156f186 100644 --- a/Mac/Resources/framework/Info.plist.in +++ b/Mac/Resources/framework/Info.plist.in @@ -17,9 +17,9 @@ CFBundlePackageType FMWK CFBundleShortVersionString - %VERSION%, (c) 2001-2018 Python Software Foundation. + %VERSION%, (c) 2001-2019 Python Software Foundation. CFBundleLongVersionString - %VERSION%, (c) 2001-2018 Python Software Foundation. + %VERSION%, (c) 2001-2019 Python Software Foundation. CFBundleSignature ???? CFBundleVersion diff --git a/Python/getcopyright.c b/Python/getcopyright.c index 51772ecef31797..27a1731f46ded4 100644 --- a/Python/getcopyright.c +++ b/Python/getcopyright.c @@ -4,7 +4,7 @@ static const char cprt[] = "\ -Copyright (c) 2001-2018 Python Software Foundation.\n\ +Copyright (c) 2001-2019 Python Software Foundation.\n\ All Rights Reserved.\n\ \n\ Copyright (c) 2000 BeOpen.com.\n\ diff --git a/README.rst b/README.rst index 99558b8c551d2d..e1d13b07ee9f7f 100644 --- a/README.rst +++ b/README.rst @@ -18,8 +18,8 @@ This is Python version 3.6.8+ :target: https://codecov.io/gh/python/cpython Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, -2012, 2013, 2014, 2015, 2016, 2017, 2018 Python Software Foundation. All rights -reserved. +2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation. All +rights reserved. See the end of this file for further copyright and license information. @@ -245,8 +245,8 @@ Copyright and License Information --------------------------------- Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, -2012, 2013, 2014, 2015, 2016, 2017, 2018 Python Software Foundation. All rights -reserved. +2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation. All +rights reserved. Copyright (c) 2000 BeOpen.com. All rights reserved. From 3e0144a6c95433f347bb7e44a98c84deae8853ff Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 6 Jan 2019 23:25:06 -0800 Subject: [PATCH 2115/2287] closes bpo-35643: Fix a SyntaxWarning: invalid escape sequence in Modules/_sha3/cleanup.py (GH-11413) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit d466c43e55cd32af84e353f0e9a48b09b7534f61) Co-authored-by: Mickaël Schoentgen --- .../next/Library/2019-01-02-20-04-49.bpo-35643.DaMiaV.rst | 2 ++ Modules/_sha3/cleanup.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2019-01-02-20-04-49.bpo-35643.DaMiaV.rst diff --git a/Misc/NEWS.d/next/Library/2019-01-02-20-04-49.bpo-35643.DaMiaV.rst b/Misc/NEWS.d/next/Library/2019-01-02-20-04-49.bpo-35643.DaMiaV.rst new file mode 100644 index 00000000000000..0b47bb61fc0588 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-01-02-20-04-49.bpo-35643.DaMiaV.rst @@ -0,0 +1,2 @@ +Fixed a SyntaxWarning: invalid escape sequence in Modules/_sha3/cleanup.py. +Patch by Mickaël Schoentgen. diff --git a/Modules/_sha3/cleanup.py b/Modules/_sha3/cleanup.py index 17c56b34b261ab..4f53681b49e67b 100755 --- a/Modules/_sha3/cleanup.py +++ b/Modules/_sha3/cleanup.py @@ -8,7 +8,7 @@ import re CPP1 = re.compile("^//(.*)") -CPP2 = re.compile("\ //(.*)") +CPP2 = re.compile(r"\ //(.*)") STATICS = ("void ", "int ", "HashReturn ", "const UINT64 ", "UINT16 ", " int prefix##") From 5d9ae8b9df8371dd65514e0d60b561fd37056986 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 9 Jan 2019 06:46:28 -0800 Subject: [PATCH 2116/2287] bpo-24746: Avoid stripping trailing whitespace in doctest fancy diff (GH-10639) (#11477) (cherry picked from commit cbb16459934eaf29c7c7d362939cd05550b2f21f) Co-authored-by: Sanyam Khurana <8039608+CuriousLearner@users.noreply.github.com> --- Lib/doctest.py | 2 - Lib/test/test_doctest.py | 48 ++++++++++++++++++- .../2018-11-22-15-22-56.bpo-24746.eSLKBE.rst | 2 + 3 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-11-22-15-22-56.bpo-24746.eSLKBE.rst diff --git a/Lib/doctest.py b/Lib/doctest.py index 0b78544d8d0ee0..ca5be592759461 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -1691,8 +1691,6 @@ def output_difference(self, example, got, optionflags): kind = 'ndiff with -expected +actual' else: assert 0, 'Bad diff option' - # Remove trailing whitespace on diff output. - diff = [line.rstrip() + '\n' for line in diff] return 'Differences (%s):\n' % kind + _indent(''.join(diff)) # If we're not using diff, then simply list the expected diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index 2258c6b1baed26..ad527626d1b012 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -2431,6 +2431,11 @@ def test_unittest_reportflags(): Then the default eporting options are ignored: >>> result = suite.run(unittest.TestResult()) + """ + """ + *NOTE*: These doctest are intentionally not placed in raw string to depict + the trailing whitespace using `\x20` in the diff below. + >>> print(result.failures[0][1]) # doctest: +ELLIPSIS Traceback ... Failed example: @@ -2444,7 +2449,7 @@ def test_unittest_reportflags(): Differences (ndiff with -expected +actual): a - - + + +\x20 b @@ -2933,6 +2938,47 @@ def test_CLI(): r""" """ +def test_no_trailing_whitespace_stripping(): + r""" + The fancy reports had a bug for a long time where any trailing whitespace on + the reported diff lines was stripped, making it impossible to see the + differences in line reported as different that differed only in the amount of + trailing whitespace. The whitespace still isn't particularly visible unless + you use NDIFF, but at least it is now there to be found. + + *NOTE*: This snippet was intentionally put inside a raw string to get rid of + leading whitespace error in executing the example below + + >>> def f(x): + ... r''' + ... >>> print('\n'.join(['a ', 'b'])) + ... a + ... b + ... ''' + """ + """ + *NOTE*: These doctest are not placed in raw string to depict the trailing whitespace + using `\x20` + + >>> test = doctest.DocTestFinder().find(f)[0] + >>> flags = doctest.REPORT_NDIFF + >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test) + ... # doctest: +ELLIPSIS + ********************************************************************** + File ..., line 3, in f + Failed example: + print('\n'.join(['a ', 'b'])) + Differences (ndiff with -expected +actual): + - a + + a + b + TestResults(failed=1, attempted=1) + + *NOTE*: `\x20` is for checking the trailing whitespace on the +a line above. + We cannot use actual spaces there, as a commit hook prevents from committing + patches that contain trailing whitespace. More info on Issue 24746. + """ + ###################################################################### ## Main ###################################################################### diff --git a/Misc/NEWS.d/next/Library/2018-11-22-15-22-56.bpo-24746.eSLKBE.rst b/Misc/NEWS.d/next/Library/2018-11-22-15-22-56.bpo-24746.eSLKBE.rst new file mode 100644 index 00000000000000..c592516d146605 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-11-22-15-22-56.bpo-24746.eSLKBE.rst @@ -0,0 +1,2 @@ +Avoid stripping trailing whitespace in doctest fancy diff. Orignial patch by +R. David Murray & Jairo Trad. Enhanced by Sanyam Khurana. From d09e8cecf214b1de457feae01860f5592f912a8e Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Thu, 10 Jan 2019 10:56:02 -0800 Subject: [PATCH 2117/2287] Revert "bpo-24746: Avoid stripping trailing whitespace in doctest fancy diff (GH-10639) (GH-11477)" (GH-11509) This reverts commit 5d9ae8b9df8371dd65514e0d60b561fd37056986 which was merged to 3.6 in error. --- Lib/doctest.py | 2 + Lib/test/test_doctest.py | 48 +------------------ .../2018-11-22-15-22-56.bpo-24746.eSLKBE.rst | 2 - 3 files changed, 3 insertions(+), 49 deletions(-) delete mode 100644 Misc/NEWS.d/next/Library/2018-11-22-15-22-56.bpo-24746.eSLKBE.rst diff --git a/Lib/doctest.py b/Lib/doctest.py index ca5be592759461..0b78544d8d0ee0 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -1691,6 +1691,8 @@ def output_difference(self, example, got, optionflags): kind = 'ndiff with -expected +actual' else: assert 0, 'Bad diff option' + # Remove trailing whitespace on diff output. + diff = [line.rstrip() + '\n' for line in diff] return 'Differences (%s):\n' % kind + _indent(''.join(diff)) # If we're not using diff, then simply list the expected diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index ad527626d1b012..2258c6b1baed26 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -2431,11 +2431,6 @@ def test_unittest_reportflags(): Then the default eporting options are ignored: >>> result = suite.run(unittest.TestResult()) - """ - """ - *NOTE*: These doctest are intentionally not placed in raw string to depict - the trailing whitespace using `\x20` in the diff below. - >>> print(result.failures[0][1]) # doctest: +ELLIPSIS Traceback ... Failed example: @@ -2449,7 +2444,7 @@ def test_unittest_reportflags(): Differences (ndiff with -expected +actual): a - - +\x20 + + b @@ -2938,47 +2933,6 @@ def test_CLI(): r""" """ -def test_no_trailing_whitespace_stripping(): - r""" - The fancy reports had a bug for a long time where any trailing whitespace on - the reported diff lines was stripped, making it impossible to see the - differences in line reported as different that differed only in the amount of - trailing whitespace. The whitespace still isn't particularly visible unless - you use NDIFF, but at least it is now there to be found. - - *NOTE*: This snippet was intentionally put inside a raw string to get rid of - leading whitespace error in executing the example below - - >>> def f(x): - ... r''' - ... >>> print('\n'.join(['a ', 'b'])) - ... a - ... b - ... ''' - """ - """ - *NOTE*: These doctest are not placed in raw string to depict the trailing whitespace - using `\x20` - - >>> test = doctest.DocTestFinder().find(f)[0] - >>> flags = doctest.REPORT_NDIFF - >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test) - ... # doctest: +ELLIPSIS - ********************************************************************** - File ..., line 3, in f - Failed example: - print('\n'.join(['a ', 'b'])) - Differences (ndiff with -expected +actual): - - a - + a - b - TestResults(failed=1, attempted=1) - - *NOTE*: `\x20` is for checking the trailing whitespace on the +a line above. - We cannot use actual spaces there, as a commit hook prevents from committing - patches that contain trailing whitespace. More info on Issue 24746. - """ - ###################################################################### ## Main ###################################################################### diff --git a/Misc/NEWS.d/next/Library/2018-11-22-15-22-56.bpo-24746.eSLKBE.rst b/Misc/NEWS.d/next/Library/2018-11-22-15-22-56.bpo-24746.eSLKBE.rst deleted file mode 100644 index c592516d146605..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-11-22-15-22-56.bpo-24746.eSLKBE.rst +++ /dev/null @@ -1,2 +0,0 @@ -Avoid stripping trailing whitespace in doctest fancy diff. Orignial patch by -R. David Murray & Jairo Trad. Enhanced by Sanyam Khurana. From 216a4d83c3b72f4fdcd81b588dc3f42cc461739a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 15 Jan 2019 17:16:36 -0800 Subject: [PATCH 2118/2287] bpo-35746: Fix segfault in ssl's cert parser (GH-11569) (GH-11573) Fix a NULL pointer deref in ssl module. The cert parser did not handle CRL distribution points with empty DP or URI correctly. A malicious or buggy certificate can result into segfault. Signed-off-by: Christian Heimes https://bugs.python.org/issue35746 (cherry picked from commit a37f52436f9aa4b9292878b72f3ff1480e2606c3) Co-authored-by: Christian Heimes --- Lib/test/talos-2019-0758.pem | 22 +++++++++++++++++++ Lib/test/test_ssl.py | 22 +++++++++++++++++++ .../2019-01-15-18-16-05.bpo-35746.nMSd0j.rst | 3 +++ Modules/_ssl.c | 4 ++++ 4 files changed, 51 insertions(+) create mode 100644 Lib/test/talos-2019-0758.pem create mode 100644 Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst diff --git a/Lib/test/talos-2019-0758.pem b/Lib/test/talos-2019-0758.pem new file mode 100644 index 00000000000000..13b95a77fd8ac3 --- /dev/null +++ b/Lib/test/talos-2019-0758.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDqDCCApKgAwIBAgIBAjALBgkqhkiG9w0BAQswHzELMAkGA1UEBhMCVUsxEDAO +BgNVBAMTB2NvZHktY2EwHhcNMTgwNjE4MTgwMDU4WhcNMjgwNjE0MTgwMDU4WjA7 +MQswCQYDVQQGEwJVSzEsMCoGA1UEAxMjY29kZW5vbWljb24tdm0tMi50ZXN0Lmxh +bC5jaXNjby5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC63fGB +J80A9Av1GB0bptslKRIUtJm8EeEu34HkDWbL6AJY0P8WfDtlXjlPaLqFa6sqH6ES +V48prSm1ZUbDSVL8R6BYVYpOlK8/48xk4pGTgRzv69gf5SGtQLwHy8UPBKgjSZoD +5a5k5wJXGswhKFFNqyyxqCvWmMnJWxXTt2XDCiWc4g4YAWi4O4+6SeeHVAV9rV7C +1wxqjzKovVe2uZOHjKEzJbbIU6JBPb6TRfMdRdYOw98n1VXDcKVgdX2DuuqjCzHP +WhU4Tw050M9NaK3eXp4Mh69VuiKoBGOLSOcS8reqHIU46Reg0hqeL8LIL6OhFHIF +j7HR6V1X6F+BfRS/AgMBAAGjgdYwgdMwCQYDVR0TBAIwADAdBgNVHQ4EFgQUOktp +HQjxDXXUg8prleY9jeLKeQ4wTwYDVR0jBEgwRoAUx6zgPygZ0ZErF9sPC4+5e2Io +UU+hI6QhMB8xCzAJBgNVBAYTAlVLMRAwDgYDVQQDEwdjb2R5LWNhggkA1QEAuwb7 +2s0wCQYDVR0SBAIwADAuBgNVHREEJzAlgiNjb2Rlbm9taWNvbi12bS0yLnRlc3Qu +bGFsLmNpc2NvLmNvbTAOBgNVHQ8BAf8EBAMCBaAwCwYDVR0fBAQwAjAAMAsGCSqG +SIb3DQEBCwOCAQEAvqantx2yBlM11RoFiCfi+AfSblXPdrIrHvccepV4pYc/yO6p +t1f2dxHQb8rWH3i6cWag/EgIZx+HJQvo0rgPY1BFJsX1WnYf1/znZpkUBGbVmlJr +t/dW1gSkNS6sPsM0Q+7HPgEv8CPDNK5eo7vU2seE0iWOkxSyVUuiCEY9ZVGaLVit +p0C78nZ35Pdv4I+1cosmHl28+es1WI22rrnmdBpH8J1eY6WvUw2xuZHLeNVN0TzV +Q3qq53AaCWuLOD1AjESWuUCxMZTK9DPS4JKXTK8RLyDeqOvJGjsSWp3kL0y3GaQ+ +10T1rfkKJub2+m9A9duin1fn6tHc2wSvB7m3DA== +-----END CERTIFICATE----- diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 705f1d3245b677..0aeabc10f2a97f 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -79,6 +79,7 @@ def data_file(*name): BADKEY = data_file("badkey.pem") NOKIACERT = data_file("nokia.pem") NULLBYTECERT = data_file("nullbytecert.pem") +TALOS_INVALID_CRLDP = data_file("talos-2019-0758.pem") DHFILE = data_file("ffdh3072.pem") BYTES_DHFILE = os.fsencode(DHFILE) @@ -293,6 +294,27 @@ def test_parse_cert(self): self.assertEqual(p['crlDistributionPoints'], ('http://SVRIntl-G3-crl.verisign.com/SVRIntlG3.crl',)) + def test_parse_cert_CVE_2019_5010(self): + p = ssl._ssl._test_decode_cert(TALOS_INVALID_CRLDP) + if support.verbose: + sys.stdout.write("\n" + pprint.pformat(p) + "\n") + self.assertEqual( + p, + { + 'issuer': ( + (('countryName', 'UK'),), (('commonName', 'cody-ca'),)), + 'notAfter': 'Jun 14 18:00:58 2028 GMT', + 'notBefore': 'Jun 18 18:00:58 2018 GMT', + 'serialNumber': '02', + 'subject': ((('countryName', 'UK'),), + (('commonName', + 'codenomicon-vm-2.test.lal.cisco.com'),)), + 'subjectAltName': ( + ('DNS', 'codenomicon-vm-2.test.lal.cisco.com'),), + 'version': 3 + } + ) + def test_parse_cert_CVE_2013_4238(self): p = ssl._ssl._test_decode_cert(NULLBYTECERT) if support.verbose: diff --git a/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst b/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst new file mode 100644 index 00000000000000..dffe347eec846e --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst @@ -0,0 +1,3 @@ +[CVE-2019-5010] Fix a NULL pointer deref in ssl module. The cert parser did +not handle CRL distribution points with empty DP or URI correctly. A +malicious or buggy certificate can result into segfault. diff --git a/Modules/_ssl.c b/Modules/_ssl.c index a188d6a7291af5..7365630a5eaf1c 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -1338,6 +1338,10 @@ _get_crl_dp(X509 *certificate) { STACK_OF(GENERAL_NAME) *gns; dp = sk_DIST_POINT_value(dps, i); + if (dp->distpoint == NULL) { + /* Ignore empty DP value, CVE-2019-5010 */ + continue; + } gns = dp->distpoint->name.fullname; for (j=0; j < sk_GENERAL_NAME_num(gns); j++) { From 7eef540ab89e426b622373f43713521876447f2f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 17 Jan 2019 17:00:46 -0800 Subject: [PATCH 2119/2287] bpo-35601: Alleviate race condition when waiting for SIGALRM in test_asyncio (GH-11337) (GH-11348) There is a race condition regarding signal delivery in test_signal_handling_args for test_asyncio.test_events.KqueueEventLoopTests. The signal can be received at any moment outside the time window provided in the test. The fix is to wait for the signal to be received instead with a bigger timeout. (cherry picked from commit 5471420faa84519530f29b08f2b042b2288e3e96) Co-authored-by: Pablo Galindo --- Lib/test/test_asyncio/test_events.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index 91d8a964f16206..b62c0f3b7912a3 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -557,6 +557,7 @@ def my_handler(): self.loop.add_signal_handler(signal.SIGALRM, my_handler) signal.setitimer(signal.ITIMER_REAL, 0.01, 0) # Send SIGALRM once. + self.loop.call_later(60, self.loop.stop) self.loop.run_forever() self.assertEqual(caught, 1) @@ -569,11 +570,12 @@ def my_handler(*args): nonlocal caught caught += 1 self.assertEqual(args, some_args) + self.loop.stop() self.loop.add_signal_handler(signal.SIGALRM, my_handler, *some_args) signal.setitimer(signal.ITIMER_REAL, 0.1, 0) # Send SIGALRM once. - self.loop.call_later(0.5, self.loop.stop) + self.loop.call_later(60, self.loop.stop) self.loop.run_forever() self.assertEqual(caught, 1) From dc020cc9800ae85f3a241b89ff5fcbc35ba39406 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 17 Jan 2019 17:02:43 -0800 Subject: [PATCH 2120/2287] Make sure file object is close if socket.create_connection fails (GH-11334) (GH-11351) The problem affects _testWithTimeoutTriggeredSend in test_socket.py. (cherry picked from commit 1f511e1af060e98fb789319a96076c06e7f98135) Co-authored-by: Pablo Galindo --- Lib/test/test_socket.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 56adec18c63656..95c3938ac234c9 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -5363,11 +5363,10 @@ def testWithTimeout(self): def _testWithTimeoutTriggeredSend(self): address = self.serv.getsockname() - file = open(support.TESTFN, 'rb') - with socket.create_connection(address, timeout=0.01) as sock, \ - file as file: - meth = self.meth_from_sock(sock) - self.assertRaises(socket.timeout, meth, file) + with open(support.TESTFN, 'rb') as file: + with socket.create_connection(address, timeout=0.01) as sock: + meth = self.meth_from_sock(sock) + self.assertRaises(socket.timeout, meth, file) def testWithTimeoutTriggeredSend(self): conn = self.accept_conn() From 7887c02d3372ebe3b39379588364134521a36c4e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 17 Jan 2019 17:07:39 -0800 Subject: [PATCH 2121/2287] bpo-35525: Correct the argument name for NNTP.starttls() (GH-11310) (GH-11417) (cherry picked from commit e9a044ec16989bd4b39763c0588c17200a925350) Co-authored-by: Harmandeep Singh --- Doc/library/nntplib.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst index d8ef8a692a9533..56188c7ef53880 100644 --- a/Doc/library/nntplib.rst +++ b/Doc/library/nntplib.rst @@ -232,10 +232,10 @@ tuples or objects that the method normally returns will be empty. .. versionadded:: 3.2 -.. method:: NNTP.starttls(ssl_context=None) +.. method:: NNTP.starttls(context=None) Send a ``STARTTLS`` command. This will enable encryption on the NNTP - connection. The *ssl_context* argument is optional and should be a + connection. The *context* argument is optional and should be a :class:`ssl.SSLContext` object. Please read :ref:`ssl-security` for best practices. From 1edb3dc6ff70db88a7e89586578e58a86ee0e75e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 17 Jan 2019 17:11:09 -0800 Subject: [PATCH 2122/2287] bpo-35486: Note Py3.6 import system API requirement change (GH-11540) (GH-11588) While the introduction of ModuleNotFoundError was fully backwards compatible on the import API consumer side, folks providing alternative implementations of `__import__` need to make an update to be forward compatible with clients that start relying on the new subclass. https://bugs.python.org/issue35486 (cherry picked from commit cee29b46a19116261b083dc803217aa754c7df40) Co-authored-by: Nick Coghlan --- Doc/library/importlib.rst | 3 ++- Doc/whatsnew/3.6.rst | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index 25055f7ce39cf5..30293d4d985ea6 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -1488,7 +1488,8 @@ Python 3.6 and newer for other parts of the code). if spec is not None: break else: - raise ImportError(f'No module named {absolute_name!r}') + msg = f'No module named {absolute_name!r}' + raise ModuleNotFoundError(msg, name=absolute_name) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) sys.modules[absolute_name] = module diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index 009584428fc1b8..bd5c6340130ec1 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -2328,6 +2328,17 @@ Changes in the Python API a :exc:`DeprecationWarning` in Python 3.6 and a :exc:`RuntimeError` in Python 3.8. +* With the introduction of :exc:`ModuleNotFoundError`, import system consumers + may start expecting import system replacements to raise that more specific + exception when appropriate, rather than the less-specific :exc:`ImportError`. + To provide future compatibility with such consumers, implementors of + alternative import systems that completely replace :func:`__import__` will + need to update their implementations to raise the new subclass when a module + can't be found at all. Implementors of compliant plugins to the default + import system shouldn't need to make any changes, as the default import + system will raise the new subclass when appropriate. + + Changes in the C API -------------------- From 9bacdce451618a5f0bf62cb1b6f966ebde0492c6 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sun, 3 Feb 2019 15:22:52 -0800 Subject: [PATCH 2123/2287] [3.6] bpo-35605: Fix documentation build for sphinx<1.6 (GH-11368) --- Doc/tools/extensions/escape4chm.py | 5 ++++- Doc/tools/extensions/pyspecific.py | 6 +++++- .../Documentation/2018-12-30-09-56-13.bpo-35605.gAWt32.rst | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2018-12-30-09-56-13.bpo-35605.gAWt32.rst diff --git a/Doc/tools/extensions/escape4chm.py b/Doc/tools/extensions/escape4chm.py index e9999716251734..68d4e77a37163d 100644 --- a/Doc/tools/extensions/escape4chm.py +++ b/Doc/tools/extensions/escape4chm.py @@ -8,7 +8,10 @@ import re from html.entities import codepoint2name -from sphinx.util.logging import getLogger +try: # sphinx>=1.6 + from sphinx.util.logging import getLogger +except ImportError: # sphinx<1.6 + from logging import getLogger # escape the characters which codepoint > 0x7F def _process(string): diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index dec7f0c779ab06..70bdd1754240e7 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -23,7 +23,6 @@ from sphinx import addnodes from sphinx.builders import Builder from sphinx.locale import translators -from sphinx.util import status_iterator from sphinx.util.nodes import split_explicit_title from sphinx.writers.html import HTMLTranslator from sphinx.writers.text import TextWriter, TextTranslator @@ -314,6 +313,11 @@ def get_target_uri(self, docname, typ=None): return '' # no URIs def write(self, *ignored): + try: # sphinx>=1.6 + from sphinx.util import status_iterator + except ImportError: # sphinx<1.6 + status_iterator = self.status_iterator + writer = TextWriter(self) for label in status_iterator(pydoc_topic_labels, 'building topics... ', diff --git a/Misc/NEWS.d/next/Documentation/2018-12-30-09-56-13.bpo-35605.gAWt32.rst b/Misc/NEWS.d/next/Documentation/2018-12-30-09-56-13.bpo-35605.gAWt32.rst new file mode 100644 index 00000000000000..cbc0f1e07f3124 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-12-30-09-56-13.bpo-35605.gAWt32.rst @@ -0,0 +1 @@ +Fix documentation build for sphinx<1.6. Patch by Anthony Sottile. From c41523ac2447b0e86b702f58458f3b3548439c8b Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 10 Feb 2019 14:07:24 -0800 Subject: [PATCH 2124/2287] Doc sidebar: 3.6 has moved to security-fix mode. (GH-11810) (GH-11812) (cherry picked from commit 9db56fb8faaa3cd66e7fe82740a4ae4d786bb27f) Co-authored-by: Julien Palard --- Doc/tools/templates/indexsidebar.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/tools/templates/indexsidebar.html b/Doc/tools/templates/indexsidebar.html index e69e9a305425f6..1181f7179c6c68 100644 --- a/Doc/tools/templates/indexsidebar.html +++ b/Doc/tools/templates/indexsidebar.html @@ -4,7 +4,7 @@

    {% trans %}Docs by version{% endtrans %}

    • {% trans %}Python 3.8 (in development){% endtrans %}
    • {% trans %}Python 3.7 (stable){% endtrans %}
    • -
    • {% trans %}Python 3.6 (stable){% endtrans %}
    • +
    • {% trans %}Python 3.6 (security-fixes){% endtrans %}
    • {% trans %}Python 3.5 (security-fixes){% endtrans %}
    • {% trans %}Python 2.7 (stable){% endtrans %}
    • {% trans %}All versions{% endtrans %}
    • From 2a3af94b7e4d7851986043348128e312ddbb2451 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 16 Feb 2019 08:23:52 +0100 Subject: [PATCH 2125/2287] bpo-35746: Credit Colin Read and Nicolas Edet (GH-11865) Add credit for the cert parser vulnerability. Mention also Cisco TALOS-2018-0758 identifier. --- .../next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst b/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst index dffe347eec846e..fc703b9c2469b3 100644 --- a/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst +++ b/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst @@ -1,3 +1,4 @@ [CVE-2019-5010] Fix a NULL pointer deref in ssl module. The cert parser did not handle CRL distribution points with empty DP or URI correctly. A -malicious or buggy certificate can result into segfault. +malicious or buggy certificate can result into segfault. Vulnerability +(TALOS-2018-0758) reported by Colin Read and Nicolas Edet of Cisco. From 1dee4565fae9ccb54719fa99d7944c148736083a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 23 Feb 2019 23:56:12 -0800 Subject: [PATCH 2126/2287] bpo-27313: Avoid test_ttk_guionly ComboboxTest fail with macOS Cocoa Tk (GH-12011) (GH-12013) (cherry picked from commit aeca373b339e0ea9739536ce6b43bd90f3b89873) Co-authored-by: Ned Deily --- Lib/tkinter/test/test_ttk/test_widgets.py | 7 ++++++- .../next/Tests/2019-02-24-01-58-38.bpo-27313.Sj9veH.rst | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tests/2019-02-24-01-58-38.bpo-27313.Sj9veH.rst diff --git a/Lib/tkinter/test/test_ttk/test_widgets.py b/Lib/tkinter/test/test_ttk/test_widgets.py index cb991931853a09..13e0568620185d 100644 --- a/Lib/tkinter/test/test_ttk/test_widgets.py +++ b/Lib/tkinter/test/test_ttk/test_widgets.py @@ -329,7 +329,12 @@ def test_identify(self): self.entry.wait_visibility() self.entry.update_idletasks() - self.assertEqual(self.entry.identify(5, 5), "textarea") + # bpo-27313: macOS Cocoa widget differs from X, allow either + if sys.platform == 'darwin': + self.assertIn(self.entry.identify(5, 5), + ("textarea", "Combobox.button") ) + else: + self.assertEqual(self.entry.identify(5, 5), "textarea") self.assertEqual(self.entry.identify(-1, -1), "") self.assertRaises(tkinter.TclError, self.entry.identify, None, 5) diff --git a/Misc/NEWS.d/next/Tests/2019-02-24-01-58-38.bpo-27313.Sj9veH.rst b/Misc/NEWS.d/next/Tests/2019-02-24-01-58-38.bpo-27313.Sj9veH.rst new file mode 100644 index 00000000000000..189b9cf69f0733 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-02-24-01-58-38.bpo-27313.Sj9veH.rst @@ -0,0 +1 @@ +Avoid test_ttk_guionly ComboboxTest failure with macOS Cocoa Tk. From fb352413c1fac65823f274feeb369cd5ab1af2e4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 27 Feb 2019 15:46:08 -0800 Subject: [PATCH 2127/2287] Document the surprising sideeffect PyErr_Print(). (GH-12081) (GH-12084) (cherry picked from commit 4173772031747a9b249be4100b4aa9eda805ea23) Co-authored-by: Gregory P. Smith --- Doc/c-api/exceptions.rst | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 2bc1bd876a2fe2..817469af0a582b 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -53,8 +53,12 @@ Printing and clearing .. c:function:: void PyErr_PrintEx(int set_sys_last_vars) Print a standard traceback to ``sys.stderr`` and clear the error indicator. - Call this function only when the error indicator is set. (Otherwise it will - cause a fatal error!) + **Unless** the error is a ``SystemExit``. In that case the no traceback + is printed and Python process will exit with the error code specified by + the ``SystemExit`` instance. + + Call this function **only** when the error indicator is set. Otherwise it + will cause a fatal error! If *set_sys_last_vars* is nonzero, the variables :data:`sys.last_type`, :data:`sys.last_value` and :data:`sys.last_traceback` will be set to the From b241af861b37e20ad30533bc0b7e2e5491cc470f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 9 Mar 2019 18:59:28 -0800 Subject: [PATCH 2128/2287] bpo-35121: prefix dot in domain for proper subdomain validation (GH-10258) (GH-12260) Don't send cookies of domain A without Domain attribute to domain B when domain A is a suffix match of domain B while using a cookiejar with `http.cookiejar.DefaultCookiePolicy` policy. Patch by Karthikeyan Singaravelan. (cherry picked from commit ca7fe5063593958e5efdf90f068582837f07bd14) Co-authored-by: Xtreak --- Lib/http/cookiejar.py | 13 ++++++-- Lib/test/test_http_cookiejar.py | 30 +++++++++++++++++++ .../2018-10-31-15-39-17.bpo-35121.EgHv9k.rst | 4 +++ 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py index adf956d66a07f9..97599d48d8e016 100644 --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -1148,6 +1148,11 @@ def return_ok_domain(self, cookie, request): req_host, erhn = eff_request_host(request) domain = cookie.domain + if domain and not domain.startswith("."): + dotdomain = "." + domain + else: + dotdomain = domain + # strict check of non-domain cookies: Mozilla does this, MSIE5 doesn't if (cookie.version == 0 and (self.strict_ns_domain & self.DomainStrictNonDomain) and @@ -1160,7 +1165,7 @@ def return_ok_domain(self, cookie, request): _debug(" effective request-host name %s does not domain-match " "RFC 2965 cookie domain %s", erhn, domain) return False - if cookie.version == 0 and not ("."+erhn).endswith(domain): + if cookie.version == 0 and not ("."+erhn).endswith(dotdomain): _debug(" request-host %s does not match Netscape cookie domain " "%s", req_host, domain) return False @@ -1174,7 +1179,11 @@ def domain_return_ok(self, domain, request): req_host = "."+req_host if not erhn.startswith("."): erhn = "."+erhn - if not (req_host.endswith(domain) or erhn.endswith(domain)): + if domain and not domain.startswith("."): + dotdomain = "." + domain + else: + dotdomain = domain + if not (req_host.endswith(dotdomain) or erhn.endswith(dotdomain)): #_debug(" request domain %s does not match cookie domain %s", # req_host, domain) return False diff --git a/Lib/test/test_http_cookiejar.py b/Lib/test/test_http_cookiejar.py index abc625d672a784..6e1b30881310b2 100644 --- a/Lib/test/test_http_cookiejar.py +++ b/Lib/test/test_http_cookiejar.py @@ -415,6 +415,7 @@ def test_domain_return_ok(self): ("http://foo.bar.com/", ".foo.bar.com", True), ("http://foo.bar.com/", "foo.bar.com", True), ("http://foo.bar.com/", ".bar.com", True), + ("http://foo.bar.com/", "bar.com", True), ("http://foo.bar.com/", "com", True), ("http://foo.com/", "rhubarb.foo.com", False), ("http://foo.com/", ".foo.com", True), @@ -425,6 +426,8 @@ def test_domain_return_ok(self): ("http://foo/", "foo", True), ("http://foo/", "foo.local", True), ("http://foo/", ".local", True), + ("http://barfoo.com", ".foo.com", False), + ("http://barfoo.com", "foo.com", False), ]: request = urllib.request.Request(url) r = pol.domain_return_ok(domain, request) @@ -959,6 +962,33 @@ def test_domain_block(self): c.add_cookie_header(req) self.assertFalse(req.has_header("Cookie")) + c.clear() + + pol.set_blocked_domains([]) + req = urllib.request.Request("http://acme.com/") + res = FakeResponse(headers, "http://acme.com/") + cookies = c.make_cookies(res, req) + c.extract_cookies(res, req) + self.assertEqual(len(c), 1) + + req = urllib.request.Request("http://acme.com/") + c.add_cookie_header(req) + self.assertTrue(req.has_header("Cookie")) + + req = urllib.request.Request("http://badacme.com/") + c.add_cookie_header(req) + self.assertFalse(pol.return_ok(cookies[0], req)) + self.assertFalse(req.has_header("Cookie")) + + p = pol.set_blocked_domains(["acme.com"]) + req = urllib.request.Request("http://acme.com/") + c.add_cookie_header(req) + self.assertFalse(req.has_header("Cookie")) + + req = urllib.request.Request("http://badacme.com/") + c.add_cookie_header(req) + self.assertFalse(req.has_header("Cookie")) + def test_secure(self): for ns in True, False: for whitespace in " ", "": diff --git a/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst b/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst new file mode 100644 index 00000000000000..d2eb8f1f352c21 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst @@ -0,0 +1,4 @@ +Don't send cookies of domain A without Domain attribute to domain B +when domain A is a suffix match of domain B while using a cookiejar +with :class:`http.cookiejar.DefaultCookiePolicy` policy. Patch by +Karthikeyan Singaravelan. From 5565b1db6f37f244890369e0d68a3e906aca28b9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 11 Mar 2019 21:28:39 -0700 Subject: [PATCH 2129/2287] bpo-35647: Fix path check in cookiejar (GH-11436) (GH-12268) Co-authored-by: Xtreak --- Lib/http/cookiejar.py | 14 +++++++---- Lib/test/test_http_cookiejar.py | 24 +++++++++++++++++++ .../2018-12-30-14-35-19.bpo-35121.oWmiGU.rst | 3 +++ 3 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py index 97599d48d8e016..e46514bb35ebd6 100644 --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -993,7 +993,7 @@ def set_ok_path(self, cookie, request): req_path = request_path(request) if ((cookie.version > 0 or (cookie.version == 0 and self.strict_ns_set_path)) and - not req_path.startswith(cookie.path)): + not self.path_return_ok(cookie.path, request)): _debug(" path attribute %s is not a prefix of request " "path %s", cookie.path, req_path) return False @@ -1200,11 +1200,15 @@ def domain_return_ok(self, domain, request): def path_return_ok(self, path, request): _debug("- checking cookie path=%s", path) req_path = request_path(request) - if not req_path.startswith(path): - _debug(" %s does not path-match %s", req_path, path) - return False - return True + pathlen = len(path) + if req_path == path: + return True + elif (req_path.startswith(path) and + (path.endswith("/") or req_path[pathlen:pathlen+1] == "/")): + return True + _debug(" %s does not path-match %s", req_path, path) + return False def vals_sorted_by_key(adict): keys = sorted(adict.keys()) diff --git a/Lib/test/test_http_cookiejar.py b/Lib/test/test_http_cookiejar.py index 6e1b30881310b2..16edf34a99259f 100644 --- a/Lib/test/test_http_cookiejar.py +++ b/Lib/test/test_http_cookiejar.py @@ -695,6 +695,30 @@ def test_request_path(self): req = urllib.request.Request("http://www.example.com") self.assertEqual(request_path(req), "/") + def test_path_prefix_match(self): + pol = DefaultCookiePolicy() + strict_ns_path_pol = DefaultCookiePolicy(strict_ns_set_path=True) + + c = CookieJar(pol) + base_url = "http://bar.com" + interact_netscape(c, base_url, 'spam=eggs; Path=/foo') + cookie = c._cookies['bar.com']['/foo']['spam'] + + for path, ok in [('/foo', True), + ('/foo/', True), + ('/foo/bar', True), + ('/', False), + ('/foobad/foo', False)]: + url = f'{base_url}{path}' + req = urllib.request.Request(url) + h = interact_netscape(c, url) + if ok: + self.assertIn('spam=eggs', h, f"cookie not set for {path}") + self.assertTrue(strict_ns_path_pol.set_ok_path(cookie, req)) + else: + self.assertNotIn('spam=eggs', h, f"cookie set for {path}") + self.assertFalse(strict_ns_path_pol.set_ok_path(cookie, req)) + def test_request_port(self): req = urllib.request.Request("http://www.acme.com:1234/", headers={"Host": "www.acme.com:4321"}) diff --git a/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst b/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst new file mode 100644 index 00000000000000..032e1e2c00bc5d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst @@ -0,0 +1,3 @@ +Don't set cookie for a request when the request path is a prefix match of +the cookie's path attribute but doesn't end with "/". Patch by Karthikeyan +Singaravelan. From 23fc0416454c4ad5b9b23d520fbe6d89be3efc24 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Mon, 11 Mar 2019 21:34:03 -0700 Subject: [PATCH 2130/2287] [3.6] bpo-36216: Add check for characters in netloc that normalize to separators (GH-12201) (GH-12215) --- Doc/library/urllib.parse.rst | 18 +++++++++++++++ Lib/test/test_urlparse.py | 23 +++++++++++++++++++ Lib/urllib/parse.py | 17 ++++++++++++++ .../2019-03-06-09-38-40.bpo-36216.6q1m4a.rst | 3 +++ 4 files changed, 61 insertions(+) create mode 100644 Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index d991254d5ca1e8..647af613a3157a 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -121,6 +121,11 @@ or on combining URL components into a URL string. Unmatched square brackets in the :attr:`netloc` attribute will raise a :exc:`ValueError`. + Characters in the :attr:`netloc` attribute that decompose under NFKC + normalization (as used by the IDNA encoding) into any of ``/``, ``?``, + ``#``, ``@``, or ``:`` will raise a :exc:`ValueError`. If the URL is + decomposed before parsing, no error will be raised. + .. versionchanged:: 3.2 Added IPv6 URL parsing capabilities. @@ -133,6 +138,10 @@ or on combining URL components into a URL string. Out-of-range port numbers now raise :exc:`ValueError`, instead of returning :const:`None`. + .. versionchanged:: 3.6.9 + Characters that affect netloc parsing under NFKC normalization will + now raise :exc:`ValueError`. + .. function:: parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None) @@ -256,10 +265,19 @@ or on combining URL components into a URL string. Unmatched square brackets in the :attr:`netloc` attribute will raise a :exc:`ValueError`. + Characters in the :attr:`netloc` attribute that decompose under NFKC + normalization (as used by the IDNA encoding) into any of ``/``, ``?``, + ``#``, ``@``, or ``:`` will raise a :exc:`ValueError`. If the URL is + decomposed before parsing, no error will be raised. + .. versionchanged:: 3.6 Out-of-range port numbers now raise :exc:`ValueError`, instead of returning :const:`None`. + .. versionchanged:: 3.6.9 + Characters that affect netloc parsing under NFKC normalization will + now raise :exc:`ValueError`. + .. function:: urlunsplit(parts) diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index be50b47603aa5b..e6638aee2244a8 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -1,3 +1,5 @@ +import sys +import unicodedata import unittest import urllib.parse @@ -984,6 +986,27 @@ def test_all(self): expected.append(name) self.assertCountEqual(urllib.parse.__all__, expected) + def test_urlsplit_normalization(self): + # Certain characters should never occur in the netloc, + # including under normalization. + # Ensure that ALL of them are detected and cause an error + illegal_chars = '/:#?@' + hex_chars = {'{:04X}'.format(ord(c)) for c in illegal_chars} + denorm_chars = [ + c for c in map(chr, range(128, sys.maxunicode)) + if (hex_chars & set(unicodedata.decomposition(c).split())) + and c not in illegal_chars + ] + # Sanity check that we found at least one such character + self.assertIn('\u2100', denorm_chars) + self.assertIn('\uFF03', denorm_chars) + + for scheme in ["http", "https", "ftp"]: + for c in denorm_chars: + url = "{}://netloc{}false.netloc/path".format(scheme, c) + with self.subTest(url=url, char='{:04X}'.format(ord(c))): + with self.assertRaises(ValueError): + urllib.parse.urlsplit(url) class Utility_Tests(unittest.TestCase): """Testcase to test the various utility functions in the urllib.""" diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 85e68c8b42c7bd..7b06f4d71d676f 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -391,6 +391,21 @@ def _splitnetloc(url, start=0): delim = min(delim, wdelim) # use earliest delim position return url[start:delim], url[delim:] # return (domain, rest) +def _checknetloc(netloc): + if not netloc or not any(ord(c) > 127 for c in netloc): + return + # looking for characters like \u2100 that expand to 'a/c' + # IDNA uses NFKC equivalence, so normalize for this check + import unicodedata + netloc2 = unicodedata.normalize('NFKC', netloc) + if netloc == netloc2: + return + _, _, netloc = netloc.rpartition('@') # anything to the left of '@' is okay + for c in '/?#@:': + if c in netloc2: + raise ValueError("netloc '" + netloc2 + "' contains invalid " + + "characters under NFKC normalization") + def urlsplit(url, scheme='', allow_fragments=True): """Parse a URL into 5 components: :///?# @@ -420,6 +435,7 @@ def urlsplit(url, scheme='', allow_fragments=True): url, fragment = url.split('#', 1) if '?' in url: url, query = url.split('?', 1) + _checknetloc(netloc) v = SplitResult(scheme, netloc, url, query, fragment) _parse_cache[key] = v return _coerce_result(v) @@ -443,6 +459,7 @@ def urlsplit(url, scheme='', allow_fragments=True): url, fragment = url.split('#', 1) if '?' in url: url, query = url.split('?', 1) + _checknetloc(netloc) v = SplitResult(scheme, netloc, url, query, fragment) _parse_cache[key] = v return _coerce_result(v) diff --git a/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst b/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst new file mode 100644 index 00000000000000..5546394157f9e5 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst @@ -0,0 +1,3 @@ +Changes urlsplit() to raise ValueError when the URL contains characters that +decompose under IDNA encoding (NFKC-normalization) into characters that +affect how the URL is parsed. From e601ef0fa384d149f6759fff3c18762a8c63851e Mon Sep 17 00:00:00 2001 From: Harmandeep Singh Date: Mon, 18 Mar 2019 07:23:07 +0530 Subject: [PATCH 2131/2287] bpo-36195: Remove the ThreadPoolExecutor documentation mentioning the initializer feature added in Python 3.7 (GH-12182) --- Doc/library/concurrent.futures.rst | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index 69dfd0f47c1cef..319f757aa9063d 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -137,12 +137,6 @@ And:: An :class:`Executor` subclass that uses a pool of at most *max_workers* threads to execute calls asynchronously. - *initializer* is an optional callable that is called at the start of - each worker thread; *initargs* is a tuple of arguments passed to the - initializer. Should *initializer* raise an exception, all currently - pending jobs will raise a :exc:`~concurrent.futures.thread.BrokenThreadPool`, - as well any attempt to submit more jobs to the pool. - .. versionchanged:: 3.5 If *max_workers* is ``None`` or not given, it will default to the number of processors on the machine, From 75f8a691a45442c94972cf0fb7fb7d413d44601e Mon Sep 17 00:00:00 2001 From: Harmon Date: Sun, 17 Mar 2019 21:11:57 -0500 Subject: [PATCH 2132/2287] Fix "catchs" typos in NEWS entries (GH-12366) --- Misc/NEWS.d/3.6.7rc1.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS.d/3.6.7rc1.rst b/Misc/NEWS.d/3.6.7rc1.rst index 5115970d5522b0..4a53bcd6ccaa6d 100644 --- a/Misc/NEWS.d/3.6.7rc1.rst +++ b/Misc/NEWS.d/3.6.7rc1.rst @@ -1088,7 +1088,7 @@ instantiate classes, and check coverage. Check existing files. .. nonce: Q3Dwns .. section: Tools/Demos -python-gdb now catchs ``UnicodeDecodeError`` exceptions when calling +python-gdb now catches ``UnicodeDecodeError`` exceptions when calling ``string()``. .. @@ -1098,7 +1098,7 @@ python-gdb now catchs ``UnicodeDecodeError`` exceptions when calling .. nonce: 2YfdwI .. section: Tools/Demos -python-gdb now catchs ValueError on read_var(): when Python has no debug +python-gdb now catches ValueError on read_var(): when Python has no debug symbols for example. .. From 4508bc37dd80c71adfaa0925a67c438389817076 Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Wed, 20 Mar 2019 16:41:20 +0100 Subject: [PATCH 2133/2287] [3.6] bpo-35564: add master_doc='contents' to conf.py (GH-11290). (GH-12461) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit fc8284e22074af8154e9865c8391b955f13a308b) Co-authored-by: Jean-François B --- Doc/conf.py | 2 ++ .../next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst | 1 + 2 files changed, 3 insertions(+) create mode 100644 Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst diff --git a/Doc/conf.py b/Doc/conf.py index e2758bcd00b5bb..fab963e23a0fee 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -40,6 +40,8 @@ venvdir = os.getenv('VENVDIR', 'venv') exclude_patterns = [venvdir+'/*', 'README.rst'] +# Avoid a warning with Sphinx >= 2.0 +master_doc = 'contents' # Options for HTML output # ----------------------- diff --git a/Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst b/Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst new file mode 100644 index 00000000000000..8ca95eed4c56e5 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst @@ -0,0 +1 @@ +Explicitly set master_doc variable in conf.py for compliance with Sphinx 2.0 From fbe2a1394bf52f5a4455681e1b1f705a31559585 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 29 Apr 2019 12:56:58 -0700 Subject: [PATCH 2134/2287] bpo-34602: Avoid failures setting macOS stack resource limit (GH-13011) (GH-13014) Under some conditions the earlier fix for bpo-18075, "Infinite recursion tests triggering a segfault on Mac OS X", now causes failures on macOS when attempting to change stack limit with resource.setrlimit resource.RLIMIT_STACK, like regrtest does when running the test suite. The reverted change had specified a non-default stack size when linking the python executable on macOS. As of macOS 10.14.4, the previous code causes a hard failure when running tests, although similar failures had been seen under some conditions under some earlier systems. For now, revert the original change and resume using the default stack size when linking the interpreter. (cherry picked from commit 883dfc668f9730b00928730035b5dbd24b9da2a0) Co-authored-by: Ned Deily --- .../next/macOS/2019-04-29-10-54-14.bpo-34602.Lrl2zU.rst | 3 +++ configure | 6 ------ configure.ac | 6 ------ 3 files changed, 3 insertions(+), 12 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2019-04-29-10-54-14.bpo-34602.Lrl2zU.rst diff --git a/Misc/NEWS.d/next/macOS/2019-04-29-10-54-14.bpo-34602.Lrl2zU.rst b/Misc/NEWS.d/next/macOS/2019-04-29-10-54-14.bpo-34602.Lrl2zU.rst new file mode 100644 index 00000000000000..6f7ac881c82e2e --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2019-04-29-10-54-14.bpo-34602.Lrl2zU.rst @@ -0,0 +1,3 @@ +Avoid failures setting macOS stack resource limit with resource.setrlimit. +This reverts an earlier fix for bpo-18075 which forced a non-default stack +size when building the interpreter executable on macOS. diff --git a/configure b/configure index e39c16eee2b903..634e18af4ee539 100755 --- a/configure +++ b/configure @@ -9504,12 +9504,6 @@ then # -u libsys_s pulls in all symbols in libsys Darwin/*) LINKFORSHARED="$extra_undefs -framework CoreFoundation" - - # Issue #18075: the default maximum stack size (8MBytes) is too - # small for the default recursion limit. Increase the stack size - # to ensure that tests don't crash - LINKFORSHARED="-Wl,-stack_size,1000000 $LINKFORSHARED" - if test "$enable_framework" then LINKFORSHARED="$LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' diff --git a/configure.ac b/configure.ac index cf280506bd011f..8bbfc1ecbad8be 100644 --- a/configure.ac +++ b/configure.ac @@ -2697,12 +2697,6 @@ then # -u libsys_s pulls in all symbols in libsys Darwin/*) LINKFORSHARED="$extra_undefs -framework CoreFoundation" - - # Issue #18075: the default maximum stack size (8MBytes) is too - # small for the default recursion limit. Increase the stack size - # to ensure that tests don't crash - LINKFORSHARED="-Wl,-stack_size,1000000 $LINKFORSHARED" - if test "$enable_framework" then LINKFORSHARED="$LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' From dadc34784444950c389c120fb16f44e5a29cc43f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 2 May 2019 09:00:33 -0700 Subject: [PATCH 2135/2287] bpo-9194: Fix the bounds checking in winreg.c's fixupMultiSZ() (GH-12687) (GH-12910) (cherry picked from commit 56ed86490cb8221c874d432461d77702437f63e5) Co-authored-by: Zackery Spytz --- PC/winreg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PC/winreg.c b/PC/winreg.c index 3fde04d746b53c..5739cf43335aa3 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -520,7 +520,7 @@ fixupMultiSZ(wchar_t **str, wchar_t *data, int len) Q = data + len; for (P = data, i = 0; P < Q && *P != '\0'; P++, i++) { str[i] = P; - for(; *P != '\0'; P++) + for (; P < Q && *P != '\0'; P++) ; } } From e5f9f4adb95233c66578e6f7ea176687af2f78ca Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 2 May 2019 09:02:35 -0700 Subject: [PATCH 2136/2287] bpo-36742: Fixes handling of pre-normalization characters in urlsplit() (GH-13017) (GH-13024) (cherry picked from commit d537ab0ff9767ef024f26246899728f0116b1ec3) Co-authored-by: Steve Dower --- Lib/test/test_urlparse.py | 6 ++++++ Lib/urllib/parse.py | 11 +++++++---- .../Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst | 1 + 3 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index e6638aee2244a8..c2623544946198 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -1001,6 +1001,12 @@ def test_urlsplit_normalization(self): self.assertIn('\u2100', denorm_chars) self.assertIn('\uFF03', denorm_chars) + # bpo-36742: Verify port separators are ignored when they + # existed prior to decomposition + urllib.parse.urlsplit('http://\u30d5\u309a:80') + with self.assertRaises(ValueError): + urllib.parse.urlsplit('http://\u30d5\u309a\ufe1380') + for scheme in ["http", "https", "ftp"]: for c in denorm_chars: url = "{}://netloc{}false.netloc/path".format(scheme, c) diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 7b06f4d71d676f..791b457bfb8a82 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -397,13 +397,16 @@ def _checknetloc(netloc): # looking for characters like \u2100 that expand to 'a/c' # IDNA uses NFKC equivalence, so normalize for this check import unicodedata - netloc2 = unicodedata.normalize('NFKC', netloc) - if netloc == netloc2: + n = netloc.rpartition('@')[2] # ignore anything to the left of '@' + n = n.replace(':', '') # ignore characters already included + n = n.replace('#', '') # but not the surrounding text + n = n.replace('?', '') + netloc2 = unicodedata.normalize('NFKC', n) + if n == netloc2: return - _, _, netloc = netloc.rpartition('@') # anything to the left of '@' is okay for c in '/?#@:': if c in netloc2: - raise ValueError("netloc '" + netloc2 + "' contains invalid " + + raise ValueError("netloc '" + netloc + "' contains invalid " + "characters under NFKC normalization") def urlsplit(url, scheme='', allow_fragments=True): diff --git a/Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst b/Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst new file mode 100644 index 00000000000000..d729ed2f3cd507 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst @@ -0,0 +1 @@ +Fixes mishandling of pre-normalization characters in urlsplit(). From c50d437e942d4c4c45c8cd76329b05340c02eb31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Wed, 8 May 2019 18:33:24 +0200 Subject: [PATCH 2137/2287] bpo-30458: Disallow control chars in http URLs. (GH-12755) (GH-13155) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Disallow control chars in http URLs in urllib.urlopen. This addresses a potential security problem for applications that do not sanity check their URLs where http request headers could be injected. Disable https related urllib tests on a build without ssl (GH-13032) These tests require an SSL enabled build. Skip these tests when python is built without SSL to fix test failures. Use http.client.InvalidURL instead of ValueError as the new error case's exception. (GH-13044) Co-Authored-By: Miro Hrončok --- Lib/http/client.py | 15 ++++++ Lib/test/test_urllib.py | 53 +++++++++++++++++++ Lib/test/test_xmlrpc.py | 7 ++- .../2019-04-10-08-53-30.bpo-30458.51E-DA.rst | 1 + 4 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst diff --git a/Lib/http/client.py b/Lib/http/client.py index baabfeb2ea8c8f..1a6bd8ac42ebfb 100644 --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -141,6 +141,16 @@ _is_legal_header_name = re.compile(rb'[^:\s][^:\r\n]*').fullmatch _is_illegal_header_value = re.compile(rb'\n(?![ \t])|\r(?![ \t\n])').search +# These characters are not allowed within HTTP URL paths. +# See https://tools.ietf.org/html/rfc3986#section-3.3 and the +# https://tools.ietf.org/html/rfc3986#appendix-A pchar definition. +# Prevents CVE-2019-9740. Includes control characters such as \r\n. +# We don't restrict chars above \x7f as putrequest() limits us to ASCII. +_contains_disallowed_url_pchar_re = re.compile('[\x00-\x20\x7f]') +# Arguably only these _should_ allowed: +# _is_allowed_url_pchars_re = re.compile(r"^[/!$&'()*+,;=:@%a-zA-Z0-9._~-]+$") +# We are more lenient for assumed real world compatibility purposes. + # We always set the Content-Length header for these methods because some # servers will otherwise respond with a 411 _METHODS_EXPECTING_BODY = {'PATCH', 'POST', 'PUT'} @@ -1111,6 +1121,11 @@ def putrequest(self, method, url, skip_host=False, self._method = method if not url: url = '/' + # Prevent CVE-2019-9740. + match = _contains_disallowed_url_pchar_re.search(url) + if match: + raise InvalidURL(f"URL can't contain control characters. {url!r} " + f"(found at least {match.group()!r})") request = '%s %s %s' % (method, url, self._http_vsn_str) # Non-ASCII characters should have been eliminated earlier diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index fa3757cc94be52..649a5b81575b0f 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -329,6 +329,59 @@ def test_willclose(self): finally: self.unfakehttp() + @unittest.skipUnless(ssl, "ssl module required") + def test_url_with_control_char_rejected(self): + for char_no in list(range(0, 0x21)) + [0x7f]: + char = chr(char_no) + schemeless_url = f"//localhost:7777/test{char}/" + self.fakehttp(b"HTTP/1.1 200 OK\r\n\r\nHello.") + try: + # We explicitly test urllib.request.urlopen() instead of the top + # level 'def urlopen()' function defined in this... (quite ugly) + # test suite. They use different url opening codepaths. Plain + # urlopen uses FancyURLOpener which goes via a codepath that + # calls urllib.parse.quote() on the URL which makes all of the + # above attempts at injection within the url _path_ safe. + escaped_char_repr = repr(char).replace('\\', r'\\') + InvalidURL = http.client.InvalidURL + with self.assertRaisesRegex( + InvalidURL, f"contain control.*{escaped_char_repr}"): + urllib.request.urlopen(f"http:{schemeless_url}") + with self.assertRaisesRegex( + InvalidURL, f"contain control.*{escaped_char_repr}"): + urllib.request.urlopen(f"https:{schemeless_url}") + # This code path quotes the URL so there is no injection. + resp = urlopen(f"http:{schemeless_url}") + self.assertNotIn(char, resp.geturl()) + finally: + self.unfakehttp() + + @unittest.skipUnless(ssl, "ssl module required") + def test_url_with_newline_header_injection_rejected(self): + self.fakehttp(b"HTTP/1.1 200 OK\r\n\r\nHello.") + host = "localhost:7777?a=1 HTTP/1.1\r\nX-injected: header\r\nTEST: 123" + schemeless_url = "//" + host + ":8080/test/?test=a" + try: + # We explicitly test urllib.request.urlopen() instead of the top + # level 'def urlopen()' function defined in this... (quite ugly) + # test suite. They use different url opening codepaths. Plain + # urlopen uses FancyURLOpener which goes via a codepath that + # calls urllib.parse.quote() on the URL which makes all of the + # above attempts at injection within the url _path_ safe. + InvalidURL = http.client.InvalidURL + with self.assertRaisesRegex( + InvalidURL, r"contain control.*\\r.*(found at least . .)"): + urllib.request.urlopen(f"http:{schemeless_url}") + with self.assertRaisesRegex(InvalidURL, r"contain control.*\\n"): + urllib.request.urlopen(f"https:{schemeless_url}") + # This code path quotes the URL so there is no injection. + resp = urlopen(f"http:{schemeless_url}") + self.assertNotIn(' ', resp.geturl()) + self.assertNotIn('\r', resp.geturl()) + self.assertNotIn('\n', resp.geturl()) + finally: + self.unfakehttp() + def test_read_0_9(self): # "0.9" response accepted (but not "simple responses" without # a status line) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py index 07f7ba0f00b570..fc601d455224e9 100644 --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -950,7 +950,12 @@ def test_unicode_host(self): def test_partial_post(self): # Check that a partial POST doesn't make the server loop: issue #14001. conn = http.client.HTTPConnection(ADDR, PORT) - conn.request('POST', '/RPC2 HTTP/1.0\r\nContent-Length: 100\r\n\r\nbye') + conn.send('POST /RPC2 HTTP/1.0\r\n' + 'Content-Length: 100\r\n\r\n' + 'bye HTTP/1.1\r\n' + f'Host: {ADDR}:{PORT}\r\n' + 'Accept-Encoding: identity\r\n' + 'Content-Length: 0\r\n\r\n'.encode('ascii')) conn.close() def test_context_manager(self): diff --git a/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst b/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst new file mode 100644 index 00000000000000..ed8027fb4d6420 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst @@ -0,0 +1 @@ +Address CVE-2019-9740 by disallowing URL paths with embedded whitespace or control characters through into the underlying http client request. Such potentially malicious header injection URLs now cause an http.client.InvalidURL exception to be raised. From 2b9d7abdbd4b41e2c624858f5bc80da59d8a681d Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Wed, 8 May 2019 14:20:59 -0500 Subject: [PATCH 2138/2287] [3.6] bpo-36816: Update the self-signed.pythontest.net cert (GH-13192) (GH-13198) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We updated the server, our testsuite must match. https://bugs.python.org/issue36816 ✈️ CLE -> DEN ✈️ GH-pycon2019 (cherry picked from commit 6bd81734de0b73f1431880d6a75fb71bcbc65fa1) Co-authored-by: Gregory P. Smith --- Lib/test/selfsigned_pythontestdotnet.pem | 46 +++++++++++++------ .../2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst | 1 + 2 files changed, 33 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst diff --git a/Lib/test/selfsigned_pythontestdotnet.pem b/Lib/test/selfsigned_pythontestdotnet.pem index b6d259bcb23680..2b1760747bce30 100644 --- a/Lib/test/selfsigned_pythontestdotnet.pem +++ b/Lib/test/selfsigned_pythontestdotnet.pem @@ -1,16 +1,34 @@ -----BEGIN CERTIFICATE----- -MIIClTCCAf6gAwIBAgIJAKGU95wKR8pTMA0GCSqGSIb3DQEBBQUAMHAxCzAJBgNV -BAYTAlhZMRcwFQYDVQQHDA5DYXN0bGUgQW50aHJheDEjMCEGA1UECgwaUHl0aG9u -IFNvZnR3YXJlIEZvdW5kYXRpb24xIzAhBgNVBAMMGnNlbGYtc2lnbmVkLnB5dGhv -bnRlc3QubmV0MB4XDTE0MTEwMjE4MDkyOVoXDTI0MTAzMDE4MDkyOVowcDELMAkG -A1UEBhMCWFkxFzAVBgNVBAcMDkNhc3RsZSBBbnRocmF4MSMwIQYDVQQKDBpQeXRo -b24gU29mdHdhcmUgRm91bmRhdGlvbjEjMCEGA1UEAwwac2VsZi1zaWduZWQucHl0 -aG9udGVzdC5uZXQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANDXQXW9tjyZ -Xt0Iv2tLL1+jinr4wGg36ioLDLFkMf+2Y1GL0v0BnKYG4N1OKlAU15LXGeGer8vm -Sv/yIvmdrELvhAbbo3w4a9TMYQA4XkIVLdvu3mvNOAet+8PMJxn26dbDhG809ALv -EHY57lQsBS3G59RZyBPVqAqmImWNJnVzAgMBAAGjNzA1MCUGA1UdEQQeMByCGnNl -bGYtc2lnbmVkLnB5dGhvbnRlc3QubmV0MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN -AQEFBQADgYEAIuzAhgMouJpNdf3URCHIineyoSt6WK/9+eyUcjlKOrDoXNZaD72h -TXMeKYoWvJyVcSLKL8ckPtDobgP2OTt0UkyAaj0n+ZHaqq1lH2yVfGUA1ILJv515 -C8BqbvVZuqm3i7ygmw3bqE/lYMgOrYtXXnqOrz6nvsE6Yc9V9rFflOM= +MIIF9zCCA9+gAwIBAgIUH98b4Fw/DyugC9cV7VK7ZODzHsIwDQYJKoZIhvcNAQEL +BQAwgYoxCzAJBgNVBAYTAlhZMRcwFQYDVQQIDA5DYXN0bGUgQW50aHJheDEYMBYG +A1UEBwwPQXJndW1lbnQgQ2xpbmljMSMwIQYDVQQKDBpQeXRob24gU29mdHdhcmUg +Rm91bmRhdGlvbjEjMCEGA1UEAwwac2VsZi1zaWduZWQucHl0aG9udGVzdC5uZXQw +HhcNMTkwNTA4MDEwMjQzWhcNMjcwNzI0MDEwMjQzWjCBijELMAkGA1UEBhMCWFkx +FzAVBgNVBAgMDkNhc3RsZSBBbnRocmF4MRgwFgYDVQQHDA9Bcmd1bWVudCBDbGlu +aWMxIzAhBgNVBAoMGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uMSMwIQYDVQQD +DBpzZWxmLXNpZ25lZC5weXRob250ZXN0Lm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMKdJlyCThkahwoBb7pl5q64Pe9Fn5jrIvzsveHTc97TpjV2 +RLfICnXKrltPk/ohkVl6K5SUZQZwMVzFubkyxE0nZPHYHlpiKWQxbsYVkYv01rix +IFdLvaxxbGYke2jwQao31s4o61AdlsfK1SdpHQUynBBMssqI3SB4XPmcA7e+wEEx +jxjVish4ixA1vuIZOx8yibu+CFCf/geEjoBMF3QPdzULzlrCSw8k/45iZCSoNbvK +DoL4TVV07PHOxpheDh8ZQmepGvU6pVqhb9m4lgmV0OGWHgozd5Ur9CbTVDmxIEz3 +TSoRtNJK7qtyZdGNqwjksQxgZTjM/d/Lm/BJG99AiOmYOjsl9gbQMZgvQmMAtUsI +aMJnQuZ6R+KEpW/TR5qSKLWZSG45z/op+tzI2m+cE6HwTRVAWbcuJxcAA55MZjqU +OOOu3BBYMjS5nf2sQ9uoXsVBFH7i0mQqoW1SLzr9opI8KsWwFxQmO2vBxWYaN+lH +OmwBZBwyODIsmI1YGXmTp09NxRYz3Qe5GCgFzYowpMrcxUC24iduIdMwwhRM7rKg +7GtIWMSrFfuI1XCLRmSlhDbhNN6fVg2f8Bo9PdH9ihiIyxSrc+FOUasUYCCJvlSZ +8hFUlLvcmrZlWuazohm0lsXuMK1JflmQr/DA/uXxP9xzFfRy+RU3jDyxJbRHAgMB +AAGjUzBRMB0GA1UdDgQWBBSQJyxiPMRK01i+0BsV9zUwDiBaHzAfBgNVHSMEGDAW +gBSQJyxiPMRK01i+0BsV9zUwDiBaHzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4ICAQCR+7a7N/m+WLkxPPIA/CB4MOr2Uf8ixTv435Nyv6rXOun0+lTP +ExSZ0uYQ+L0WylItI3cQHULldDueD+s8TGzxf5woaLKf6tqyr0NYhKs+UeNEzDnN +9PHQIhX0SZw3XyXGUgPNBfRCg2ZDdtMMdOU4XlQN/IN/9hbYTrueyY7eXq9hmtI9 +1srftAMqr9SR1JP7aHI6DVgrEsZVMTDnfT8WmLSGLlY1HmGfdEn1Ip5sbo9uSkiH +AEPgPfjYIvR5LqTOMn4KsrlZyBbFIDh9Sl99M1kZzgH6zUGVLCDg1y6Cms69fx/e +W1HoIeVkY4b4TY7Bk7JsqyNhIuqu7ARaxkdaZWhYaA2YyknwANdFfNpfH+elCLIk +BUt5S3f4i7DaUePTvKukCZiCq4Oyln7RcOn5If73wCeLB/ZM9Ei1HforyLWP1CN8 +XLfpHaoeoPSWIveI0XHUl65LsPN2UbMbul/F23hwl+h8+BLmyAS680Yhn4zEN6Ku +B7Po90HoFa1Du3bmx4jsN73UkT/dwMTi6K072FbipnC1904oGlWmLwvAHvrtxxmL +Pl3pvEaZIu8wa/PNF6Y7J7VIewikIJq6Ta6FrWeFfzMWOj2qA1ZZi6fUaDSNYvuV +J5quYKCc/O+I/yDDf8wyBbZ/gvUXzUHTMYGG+bFrn1p7XDbYYeEJ6R/xEg== -----END CERTIFICATE----- diff --git a/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst b/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst new file mode 100644 index 00000000000000..420dfe8323663b --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst @@ -0,0 +1 @@ +Update Lib/test/selfsigned_pythontestdotnet.pem to match self-signed.pythontest.net's new TLS certificate. \ No newline at end of file From 3dbc43f63c7e056b80d6e28f3812125a09555456 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 29 May 2019 04:04:54 +0200 Subject: [PATCH 2139/2287] bpo-32947: test_ssl fixes for TLS 1.3 and OpenSSL 1.1.1 (GH-11612) Backport partially commit 529525fb5a8fd9b96ab4021311a598c77588b918: complete the previous partial backport (commit 2a4ee8aa01d61b6a9c8e9c65c211e61bdb471826. Co-Authored-By: Christian Heimes --- Lib/test/test_ssl.py | 15 +++++++++++++++ .../2019-01-18-17-46-10.bpo-32947.Hk0KnM.rst | 1 + 2 files changed, 16 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2019-01-18-17-46-10.bpo-32947.Hk0KnM.rst diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 0aeabc10f2a97f..2cabfe5d0b08f8 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -2029,6 +2029,16 @@ def run(self): sys.stdout.write(" server: read %r (%s), sending back %r (%s)...\n" % (msg, ctype, msg.lower(), ctype)) self.write(msg.lower()) + except ConnectionResetError: + # XXX: OpenSSL 1.1.1 sometimes raises ConnectionResetError + # when connection is not shut down gracefully. + if self.server.chatty and support.verbose: + sys.stdout.write( + " Connection reset by peer: {}\n".format( + self.addr) + ) + self.close() + self.running = False except OSError: if self.server.chatty: handle_error("Test server failure:\n") @@ -2108,6 +2118,11 @@ def run(self): pass except KeyboardInterrupt: self.stop() + except BaseException as e: + if support.verbose and self.chatty: + sys.stdout.write( + ' connection handling failed: ' + repr(e) + '\n') + self.sock.close() def stop(self): diff --git a/Misc/NEWS.d/next/Tests/2019-01-18-17-46-10.bpo-32947.Hk0KnM.rst b/Misc/NEWS.d/next/Tests/2019-01-18-17-46-10.bpo-32947.Hk0KnM.rst new file mode 100644 index 00000000000000..f508504ea65b33 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-01-18-17-46-10.bpo-32947.Hk0KnM.rst @@ -0,0 +1 @@ +test_ssl fixes for TLS 1.3 and OpenSSL 1.1.1. From 8ab624b17ba656e9af5a79be6af0cf2911a111ba Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Tue, 28 May 2019 19:08:28 -0700 Subject: [PATCH 2140/2287] [3.6] bpo-35925: Skip SSL tests that fail due to weak external certs or old TLS (GH-13124) (GH-13252) * [3.6] bpo-35925: Skip SSL tests that fail due to weak external certs. (GH-13124) Modern Linux distros such as Debian Buster have default OpenSSL system configurations that reject connections to servers with weak certificates by default. This causes our test suite run with external networking resources enabled to skip these tests when they encounter such a failure. Fixing the network servers is a separate issue.. (cherry picked from commit 2cc0223f43a1ffd59c887a73e2b0ce5202f3be90) Co-authored-by: Gregory P. Smith * Also skip ssl tests that fail when the system rejects TLSv1. * Remove the test_httplib change; server was updated. self-signed.pythontest.net was updated so the test_httplib change is no longer necessary. --- Lib/test/test_nntplib.py | 38 +++++++++++++++---- Lib/test/test_ssl.py | 35 +++++++++++++++++ .../2019-05-06-18-29-54.bpo-35925.gwQPuC.rst | 1 + 3 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py index d7642bc66ab346..1d1750a5be22e5 100644 --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -6,6 +6,8 @@ import functools import contextlib import os.path +import re + from test import support from nntplib import NNTP, GroupInfo import nntplib @@ -22,6 +24,13 @@ TIMEOUT = 30 certfile = os.path.join(os.path.dirname(__file__), 'keycert3.pem') +if ssl is not None: + SSLError = ssl.SSLError +else: + class SSLError(Exception): + """Non-existent exception class when we lack SSL support.""" + reason = "This will never be raised." + # TODO: # - test the `file` arg to more commands # - test error conditions @@ -262,14 +271,21 @@ def is_connected(): return False return True - with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: - self.assertTrue(is_connected()) - self.assertTrue(server.help()) - self.assertFalse(is_connected()) - - with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: - server.quit() - self.assertFalse(is_connected()) + try: + with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: + self.assertTrue(is_connected()) + self.assertTrue(server.help()) + self.assertFalse(is_connected()) + + with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: + server.quit() + self.assertFalse(is_connected()) + except SSLError as ssl_err: + # matches "[SSL: DH_KEY_TOO_SMALL] dh key too small" + if re.search(r'(?i)KEY.TOO.SMALL', ssl_err.reason): + raise unittest.SkipTest(f"Got {ssl_err} connecting " + f"to {self.NNTP_HOST!r}") + raise NetworkedNNTPTestsMixin.wrap_methods() @@ -290,6 +306,12 @@ def setUpClass(cls): try: cls.server = cls.NNTP_CLASS(cls.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) + except SSLError as ssl_err: + # matches "[SSL: DH_KEY_TOO_SMALL] dh key too small" + if re.search(r'(?i)KEY.TOO.SMALL', ssl_err.reason): + raise unittest.SkipTest(f"{cls} got {ssl_err} connecting " + f"to {cls.NNTP_HOST!r}") + raise except EOFError: raise unittest.SkipTest(f"{cls} got EOF error on connecting " f"to {cls.NNTP_HOST!r}") diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 2cabfe5d0b08f8..74adebc0fb9955 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -17,6 +17,7 @@ import asyncore import weakref import platform +import re import functools try: import ctypes @@ -145,6 +146,38 @@ def f(*args, **kwargs): else: return func +def skip_if_openssl_cnf_minprotocol_gt_tls1(func): + """Skip a test if the OpenSSL config MinProtocol is > TLSv1. + + OS distros with an /etc/ssl/openssl.cnf and MinProtocol set often do so to + require TLSv1.2 or higher (Debian Buster). Some of our tests for older + protocol versions will fail under such a config. + + Alternative workaround: Run this test in a process with + OPENSSL_CONF=/dev/null in the environment. + """ + @functools.wraps(func) + def f(*args, **kwargs): + openssl_cnf = os.environ.get("OPENSSL_CONF", "/etc/ssl/openssl.cnf") + try: + with open(openssl_cnf, "r") as config: + for line in config: + match = re.match(r"MinProtocol\s*=\s*(TLSv\d+\S*)", line) + if match: + tls_ver = match.group(1) + if tls_ver > "TLSv1": + raise unittest.SkipTest( + "%s has MinProtocol = %s which is > TLSv1." % + (openssl_cnf, tls_ver)) + except (EnvironmentError, UnicodeDecodeError) as err: + # no config file found, etc. + if support.verbose: + sys.stdout.write("\n Could not scan %s for MinProtocol: %s\n" + % (openssl_cnf, err)) + return func(*args, **kwargs) + return f + + needs_sni = unittest.skipUnless(ssl.HAS_SNI, "SNI support needed for this test") @@ -2629,6 +2662,7 @@ def test_protocol_sslv2(self): client_options=ssl.OP_NO_TLSv1) @skip_if_broken_ubuntu_ssl + @skip_if_openssl_cnf_minprotocol_gt_tls1 def test_protocol_sslv23(self): """Connecting to an SSLv23 server with various client options""" if support.verbose: @@ -2706,6 +2740,7 @@ def test_protocol_tlsv1(self): @skip_if_broken_ubuntu_ssl @unittest.skipUnless(hasattr(ssl, "PROTOCOL_TLSv1_1"), "TLS version 1.1 not supported.") + @skip_if_openssl_cnf_minprotocol_gt_tls1 def test_protocol_tlsv1_1(self): """Connecting to a TLSv1.1 server with various client options. Testing against older TLS versions.""" diff --git a/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst b/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst new file mode 100644 index 00000000000000..428326cdfe5bba --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst @@ -0,0 +1 @@ +Skip specific nntplib and ssl networking tests when they would otherwise fail due to a modern OS or distro with a default OpenSSL policy of rejecting connections to servers with weak certificates or disabling TLS below TLSv1.2. From 4f06dae5d8d4400ba38d8502da620f07d4a5696e Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 29 May 2019 04:30:48 +0200 Subject: [PATCH 2141/2287] bpo-35907, CVE-2019-9948: urllib rejects local_file:// scheme (GH-13513) CVE-2019-9948: Avoid file reading by disallowing local-file:// and local_file:// URL schemes in URLopener().open() and URLopener().retrieve() of urllib.request. Co-Authored-By: SH (cherry picked from commit 0c2b6a3943aa7b022e8eb4bfd9bffcddebf9a587) (cherry picked from commit 34bab215596671d0dec2066ae7d7450cd73f638b) --- Lib/test/test_urllib.py | 18 ++++++++++++++++++ Lib/urllib/request.py | 2 +- .../2019-05-21-23-20-18.bpo-35907.NC_zNK.rst | 3 +++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 649a5b81575b0f..0061a5297cb351 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -16,6 +16,7 @@ ssl = None import sys import tempfile +import warnings from nturl2path import url2pathname, pathname2url from base64 import b64encode @@ -1463,6 +1464,23 @@ def open_spam(self, url): "spam://c:|windows%/:=&?~#+!$,;'@()*[]|/path/"), "//c:|windows%/:=&?~#+!$,;'@()*[]|/path/") + def test_local_file_open(self): + # bpo-35907, CVE-2019-9948: urllib must reject local_file:// scheme + class DummyURLopener(urllib.request.URLopener): + def open_local_file(self, url): + return url + + with warnings.catch_warnings(record=True): + warnings.simplefilter("ignore", DeprecationWarning) + + for url in ('local_file://example', 'local-file://example'): + self.assertRaises(OSError, urllib.request.urlopen, url) + self.assertRaises(OSError, urllib.request.URLopener().open, url) + self.assertRaises(OSError, urllib.request.URLopener().retrieve, url) + self.assertRaises(OSError, DummyURLopener().open, url) + self.assertRaises(OSError, DummyURLopener().retrieve, url) + + # Just commented them out. # Can't really tell why keep failing in windows and sparc. # Everywhere else they work ok, but on those machines, sometimes diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index d28f2f8369c746..c9945d951821e7 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1747,7 +1747,7 @@ def open(self, fullurl, data=None): name = 'open_' + urltype self.type = urltype name = name.replace('-', '_') - if not hasattr(self, name): + if not hasattr(self, name) or name == 'open_local_file': if proxy: return self.open_unknown_proxy(proxy, fullurl, data) else: diff --git a/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst b/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst new file mode 100644 index 00000000000000..37b567a5b6f93b --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst @@ -0,0 +1,3 @@ +CVE-2019-9948: Avoid file reading by disallowing ``local-file://`` and +``local_file://`` URL schemes in ``URLopener().open()`` and +``URLopener().retrieve()`` of :mod:`urllib.request`. From fd1771dbdd28709716bd531580c40ae5ed814468 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 4 Jun 2019 11:43:52 -0700 Subject: [PATCH 2142/2287] bpo-36742: Corrects fix to handle decomposition in usernames (GH-13812) (GH-13814) (cherry picked from commit 8d0ef0b5edeae52960c7ed05ae8a12388324f87e) Co-authored-by: Steve Dower --- Lib/test/test_urlparse.py | 11 ++++++----- Lib/urllib/parse.py | 6 +++--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index c2623544946198..68f633ca3a7dbc 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -1008,11 +1008,12 @@ def test_urlsplit_normalization(self): urllib.parse.urlsplit('http://\u30d5\u309a\ufe1380') for scheme in ["http", "https", "ftp"]: - for c in denorm_chars: - url = "{}://netloc{}false.netloc/path".format(scheme, c) - with self.subTest(url=url, char='{:04X}'.format(ord(c))): - with self.assertRaises(ValueError): - urllib.parse.urlsplit(url) + for netloc in ["netloc{}false.netloc", "n{}user@netloc"]: + for c in denorm_chars: + url = "{}://{}/path".format(scheme, netloc.format(c)) + with self.subTest(url=url, char='{:04X}'.format(ord(c))): + with self.assertRaises(ValueError): + urllib.parse.urlsplit(url) class Utility_Tests(unittest.TestCase): """Testcase to test the various utility functions in the urllib.""" diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 791b457bfb8a82..fa8827a9fa7908 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -397,9 +397,9 @@ def _checknetloc(netloc): # looking for characters like \u2100 that expand to 'a/c' # IDNA uses NFKC equivalence, so normalize for this check import unicodedata - n = netloc.rpartition('@')[2] # ignore anything to the left of '@' - n = n.replace(':', '') # ignore characters already included - n = n.replace('#', '') # but not the surrounding text + n = netloc.replace('@', '') # ignore characters already included + n = n.replace(':', '') # but not the surrounding text + n = n.replace('#', '') n = n.replace('?', '') netloc2 = unicodedata.normalize('NFKC', n) if n == netloc2: From dffc558dac05483186ae92fa926994d964ad4093 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 4 Jun 2019 16:22:50 -0700 Subject: [PATCH 2143/2287] Doc: Python 3.9 in sidebar and version switcher. (GH-13824) (GH-13827) (cherry picked from commit 59e7bbcaa4d0d556591f774c5ea4869c41fa95b0) Co-authored-by: Julien Palard --- Doc/tools/static/switchers.js | 3 ++- Doc/tools/templates/indexsidebar.html | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Doc/tools/static/switchers.js b/Doc/tools/static/switchers.js index 20dad93d6a5edf..7a5c8bd3847839 100644 --- a/Doc/tools/static/switchers.js +++ b/Doc/tools/static/switchers.js @@ -10,7 +10,8 @@ '(?:release/\\d.\\d[\\x\\d\\.]*)']; var all_versions = { - '3.8': 'dev (3.8)', + '3.9': 'dev (3.9)', + '3.8': 'pre (3.8)', '3.7': '3.7', '3.6': '3.6', '3.5': '3.5', diff --git a/Doc/tools/templates/indexsidebar.html b/Doc/tools/templates/indexsidebar.html index 1181f7179c6c68..0adaf038d0e522 100644 --- a/Doc/tools/templates/indexsidebar.html +++ b/Doc/tools/templates/indexsidebar.html @@ -2,7 +2,8 @@

      {% trans %}Download{% endtrans %}

      {% trans %}Download these documents{% endtrans %}

      {% trans %}Docs by version{% endtrans %}

        -
      • {% trans %}Python 3.8 (in development){% endtrans %}
      • +
      • {% trans %}Python 3.9 (in development){% endtrans %}
      • +
      • {% trans %}Python 3.8 (pre-release){% endtrans %}
      • {% trans %}Python 3.7 (stable){% endtrans %}
      • {% trans %}Python 3.6 (security-fixes){% endtrans %}
      • {% trans %}Python 3.5 (security-fixes){% endtrans %}
      • From 9393e19a95ca2df373690cccf93f7109833f9004 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 8 Jun 2019 17:54:57 -0700 Subject: [PATCH 2144/2287] Stop using deprecated logging API in Sphinx suspicious checker (GH-9875) (GH-13923) (cherry picked from commit ee171a26c1169abfae534b08acc0d95c6e45a22a) Co-authored-by: Pablo Galindo --- Doc/tools/extensions/suspicious.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Doc/tools/extensions/suspicious.py b/Doc/tools/extensions/suspicious.py index 0a70e57d2b044f..8d80f6759bffd4 100644 --- a/Doc/tools/extensions/suspicious.py +++ b/Doc/tools/extensions/suspicious.py @@ -48,6 +48,7 @@ from docutils import nodes from sphinx.builders import Builder +import sphinx.util detect_all = re.compile(r''' ::(?=[^=])| # two :: (but NOT ::=) @@ -85,6 +86,7 @@ class CheckSuspiciousMarkupBuilder(Builder): Checks for possibly invalid markup that may leak into the output. """ name = 'suspicious' + logger = sphinx.util.logging.getLogger("CheckSuspiciousMarkupBuilder") def init(self): # create output file @@ -116,7 +118,7 @@ def finish(self): self.warn('Found %s/%s unused rules:' % (len(unused_rules), len(self.rules))) for rule in unused_rules: - self.info(repr(rule)) + self.logger.info(repr(rule)) return def check_issue(self, line, lineno, issue): @@ -146,7 +148,7 @@ def is_ignored(self, line, lineno, issue): return False def report_issue(self, text, lineno, issue): - if not self.any_issue: self.info() + if not self.any_issue: self.logger.info() self.any_issue = True self.write_log_entry(lineno, issue, text) if py3: @@ -181,7 +183,7 @@ def load_rules(self, filename): A csv file, with exactly the same format as suspicious.csv Fields: document name (normalized), line number, issue, surrounding text """ - self.info("loading ignore rules... ", nonl=1) + self.logger.info("loading ignore rules... ", nonl=1) self.rules = rules = [] try: if py3: @@ -206,7 +208,7 @@ def load_rules(self, filename): rule = Rule(docname, lineno, issue, text) rules.append(rule) f.close() - self.info('done, %d rules loaded' % len(self.rules)) + self.logger.info('done, %d rules loaded' % len(self.rules)) def get_lineno(node): From 1af68a65194a26d959161df33fc25ade7f812009 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Thu, 13 Jun 2019 00:35:19 -0400 Subject: [PATCH 2145/2287] [3.6] Doc fix: duplicate object description of email.message (GH-13742) (GH-14041) --- Doc/library/email.compat32-message.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/Doc/library/email.compat32-message.rst b/Doc/library/email.compat32-message.rst index ed380151769a52..8d1c2f5daffb5d 100644 --- a/Doc/library/email.compat32-message.rst +++ b/Doc/library/email.compat32-message.rst @@ -6,6 +6,7 @@ .. module:: email.message :synopsis: The base class representing email messages in a fashion backward compatible with python3.2 + :noindex: The :class:`Message` class is very similar to the From 78309c9a09c896b30918ef1732df910e33cdaee1 Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Sat, 15 Jun 2019 20:25:03 +0200 Subject: [PATCH 2146/2287] [3.6] Doc: Add an optional obsolete header. (GH-13638). (GH-13657) (cherry picked from commit 46ed90dd014010703c7a3b2a61c4927644fa8210) Co-authored-by: Julien Palard --- Doc/README.rst | 9 +++++++++ Doc/tools/templates/layout.html | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/Doc/README.rst b/Doc/README.rst index d7bcc5ba7919bb..9fc39834f8b543 100644 --- a/Doc/README.rst +++ b/Doc/README.rst @@ -113,6 +113,15 @@ Then, from the ``Doc`` directory, run :: where ```` is one of html, text, latex, or htmlhelp (for explanations see the make targets above). +Deprecation header +================== + +You can define the ``outdated`` variable in ``html_context`` to show a +red banner on each page redirecting to the "latest" version. + +The link points to the same page on ``/3/``, sadly for the moment the +language is lost during the process. + Contributing ============ diff --git a/Doc/tools/templates/layout.html b/Doc/tools/templates/layout.html index c2106678ac60f4..e7c5d92c888f8b 100644 --- a/Doc/tools/templates/layout.html +++ b/Doc/tools/templates/layout.html @@ -1,4 +1,15 @@ {% extends "!layout.html" %} + +{% block header %} +{%- if outdated %} +
        + {% trans %}This document is for an old version of Python that is no longer supported. + You should upgrade, and read the {% endtrans %} + {% trans %} Python documentation for the current stable release {% endtrans %}. +
        +{%- endif %} +{% endblock %} + {% block rootrellink %}
      • From ecafe8e42464b2c91a507fd26de06ce1203dd654 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 16 Jun 2019 11:55:59 -0700 Subject: [PATCH 2147/2287] Doc: Remove an ugly space before a dot. (GH-14123) (GH-14130) (cherry picked from commit 552951563cd5968d25e95306362e41f07d661a88) Co-authored-by: Julien Palard --- Doc/tools/templates/layout.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/tools/templates/layout.html b/Doc/tools/templates/layout.html index e7c5d92c888f8b..7a7feb52e1a3e8 100644 --- a/Doc/tools/templates/layout.html +++ b/Doc/tools/templates/layout.html @@ -5,7 +5,7 @@
        {% trans %}This document is for an old version of Python that is no longer supported. You should upgrade, and read the {% endtrans %} - {% trans %} Python documentation for the current stable release {% endtrans %}. + {% trans %} Python documentation for the current stable release{% endtrans %}.
        {%- endif %} {% endblock %} From 516a6a254814d2bc6a90290dfc44d77fdfb4050b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 18 Jun 2019 02:13:58 +0200 Subject: [PATCH 2148/2287] bpo-33529, email: Fix infinite loop in email header encoding (GH-12020) (GH-14162) (cherry picked from commit c1f5667be1e3ec5871560c677402c1252c6018a6) --- Lib/email/_header_value_parser.py | 23 +++++++++++-------- Lib/test/test_email/test_headerregistry.py | 8 +++---- Lib/test/test_email/test_policy.py | 8 +++++++ .../2019-02-24-18-48-16.bpo-33529.wpNNBD.rst | 2 ++ 4 files changed, 27 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 1fb8cb448a01d7..f42cde203cef9e 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -2725,16 +2725,19 @@ def _fold_as_ew(to_encode, lines, maxlen, last_ew, ew_combine_allowed, charset): lines.append(' ') # XXX We'll get an infinite loop here if maxlen is <= 7 continue - first_part = to_encode[:text_space] - ew = _ew.encode(first_part, charset=encode_as) - excess = len(ew) - remaining_space - if excess > 0: - # encode always chooses the shortest encoding, so this - # is guaranteed to fit at this point. - first_part = first_part[:-excess] - ew = _ew.encode(first_part) - lines[-1] += ew - to_encode = to_encode[len(first_part):] + + to_encode_word = to_encode[:text_space] + encoded_word = _ew.encode(to_encode_word, charset=encode_as) + excess = len(encoded_word) - remaining_space + while excess > 0: + # Since the chunk to encode is guaranteed to fit into less than 100 characters, + # shrinking it by one at a time shouldn't take long. + to_encode_word = to_encode_word[:-1] + encoded_word = _ew.encode(to_encode_word, charset=encode_as) + excess = len(encoded_word) - remaining_space + lines[-1] += encoded_word + to_encode = to_encode[len(to_encode_word):] + if to_encode: lines.append(' ') new_last_ew = len(lines[-1]) diff --git a/Lib/test/test_email/test_headerregistry.py b/Lib/test/test_email/test_headerregistry.py index 30ce0ba54e4728..d1007099f666c9 100644 --- a/Lib/test/test_email/test_headerregistry.py +++ b/Lib/test/test_email/test_headerregistry.py @@ -1643,10 +1643,10 @@ def test_fold_overlong_words_using_RFC2047(self): self.assertEqual( h.fold(policy=policy.default), 'X-Report-Abuse: =?utf-8?q?=3Chttps=3A//www=2Emailitapp=2E' - 'com/report=5F?=\n' - ' =?utf-8?q?abuse=2Ephp=3Fmid=3Dxxx-xxx-xxxx' - 'xxxxxxxxxxxxxxxxxxxx=3D=3D-xxx-?=\n' - ' =?utf-8?q?xx-xx=3E?=\n') + 'com/report=5Fabuse?=\n' + ' =?utf-8?q?=2Ephp=3Fmid=3Dxxx-xxx-xxxx' + 'xxxxxxxxxxxxxxxxxxxx=3D=3D-xxx-xx-xx?=\n' + ' =?utf-8?q?=3E?=\n') if __name__ == '__main__': diff --git a/Lib/test/test_email/test_policy.py b/Lib/test/test_email/test_policy.py index 8fecb8a5fcd5a8..c2c437e6ac2695 100644 --- a/Lib/test/test_email/test_policy.py +++ b/Lib/test/test_email/test_policy.py @@ -237,6 +237,14 @@ def test_adding_default_policies_preserves_default_factory(self): email.policy.EmailPolicy.header_factory) self.assertEqual(newpolicy.__dict__, {'raise_on_defect': True}) + def test_non_ascii_chars_do_not_cause_inf_loop(self): + policy = email.policy.default.clone(max_line_length=20) + actual = policy.fold('Subject', 'ą' * 12) + self.assertEqual( + actual, + 'Subject: \n' + + 12 * ' =?utf-8?q?=C4=85?=\n') + # XXX: Need subclassing tests. # For adding subclassed objects, make sure the usual rules apply (subclass # wins), but that the order still works (right overrides left). diff --git a/Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst b/Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst new file mode 100644 index 00000000000000..84d16f5a56ae2b --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst @@ -0,0 +1,2 @@ +Prevent fold function used in email header encoding from entering infinite +loop when there are too many non-ASCII characters in a header. From 0d47586d0262a4a2cc2ff855db3b3e9def8fda11 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 18 Jun 2019 20:37:44 -0400 Subject: [PATCH 2149/2287] 3.6.9rc1 --- Include/patchlevel.h | 8 +- Lib/pydoc_data/topics.py | 28 +-- Misc/NEWS.d/3.6.9rc1.rst | 165 ++++++++++++++++++ .../2018-12-22-22-52-05.bpo-35564.TuEU_D.rst | 1 - .../2018-12-30-09-56-13.bpo-35605.gAWt32.rst | 1 - .../2018-12-30-14-35-19.bpo-35121.oWmiGU.rst | 3 - .../2019-01-02-20-04-49.bpo-35643.DaMiaV.rst | 2 - .../2018-10-31-15-39-17.bpo-35121.EgHv9k.rst | 4 - .../2019-01-15-18-16-05.bpo-35746.nMSd0j.rst | 4 - .../2019-02-24-18-48-16.bpo-33529.wpNNBD.rst | 2 - .../2019-03-06-09-38-40.bpo-36216.6q1m4a.rst | 3 - .../2019-04-10-08-53-30.bpo-30458.51E-DA.rst | 1 - .../2019-04-29-15-34-59.bpo-36742.QCUY0i.rst | 1 - .../2019-05-21-23-20-18.bpo-35907.NC_zNK.rst | 3 - .../2019-01-18-17-46-10.bpo-32947.Hk0KnM.rst | 1 - .../2019-02-24-01-58-38.bpo-27313.Sj9veH.rst | 1 - .../2019-05-06-18-29-54.bpo-35925.gwQPuC.rst | 1 - .../2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst | 1 - .../2019-04-29-10-54-14.bpo-34602.Lrl2zU.rst | 3 - README.rst | 4 +- 20 files changed, 185 insertions(+), 52 deletions(-) create mode 100644 Misc/NEWS.d/3.6.9rc1.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2018-12-30-09-56-13.bpo-35605.gAWt32.rst delete mode 100644 Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-01-02-20-04-49.bpo-35643.DaMiaV.rst delete mode 100644 Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst delete mode 100644 Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst delete mode 100644 Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst delete mode 100644 Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst delete mode 100644 Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst delete mode 100644 Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst delete mode 100644 Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst delete mode 100644 Misc/NEWS.d/next/Tests/2019-01-18-17-46-10.bpo-32947.Hk0KnM.rst delete mode 100644 Misc/NEWS.d/next/Tests/2019-02-24-01-58-38.bpo-27313.Sj9veH.rst delete mode 100644 Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst delete mode 100644 Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst delete mode 100644 Misc/NEWS.d/next/macOS/2019-04-29-10-54-14.bpo-34602.Lrl2zU.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 7289d41e6c812d..270e61792cebc8 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -18,12 +18,12 @@ /*--start constants--*/ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 6 -#define PY_MICRO_VERSION 8 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL -#define PY_RELEASE_SERIAL 0 +#define PY_MICRO_VERSION 9 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA +#define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.6.8+" +#define PY_VERSION "3.6.9rc1" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index e4c63058087e51..df3f212eb73efe 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Sun Dec 23 16:24:21 2018 +# Autogenerated by Sphinx on Tue Jun 18 20:31:29 2019 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -4862,7 +4862,7 @@ 'Meaning ' '|\n' ' ' - '+===========+============================================================+\n' + '|===========|============================================================|\n' ' | "\'<\'" | Forces the field to be left-aligned ' 'within the available |\n' ' | | space (this is the default for most ' @@ -4911,7 +4911,7 @@ 'Meaning ' '|\n' ' ' - '+===========+============================================================+\n' + '|===========|============================================================|\n' ' | "\'+\'" | indicates that a sign should be used for ' 'both positive as |\n' ' | | well as negative ' @@ -5015,7 +5015,7 @@ 'Meaning ' '|\n' ' ' - '+===========+============================================================+\n' + '|===========|============================================================|\n' ' | "\'s\'" | String format. This is the default type ' 'for strings and |\n' ' | | may be ' @@ -5035,7 +5035,7 @@ 'Meaning ' '|\n' ' ' - '+===========+============================================================+\n' + '|===========|============================================================|\n' ' | "\'b\'" | Binary format. Outputs the number in ' 'base 2. |\n' ' ' @@ -5097,7 +5097,7 @@ 'Meaning ' '|\n' ' ' - '+===========+============================================================+\n' + '|===========|============================================================|\n' ' | "\'e\'" | Exponent notation. Prints the number in ' 'scientific |\n' ' | | notation using the letter ‘e’ to indicate ' @@ -6777,7 +6777,7 @@ '+-------------------------------------------------+---------------------------------------+\n' '| Operator | ' 'Description |\n' - '+=================================================+=======================================+\n' + '|=================================================|=======================================|\n' '| "lambda" | ' 'Lambda expression |\n' '+-------------------------------------------------+---------------------------------------+\n' @@ -9911,7 +9911,7 @@ ' | Representation | ' 'Description |\n' ' ' - '+=========================+===============================+\n' + '|=========================|===============================|\n' ' | "\\n" | Line ' 'Feed |\n' ' ' @@ -10252,7 +10252,7 @@ '+-------------------+-----------------------------------+---------+\n' '| Escape Sequence | Meaning | Notes ' '|\n' - '+===================+===================================+=========+\n' + '|===================|===================================|=========|\n' '| "\\newline" | Backslash and newline ignored ' '| |\n' '+-------------------+-----------------------------------+---------+\n' @@ -10298,7 +10298,7 @@ '+-------------------+-----------------------------------+---------+\n' '| Escape Sequence | Meaning | Notes ' '|\n' - '+===================+===================================+=========+\n' + '|===================|===================================|=========|\n' '| "\\N{name}" | Character named *name* in the | ' '(4) |\n' '| | Unicode database | ' @@ -10929,7 +10929,7 @@ ' | Attribute | Meaning ' '| |\n' ' ' - '+===========================+=================================+=============+\n' + '|===========================|=================================|=============|\n' ' | "__doc__" | The function’s documentation ' '| Writable |\n' ' | | string, or "None" if ' @@ -12110,7 +12110,7 @@ '+----------------------------+----------------------------------+------------+\n' '| Operation | Result ' '| Notes |\n' - '+============================+==================================+============+\n' + '|============================|==================================|============|\n' '| "x in s" | "True" if an item of *s* is ' '| (1) |\n' '| | equal to *x*, else "False" ' @@ -12339,7 +12339,7 @@ '+--------------------------------+----------------------------------+-----------------------+\n' '| Operation | ' 'Result | Notes |\n' - '+================================+==================================+=======================+\n' + '|================================|==================================|=======================|\n' '| "s[i] = x" | item *i* of *s* is replaced ' 'by | |\n' '| | ' @@ -12793,7 +12793,7 @@ '| Operation | ' 'Result | Notes ' '|\n' - '+================================+==================================+=======================+\n' + '|================================|==================================|=======================|\n' '| "s[i] = x" | item *i* of *s* is ' 'replaced by | |\n' '| | ' diff --git a/Misc/NEWS.d/3.6.9rc1.rst b/Misc/NEWS.d/3.6.9rc1.rst new file mode 100644 index 00000000000000..c810151fafdc24 --- /dev/null +++ b/Misc/NEWS.d/3.6.9rc1.rst @@ -0,0 +1,165 @@ +.. bpo: 35907 +.. date: 2019-05-21-23-20-18 +.. nonce: NC_zNK +.. release date: 2019-06-18 +.. section: Security + +CVE-2019-9948: Avoid file reading by disallowing ``local-file://`` and +``local_file://`` URL schemes in ``URLopener().open()`` and +``URLopener().retrieve()`` of :mod:`urllib.request`. + +.. + +.. bpo: 36742 +.. date: 2019-04-29-15-34-59 +.. nonce: QCUY0i +.. section: Security + +Fixes mishandling of pre-normalization characters in urlsplit(). + +.. + +.. bpo: 30458 +.. date: 2019-04-10-08-53-30 +.. nonce: 51E-DA +.. section: Security + +Address CVE-2019-9740 by disallowing URL paths with embedded whitespace or +control characters through into the underlying http client request. Such +potentially malicious header injection URLs now cause an +http.client.InvalidURL exception to be raised. + +.. + +.. bpo: 36216 +.. date: 2019-03-06-09-38-40 +.. nonce: 6q1m4a +.. section: Security + +Changes urlsplit() to raise ValueError when the URL contains characters that +decompose under IDNA encoding (NFKC-normalization) into characters that +affect how the URL is parsed. + +.. + +.. bpo: 33529 +.. date: 2019-02-24-18-48-16 +.. nonce: wpNNBD +.. section: Security + +Prevent fold function used in email header encoding from entering infinite +loop when there are too many non-ASCII characters in a header. + +.. + +.. bpo: 35746 +.. date: 2019-01-15-18-16-05 +.. nonce: nMSd0j +.. section: Security + +[CVE-2019-5010] Fix a NULL pointer deref in ssl module. The cert parser did +not handle CRL distribution points with empty DP or URI correctly. A +malicious or buggy certificate can result into segfault. Vulnerability +(TALOS-2018-0758) reported by Colin Read and Nicolas Edet of Cisco. + +.. + +.. bpo: 35121 +.. date: 2018-10-31-15-39-17 +.. nonce: EgHv9k +.. section: Security + +Don't send cookies of domain A without Domain attribute to domain B when +domain A is a suffix match of domain B while using a cookiejar with +:class:`http.cookiejar.DefaultCookiePolicy` policy. Patch by Karthikeyan +Singaravelan. + +.. + +.. bpo: 35643 +.. date: 2019-01-02-20-04-49 +.. nonce: DaMiaV +.. section: Library + +Fixed a SyntaxWarning: invalid escape sequence in Modules/_sha3/cleanup.py. +Patch by Mickaël Schoentgen. + +.. + +.. bpo: 35121 +.. date: 2018-12-30-14-35-19 +.. nonce: oWmiGU +.. section: Library + +Don't set cookie for a request when the request path is a prefix match of +the cookie's path attribute but doesn't end with "/". Patch by Karthikeyan +Singaravelan. + +.. + +.. bpo: 35605 +.. date: 2018-12-30-09-56-13 +.. nonce: gAWt32 +.. section: Documentation + +Fix documentation build for sphinx<1.6. Patch by Anthony Sottile. + +.. + +.. bpo: 35564 +.. date: 2018-12-22-22-52-05 +.. nonce: TuEU_D +.. section: Documentation + +Explicitly set master_doc variable in conf.py for compliance with Sphinx 2.0 + +.. + +.. bpo: 36816 +.. date: 2019-05-08-15-55-46 +.. nonce: WBKRGZ +.. section: Tests + +Update Lib/test/selfsigned_pythontestdotnet.pem to match +self-signed.pythontest.net's new TLS certificate. + +.. + +.. bpo: 35925 +.. date: 2019-05-06-18-29-54 +.. nonce: gwQPuC +.. section: Tests + +Skip specific nntplib and ssl networking tests when they would otherwise +fail due to a modern OS or distro with a default OpenSSL policy of rejecting +connections to servers with weak certificates or disabling TLS below +TLSv1.2. + +.. + +.. bpo: 27313 +.. date: 2019-02-24-01-58-38 +.. nonce: Sj9veH +.. section: Tests + +Avoid test_ttk_guionly ComboboxTest failure with macOS Cocoa Tk. + +.. + +.. bpo: 32947 +.. date: 2019-01-18-17-46-10 +.. nonce: Hk0KnM +.. section: Tests + +test_ssl fixes for TLS 1.3 and OpenSSL 1.1.1. + +.. + +.. bpo: 34602 +.. date: 2019-04-29-10-54-14 +.. nonce: Lrl2zU +.. section: macOS + +Avoid failures setting macOS stack resource limit with resource.setrlimit. +This reverts an earlier fix for bpo-18075 which forced a non-default stack +size when building the interpreter executable on macOS. diff --git a/Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst b/Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst deleted file mode 100644 index 8ca95eed4c56e5..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-12-22-22-52-05.bpo-35564.TuEU_D.rst +++ /dev/null @@ -1 +0,0 @@ -Explicitly set master_doc variable in conf.py for compliance with Sphinx 2.0 diff --git a/Misc/NEWS.d/next/Documentation/2018-12-30-09-56-13.bpo-35605.gAWt32.rst b/Misc/NEWS.d/next/Documentation/2018-12-30-09-56-13.bpo-35605.gAWt32.rst deleted file mode 100644 index cbc0f1e07f3124..00000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-12-30-09-56-13.bpo-35605.gAWt32.rst +++ /dev/null @@ -1 +0,0 @@ -Fix documentation build for sphinx<1.6. Patch by Anthony Sottile. diff --git a/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst b/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst deleted file mode 100644 index 032e1e2c00bc5d..00000000000000 --- a/Misc/NEWS.d/next/Library/2018-12-30-14-35-19.bpo-35121.oWmiGU.rst +++ /dev/null @@ -1,3 +0,0 @@ -Don't set cookie for a request when the request path is a prefix match of -the cookie's path attribute but doesn't end with "/". Patch by Karthikeyan -Singaravelan. diff --git a/Misc/NEWS.d/next/Library/2019-01-02-20-04-49.bpo-35643.DaMiaV.rst b/Misc/NEWS.d/next/Library/2019-01-02-20-04-49.bpo-35643.DaMiaV.rst deleted file mode 100644 index 0b47bb61fc0588..00000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-02-20-04-49.bpo-35643.DaMiaV.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed a SyntaxWarning: invalid escape sequence in Modules/_sha3/cleanup.py. -Patch by Mickaël Schoentgen. diff --git a/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst b/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst deleted file mode 100644 index d2eb8f1f352c21..00000000000000 --- a/Misc/NEWS.d/next/Security/2018-10-31-15-39-17.bpo-35121.EgHv9k.rst +++ /dev/null @@ -1,4 +0,0 @@ -Don't send cookies of domain A without Domain attribute to domain B -when domain A is a suffix match of domain B while using a cookiejar -with :class:`http.cookiejar.DefaultCookiePolicy` policy. Patch by -Karthikeyan Singaravelan. diff --git a/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst b/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst deleted file mode 100644 index fc703b9c2469b3..00000000000000 --- a/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst +++ /dev/null @@ -1,4 +0,0 @@ -[CVE-2019-5010] Fix a NULL pointer deref in ssl module. The cert parser did -not handle CRL distribution points with empty DP or URI correctly. A -malicious or buggy certificate can result into segfault. Vulnerability -(TALOS-2018-0758) reported by Colin Read and Nicolas Edet of Cisco. diff --git a/Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst b/Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst deleted file mode 100644 index 84d16f5a56ae2b..00000000000000 --- a/Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst +++ /dev/null @@ -1,2 +0,0 @@ -Prevent fold function used in email header encoding from entering infinite -loop when there are too many non-ASCII characters in a header. diff --git a/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst b/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst deleted file mode 100644 index 5546394157f9e5..00000000000000 --- a/Misc/NEWS.d/next/Security/2019-03-06-09-38-40.bpo-36216.6q1m4a.rst +++ /dev/null @@ -1,3 +0,0 @@ -Changes urlsplit() to raise ValueError when the URL contains characters that -decompose under IDNA encoding (NFKC-normalization) into characters that -affect how the URL is parsed. diff --git a/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst b/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst deleted file mode 100644 index ed8027fb4d6420..00000000000000 --- a/Misc/NEWS.d/next/Security/2019-04-10-08-53-30.bpo-30458.51E-DA.rst +++ /dev/null @@ -1 +0,0 @@ -Address CVE-2019-9740 by disallowing URL paths with embedded whitespace or control characters through into the underlying http client request. Such potentially malicious header injection URLs now cause an http.client.InvalidURL exception to be raised. diff --git a/Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst b/Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst deleted file mode 100644 index d729ed2f3cd507..00000000000000 --- a/Misc/NEWS.d/next/Security/2019-04-29-15-34-59.bpo-36742.QCUY0i.rst +++ /dev/null @@ -1 +0,0 @@ -Fixes mishandling of pre-normalization characters in urlsplit(). diff --git a/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst b/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst deleted file mode 100644 index 37b567a5b6f93b..00000000000000 --- a/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst +++ /dev/null @@ -1,3 +0,0 @@ -CVE-2019-9948: Avoid file reading by disallowing ``local-file://`` and -``local_file://`` URL schemes in ``URLopener().open()`` and -``URLopener().retrieve()`` of :mod:`urllib.request`. diff --git a/Misc/NEWS.d/next/Tests/2019-01-18-17-46-10.bpo-32947.Hk0KnM.rst b/Misc/NEWS.d/next/Tests/2019-01-18-17-46-10.bpo-32947.Hk0KnM.rst deleted file mode 100644 index f508504ea65b33..00000000000000 --- a/Misc/NEWS.d/next/Tests/2019-01-18-17-46-10.bpo-32947.Hk0KnM.rst +++ /dev/null @@ -1 +0,0 @@ -test_ssl fixes for TLS 1.3 and OpenSSL 1.1.1. diff --git a/Misc/NEWS.d/next/Tests/2019-02-24-01-58-38.bpo-27313.Sj9veH.rst b/Misc/NEWS.d/next/Tests/2019-02-24-01-58-38.bpo-27313.Sj9veH.rst deleted file mode 100644 index 189b9cf69f0733..00000000000000 --- a/Misc/NEWS.d/next/Tests/2019-02-24-01-58-38.bpo-27313.Sj9veH.rst +++ /dev/null @@ -1 +0,0 @@ -Avoid test_ttk_guionly ComboboxTest failure with macOS Cocoa Tk. diff --git a/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst b/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst deleted file mode 100644 index 428326cdfe5bba..00000000000000 --- a/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst +++ /dev/null @@ -1 +0,0 @@ -Skip specific nntplib and ssl networking tests when they would otherwise fail due to a modern OS or distro with a default OpenSSL policy of rejecting connections to servers with weak certificates or disabling TLS below TLSv1.2. diff --git a/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst b/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst deleted file mode 100644 index 420dfe8323663b..00000000000000 --- a/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst +++ /dev/null @@ -1 +0,0 @@ -Update Lib/test/selfsigned_pythontestdotnet.pem to match self-signed.pythontest.net's new TLS certificate. \ No newline at end of file diff --git a/Misc/NEWS.d/next/macOS/2019-04-29-10-54-14.bpo-34602.Lrl2zU.rst b/Misc/NEWS.d/next/macOS/2019-04-29-10-54-14.bpo-34602.Lrl2zU.rst deleted file mode 100644 index 6f7ac881c82e2e..00000000000000 --- a/Misc/NEWS.d/next/macOS/2019-04-29-10-54-14.bpo-34602.Lrl2zU.rst +++ /dev/null @@ -1,3 +0,0 @@ -Avoid failures setting macOS stack resource limit with resource.setrlimit. -This reverts an earlier fix for bpo-18075 which forced a non-default stack -size when building the interpreter executable on macOS. diff --git a/README.rst b/README.rst index e1d13b07ee9f7f..48ed1193421462 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.6.8+ -============================= +This is Python version 3.6.9 candidate 1 +======================================== .. image:: https://travis-ci.org/python/cpython.svg?branch=3.6 :alt: CPython build status on Travis CI From 31fb351211cb9c81d5878ad3518b3a7bf0211473 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 18 Jun 2019 23:50:05 -0400 Subject: [PATCH 2150/2287] Post release updates --- Include/patchlevel.h | 2 +- README.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 270e61792cebc8..3cb041517fe6dc 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -23,7 +23,7 @@ #define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.6.9rc1" +#define PY_VERSION "3.6.9rc1+" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/README.rst b/README.rst index 48ed1193421462..65e43296699ca6 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.6.9 candidate 1 -======================================== +This is Python version 3.6.9 candidate 1+ +========================================= .. image:: https://travis-ci.org/python/cpython.svg?branch=3.6 :alt: CPython build status on Travis CI From 6632906c08e1d4de0fceba42c47886be41b7ba3d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 27 Jun 2019 21:16:48 -0700 Subject: [PATCH 2151/2287] closes bpo-37437: Update vendorized expat to 2.2.7. (GH-14436) (cherry picked from commit 3b03b09fc94425915c5b1225e9200a3a95bc827b) Co-authored-by: Benjamin Peterson --- .../2019-06-27-20-33-50.bpo-37437.du39_A.rst | 1 + Modules/expat/expat.h | 2 +- Modules/expat/expat_external.h | 10 +++---- Modules/expat/internal.h | 5 ++++ Modules/expat/winconfig.h | 4 --- Modules/expat/xmlparse.c | 29 +++++++------------ Modules/expat/xmltok.c | 3 -- 7 files changed, 22 insertions(+), 32 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-06-27-20-33-50.bpo-37437.du39_A.rst diff --git a/Misc/NEWS.d/next/Library/2019-06-27-20-33-50.bpo-37437.du39_A.rst b/Misc/NEWS.d/next/Library/2019-06-27-20-33-50.bpo-37437.du39_A.rst new file mode 100644 index 00000000000000..80719ee152d7af --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-27-20-33-50.bpo-37437.du39_A.rst @@ -0,0 +1 @@ +Update vendorized expat version to 2.2.7. diff --git a/Modules/expat/expat.h b/Modules/expat/expat.h index 174c3fafda3f27..c050f1d918cef0 100644 --- a/Modules/expat/expat.h +++ b/Modules/expat/expat.h @@ -1076,7 +1076,7 @@ XML_GetFeatureList(void); */ #define XML_MAJOR_VERSION 2 #define XML_MINOR_VERSION 2 -#define XML_MICRO_VERSION 6 +#define XML_MICRO_VERSION 7 #ifdef __cplusplus } diff --git a/Modules/expat/expat_external.h b/Modules/expat/expat_external.h index 2d96b4f41ad703..875225d77e5040 100644 --- a/Modules/expat/expat_external.h +++ b/Modules/expat/expat_external.h @@ -35,10 +35,6 @@ /* External API definitions */ -/* Namespace external symbols to allow multiple libexpat version to - co-exist. */ -#include "pyexpatns.h" - #if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__) # define XML_USE_MSC_EXTENSIONS 1 #endif @@ -97,7 +93,11 @@ # endif #endif /* not defined XML_STATIC */ -#if !defined(XMLIMPORT) && defined(__GNUC__) && (__GNUC__ >= 4) +#ifndef XML_ENABLE_VISIBILITY +# define XML_ENABLE_VISIBILITY 0 +#endif + +#if !defined(XMLIMPORT) && XML_ENABLE_VISIBILITY # define XMLIMPORT __attribute__ ((visibility ("default"))) #endif diff --git a/Modules/expat/internal.h b/Modules/expat/internal.h index e33fdcb0238d72..dc4ef0c7e2588c 100644 --- a/Modules/expat/internal.h +++ b/Modules/expat/internal.h @@ -115,6 +115,11 @@ extern "C" { #endif +#ifdef XML_ENABLE_VISIBILITY +#if XML_ENABLE_VISIBILITY +__attribute__ ((visibility ("default"))) +#endif +#endif void _INTERNAL_trim_to_complete_utf8_characters(const char * from, const char ** fromLimRef); diff --git a/Modules/expat/winconfig.h b/Modules/expat/winconfig.h index 17fea4689001f4..28a043c6044ca4 100644 --- a/Modules/expat/winconfig.h +++ b/Modules/expat/winconfig.h @@ -53,10 +53,6 @@ /* we will assume all Windows platforms are little endian */ #define BYTEORDER 1234 -/* Windows has memmove() available. */ -#define HAVE_MEMMOVE - - #endif /* !defined(HAVE_EXPAT_CONFIG_H) */ diff --git a/Modules/expat/xmlparse.c b/Modules/expat/xmlparse.c index c4f3ffc215c9ef..9c0987f4f6d874 100644 --- a/Modules/expat/xmlparse.c +++ b/Modules/expat/xmlparse.c @@ -1,4 +1,4 @@ -/* 19ac4776051591216f1874e34ee99b6a43a3784c8bd7d70efeb9258dd22b906a (2.2.6+) +/* 69df5be70289a11fb834869ce4a91c23c1d9dd04baffcbd10e86742d149a080c (2.2.7+) __ __ _ ___\ \/ /_ __ __ _| |_ / _ \\ /| '_ \ / _` | __| @@ -164,15 +164,6 @@ typedef char ICHAR; /* Do safe (NULL-aware) pointer arithmetic */ #define EXPAT_SAFE_PTR_DIFF(p, q) (((p) && (q)) ? ((p) - (q)) : 0) -/* Handle the case where memmove() doesn't exist. */ -#ifndef HAVE_MEMMOVE -#ifdef HAVE_BCOPY -#define memmove(d,s,l) bcopy((s),(d),(l)) -#else -#error memmove does not exist on this platform, nor is a substitute available -#endif /* HAVE_BCOPY */ -#endif /* HAVE_MEMMOVE */ - #include "internal.h" #include "xmltok.h" #include "xmlrole.h" @@ -747,7 +738,7 @@ writeRandomBytes_dev_urandom(void * target, size_t count) { #endif /* ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM) */ -#if defined(HAVE_ARC4RANDOM) +#if defined(HAVE_ARC4RANDOM) && ! defined(HAVE_ARC4RANDOM_BUF) static void writeRandomBytes_arc4random(void * target, size_t count) { @@ -765,7 +756,7 @@ writeRandomBytes_arc4random(void * target, size_t count) { } } -#endif /* defined(HAVE_ARC4RANDOM) */ +#endif /* defined(HAVE_ARC4RANDOM) && ! defined(HAVE_ARC4RANDOM_BUF) */ #ifdef _WIN32 @@ -3019,7 +3010,7 @@ doContent(XML_Parser parser, enum XML_Error result; if (parser->m_startCdataSectionHandler) parser->m_startCdataSectionHandler(parser->m_handlerArg); -#if 0 +/* BEGIN disabled code */ /* Suppose you doing a transformation on a document that involves changing only the character data. You set up a defaultHandler and a characterDataHandler. The defaultHandler simply copies @@ -3032,9 +3023,9 @@ doContent(XML_Parser parser, However, now we have a start/endCdataSectionHandler, so it seems easier to let the user deal with this. */ - else if (parser->m_characterDataHandler) + else if (0 && parser->m_characterDataHandler) parser->m_characterDataHandler(parser->m_handlerArg, parser->m_dataBuf, 0); -#endif +/* END disabled code */ else if (parser->m_defaultHandler) reportDefault(parser, enc, s, next); result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore); @@ -3731,11 +3722,11 @@ doCdataSection(XML_Parser parser, case XML_TOK_CDATA_SECT_CLOSE: if (parser->m_endCdataSectionHandler) parser->m_endCdataSectionHandler(parser->m_handlerArg); -#if 0 +/* BEGIN disabled code */ /* see comment under XML_TOK_CDATA_SECT_OPEN */ - else if (parser->m_characterDataHandler) + else if (0 && parser->m_characterDataHandler) parser->m_characterDataHandler(parser->m_handlerArg, parser->m_dataBuf, 0); -#endif +/* END disabled code */ else if (parser->m_defaultHandler) reportDefault(parser, enc, s, next); *startPtr = next; @@ -6080,7 +6071,7 @@ setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) else poolDiscard(&dtd->pool); elementType->prefix = prefix; - + break; } } return 1; diff --git a/Modules/expat/xmltok.c b/Modules/expat/xmltok.c index 6371a350dadf96..6b415d83972ca6 100644 --- a/Modules/expat/xmltok.c +++ b/Modules/expat/xmltok.c @@ -30,9 +30,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#if !defined(_WIN32) && defined(HAVE_EXPAT_CONFIG_H) -# include -#endif #include #include /* memcpy */ From a1093e4dee9dd05cf3a844349c94fed52c4ebd89 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 29 Jun 2019 17:36:29 -0700 Subject: [PATCH 2152/2287] bpo-37437: Pass -Wno-unreachable-code when compiling expat. (GH-14470) (GH-14472) (cherry picked from commit 95da310078a9364bae9ab3f2ad9c71e34306a70c) Co-authored-by: Benjamin Peterson --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index fb95fb5298f36e..e2c18982532b84 100644 --- a/setup.py +++ b/setup.py @@ -1557,9 +1557,9 @@ class db_found(Exception): pass cc = sysconfig.get_config_var('CC').split()[0] ret = os.system( - '"%s" -Werror -Wimplicit-fallthrough -E -xc /dev/null >/dev/null 2>&1' % cc) + '"%s" -Werror -Wno-unreachable-code -E -xc /dev/null >/dev/null 2>&1' % cc) if ret >> 8 == 0: - extra_compile_args.append('-Wno-implicit-fallthrough') + extra_compile_args.append('-Wno-unreachable-code') exts.append(Extension('pyexpat', define_macros = define_macros, From 29d6905826d4417426e70f6209ca5e0db7921685 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 1 Jul 2019 22:48:16 -0700 Subject: [PATCH 2153/2287] Put pyexpatns.h include back. bpo-37437 (GH-14542) (cherry picked from commit 2cd07920bb7d2d319999394092190f37935dc421) Co-authored-by: Benjamin Peterson --- Modules/expat/expat_external.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Modules/expat/expat_external.h b/Modules/expat/expat_external.h index 875225d77e5040..fc63c2228d3e69 100644 --- a/Modules/expat/expat_external.h +++ b/Modules/expat/expat_external.h @@ -81,6 +81,10 @@ # endif #endif /* not defined XMLCALL */ +/* Namespace external symbols to allow multiple libexpat version to + co-exist. */ +#include "pyexpatns.h" + #if !defined(XML_STATIC) && !defined(XMLIMPORT) # ifndef XML_BUILDING_EXPAT From 782854f90ad5f73f787f68693d535f2b05514e13 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 2 Jul 2019 00:48:59 -0700 Subject: [PATCH 2154/2287] bpo-34602: Avoid failures setting macOS stack resource limit (GH-14546) (GH-14549) Under some conditions the earlier fix for bpo-18075, "Infinite recursion tests triggering a segfault on Mac OS X", now causes failures on macOS when attempting to change stack limit with resource.setrlimit resource.RLIMIT_STACK, like regrtest does when running the test suite. The reverted change had specified a non-default stack size when linking the python executable on macOS. As of macOS 10.14.4, the previous code causes a hard failure when running tests, although similar failures had been seen under some conditions under some earlier systems. Reverting the change to the interpreter stack size at link time helped for release builds but caused some tests to fail when built --with-pydebug. Try the opposite approach: continue to build the interpreter with an increased stack size on macOS and remove the failing setrlimit call in regrtest initialization. This will definitely avoid the resource.RLIMIT_STACK error and should have no, or fewer, side effects. (cherry picked from commit 5bbbc733e6cc0804f19b071944af8d4719e26ae6) Co-authored-by: Ned Deily --- Lib/test/libregrtest/setup.py | 16 ---------------- .../2019-07-02-01-06-47.bpo-34602.10d4wl.rst | 4 ++++ configure | 6 ++++++ configure.ac | 6 ++++++ 4 files changed, 16 insertions(+), 16 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2019-07-02-01-06-47.bpo-34602.10d4wl.rst diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index 910aca1b1a6c00..432cbca33cecca 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -60,22 +60,6 @@ def setup_tests(ns): if getattr(module, '__file__', None): module.__file__ = os.path.abspath(module.__file__) - # MacOSX (a.k.a. Darwin) has a default stack size that is too small - # for deeply recursive regular expressions. We see this as crashes in - # the Python test suite when running test_re.py and test_sre.py. The - # fix is to set the stack limit to 2048. - # This approach may also be useful for other Unixy platforms that - # suffer from small default stack limits. - if sys.platform == 'darwin': - try: - import resource - except ImportError: - pass - else: - soft, hard = resource.getrlimit(resource.RLIMIT_STACK) - newsoft = min(hard, max(soft, 1024*2048)) - resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard)) - if ns.huntrleaks: unittest.BaseTestSuite._cleanup = False diff --git a/Misc/NEWS.d/next/macOS/2019-07-02-01-06-47.bpo-34602.10d4wl.rst b/Misc/NEWS.d/next/macOS/2019-07-02-01-06-47.bpo-34602.10d4wl.rst new file mode 100644 index 00000000000000..c50ac638df5770 --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2019-07-02-01-06-47.bpo-34602.10d4wl.rst @@ -0,0 +1,4 @@ +Avoid test suite failures on macOS by no longer calling resource.setrlimit +to increase the process stack size limit at runtime. The runtime change is +no longer needed since the interpreter is being built with a larger default +stack size. diff --git a/configure b/configure index 634e18af4ee539..e39c16eee2b903 100755 --- a/configure +++ b/configure @@ -9504,6 +9504,12 @@ then # -u libsys_s pulls in all symbols in libsys Darwin/*) LINKFORSHARED="$extra_undefs -framework CoreFoundation" + + # Issue #18075: the default maximum stack size (8MBytes) is too + # small for the default recursion limit. Increase the stack size + # to ensure that tests don't crash + LINKFORSHARED="-Wl,-stack_size,1000000 $LINKFORSHARED" + if test "$enable_framework" then LINKFORSHARED="$LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' diff --git a/configure.ac b/configure.ac index 8bbfc1ecbad8be..cf280506bd011f 100644 --- a/configure.ac +++ b/configure.ac @@ -2697,6 +2697,12 @@ then # -u libsys_s pulls in all symbols in libsys Darwin/*) LINKFORSHARED="$extra_undefs -framework CoreFoundation" + + # Issue #18075: the default maximum stack size (8MBytes) is too + # small for the default recursion limit. Increase the stack size + # to ensure that tests don't crash + LINKFORSHARED="-Wl,-stack_size,1000000 $LINKFORSHARED" + if test "$enable_framework" then LINKFORSHARED="$LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' From 201c8f79450628241574fba940e08107178dc3a5 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 2 Jul 2019 16:25:39 -0400 Subject: [PATCH 2155/2287] 3.6.9 --- Include/patchlevel.h | 6 +++--- ...02-01-06-47.bpo-34602.10d4wl.rst => 3.6.9.rst} | 15 +++++++++++++++ .../2019-06-27-20-33-50.bpo-37437.du39_A.rst | 1 - README.rst | 4 ++-- 4 files changed, 20 insertions(+), 6 deletions(-) rename Misc/NEWS.d/{next/macOS/2019-07-02-01-06-47.bpo-34602.10d4wl.rst => 3.6.9.rst} (50%) delete mode 100644 Misc/NEWS.d/next/Library/2019-06-27-20-33-50.bpo-37437.du39_A.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 3cb041517fe6dc..c4b607b912983d 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -19,11 +19,11 @@ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 6 #define PY_MICRO_VERSION 9 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA -#define PY_RELEASE_SERIAL 1 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL +#define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.6.9rc1+" +#define PY_VERSION "3.6.9" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Misc/NEWS.d/next/macOS/2019-07-02-01-06-47.bpo-34602.10d4wl.rst b/Misc/NEWS.d/3.6.9.rst similarity index 50% rename from Misc/NEWS.d/next/macOS/2019-07-02-01-06-47.bpo-34602.10d4wl.rst rename to Misc/NEWS.d/3.6.9.rst index c50ac638df5770..c8d8e913377684 100644 --- a/Misc/NEWS.d/next/macOS/2019-07-02-01-06-47.bpo-34602.10d4wl.rst +++ b/Misc/NEWS.d/3.6.9.rst @@ -1,3 +1,18 @@ +.. bpo: 37437 +.. date: 2019-06-27-20-33-50 +.. nonce: du39_A +.. release date: 2019-07-02 +.. section: Library + +Update vendorized expat version to 2.2.7. + +.. + +.. bpo: 34602 +.. date: 2019-07-02-01-06-47 +.. nonce: 10d4wl +.. section: macOS + Avoid test suite failures on macOS by no longer calling resource.setrlimit to increase the process stack size limit at runtime. The runtime change is no longer needed since the interpreter is being built with a larger default diff --git a/Misc/NEWS.d/next/Library/2019-06-27-20-33-50.bpo-37437.du39_A.rst b/Misc/NEWS.d/next/Library/2019-06-27-20-33-50.bpo-37437.du39_A.rst deleted file mode 100644 index 80719ee152d7af..00000000000000 --- a/Misc/NEWS.d/next/Library/2019-06-27-20-33-50.bpo-37437.du39_A.rst +++ /dev/null @@ -1 +0,0 @@ -Update vendorized expat version to 2.2.7. diff --git a/README.rst b/README.rst index 65e43296699ca6..f9ab63a0f371d1 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.6.9 candidate 1+ -========================================= +This is Python version 3.6.9 +============================ .. image:: https://travis-ci.org/python/cpython.svg?branch=3.6 :alt: CPython build status on Travis CI From af9e126a50eb0317f45e995fb3b32fdda48706bc Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 2 Jul 2019 17:57:03 -0400 Subject: [PATCH 2156/2287] Post release updates --- Include/patchlevel.h | 2 +- README.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index c4b607b912983d..a1ab4d98322dc6 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -23,7 +23,7 @@ #define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.6.9" +#define PY_VERSION "3.6.9+" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/README.rst b/README.rst index f9ab63a0f371d1..88524f95cad299 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.6.9 -============================ +This is Python version 3.6.9+ +============================= .. image:: https://travis-ci.org/python/cpython.svg?branch=3.6 :alt: CPython build status on Travis CI From a6d97e200863e7e5fc60bbc8f121b86a2098ef2d Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Wed, 3 Jul 2019 18:39:49 -0400 Subject: [PATCH 2157/2287] Fix 3.6 documentation build for sphinx<1.6 (GH-14576) --- Doc/tools/extensions/suspicious.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Doc/tools/extensions/suspicious.py b/Doc/tools/extensions/suspicious.py index 8d80f6759bffd4..dfcd0da9fdbda5 100644 --- a/Doc/tools/extensions/suspicious.py +++ b/Doc/tools/extensions/suspicious.py @@ -50,6 +50,12 @@ from sphinx.builders import Builder import sphinx.util +try: # sphinx>=1.6 + from sphinx.util.logging import getLogger +except ImportError: # sphinx<1.6 + from logging import getLogger + + detect_all = re.compile(r''' ::(?=[^=])| # two :: (but NOT ::=) :[a-zA-Z][a-zA-Z0-9]+| # :foo @@ -86,7 +92,7 @@ class CheckSuspiciousMarkupBuilder(Builder): Checks for possibly invalid markup that may leak into the output. """ name = 'suspicious' - logger = sphinx.util.logging.getLogger("CheckSuspiciousMarkupBuilder") + logger = getLogger("CheckSuspiciousMarkupBuilder") def init(self): # create output file From 317c33e67cb6076c5a87a66c75e8c35ac581398d Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Mon, 8 Jul 2019 12:50:54 -0400 Subject: [PATCH 2158/2287] bpo-37149: Replace dead link for online Tkinter reference (GH-14616) Also fix a name misspelling. Co-authored-by: Terry Jan Reedy --- Doc/library/tkinter.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index 60cf892e0888b7..2515cf4f8b0803 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -31,7 +31,7 @@ installed, so you can read the Tcl/Tk documentation specific to that version. `TKDocs `_ Extensive tutorial plus friendlier widget pages for some of the widgets. - `Tkinter reference: a GUI for Python `_ + `Tkinter 8.5 reference: a GUI for Python `_ On-line reference material. `Tkinter docs from effbot `_ @@ -41,7 +41,7 @@ installed, so you can read the Tcl/Tk documentation specific to that version. Book by Mark Lutz, has excellent coverage of Tkinter. `Modern Tkinter for Busy Python Developers `_ - Book by Mark Rozerman about building attractive and modern graphical user interfaces with Python and Tkinter. + Book by Mark Roseman about building attractive and modern graphical user interfaces with Python and Tkinter. `Python and Tkinter Programming `_ Book by John Grayson (ISBN 1-884777-81-3). From 79a47e2b9cff6c9facdbc022a752177ab89dc533 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 21 Jul 2019 07:01:43 -0700 Subject: [PATCH 2159/2287] Fix infinite loop in email folding logic (GH-12732) (GH-14799) As far as I can tell, this infinite loop would be triggered if: 1. The value being folded contains a single word (no spaces) longer than max_line_length 2. The max_line_length is shorter than the encoding's name + 9 characters. bpo-36564: https://bugs.python.org/issue36564 (cherry picked from commit f69d5c61981ea97d251db515c7ff280fcc17182d) Co-authored-by: Paul Ganssle --- Lib/email/_header_value_parser.py | 17 +++++++++++----- Lib/email/parser.py | 1 - Lib/test/test_email/test_policy.py | 20 +++++++++++++++++++ .../2019-04-08-13-00-13.bpo-36564._n67m_.rst | 3 +++ 4 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-04-08-13-00-13.bpo-36564._n67m_.rst diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index f42cde203cef9e..e3c343dffb424a 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -2715,15 +2715,22 @@ def _fold_as_ew(to_encode, lines, maxlen, last_ew, ew_combine_allowed, charset): trailing_wsp = to_encode[-1] to_encode = to_encode[:-1] new_last_ew = len(lines[-1]) if last_ew is None else last_ew + + encode_as = 'utf-8' if charset == 'us-ascii' else charset + + # The RFC2047 chrome takes up 7 characters plus the length + # of the charset name. + chrome_len = len(encode_as) + 7 + + if (chrome_len + 1) >= maxlen: + raise errors.HeaderParseError( + "max_line_length is too small to fit an encoded word") + while to_encode: remaining_space = maxlen - len(lines[-1]) - # The RFC2047 chrome takes up 7 characters plus the length - # of the charset name. - encode_as = 'utf-8' if charset == 'us-ascii' else charset - text_space = remaining_space - len(encode_as) - 7 + text_space = remaining_space - chrome_len if text_space <= 0: lines.append(' ') - # XXX We'll get an infinite loop here if maxlen is <= 7 continue to_encode_word = to_encode[:text_space] diff --git a/Lib/email/parser.py b/Lib/email/parser.py index 555b1725606194..7db4da1ff081c1 100644 --- a/Lib/email/parser.py +++ b/Lib/email/parser.py @@ -13,7 +13,6 @@ from email._policybase import compat32 - class Parser: def __init__(self, _class=None, *, policy=compat32): """Parser of RFC 2822 and MIME email messages. diff --git a/Lib/test/test_email/test_policy.py b/Lib/test/test_email/test_policy.py index c2c437e6ac2695..6999e4af10d9b8 100644 --- a/Lib/test/test_email/test_policy.py +++ b/Lib/test/test_email/test_policy.py @@ -2,6 +2,7 @@ import types import textwrap import unittest +import email.errors import email.policy import email.parser import email.generator @@ -245,6 +246,25 @@ def test_non_ascii_chars_do_not_cause_inf_loop(self): 'Subject: \n' + 12 * ' =?utf-8?q?=C4=85?=\n') + def test_short_maxlen_error(self): + # RFC 2047 chrome takes up 7 characters, plus the length of the charset + # name, so folding should fail if maxlen is lower than the minimum + # required length for a line. + + # Note: This is only triggered when there is a single word longer than + # max_line_length, hence the 1234567890 at the end of this whimsical + # subject. This is because when we encounter a word longer than + # max_line_length, it is broken down into encoded words to fit + # max_line_length. If the max_line_length isn't large enough to even + # contain the RFC 2047 chrome (`?=?q??=`), we fail. + subject = "Melt away the pounds with this one simple trick! 1234567890" + + for maxlen in [3, 7, 9]: + with self.subTest(maxlen=maxlen): + policy = email.policy.default.clone(max_line_length=maxlen) + with self.assertRaises(email.errors.HeaderParseError): + policy.fold("Subject", subject) + # XXX: Need subclassing tests. # For adding subclassed objects, make sure the usual rules apply (subclass # wins), but that the order still works (right overrides left). diff --git a/Misc/NEWS.d/next/Library/2019-04-08-13-00-13.bpo-36564._n67m_.rst b/Misc/NEWS.d/next/Library/2019-04-08-13-00-13.bpo-36564._n67m_.rst new file mode 100644 index 00000000000000..ddd17aec1dd861 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-04-08-13-00-13.bpo-36564._n67m_.rst @@ -0,0 +1,3 @@ +Fix infinite loop in email header folding logic that would be triggered when +an email policy's max_line_length is not long enough to include the required +markup and any values in the message. Patch by Paul Ganssle From 1789bbdd3e03023951a39933ef12dee0a03be616 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 1 Aug 2019 09:36:46 -0700 Subject: [PATCH 2160/2287] bpo-37461: Fix infinite loop in parsing of specially crafted email headers (GH-14794) (GH-14817) Some crafted email header would cause the get_parameter method to run in an infinite loop causing a DoS attack surface when parsing those headers. This patch fixes that by making sure the DQUOTE character is handled to prevent going into an infinite loop. (cherry picked from commit a4a994bd3e619cbaff97610a1cee8ffa87c672f5) Co-authored-by: Abhilash Raj --- Lib/email/_header_value_parser.py | 3 +++ Lib/test/test_email/test__header_value_parser.py | 7 +++++++ .../next/Security/2019-07-16-08-11-00.bpo-37461.1Ahz7O.rst | 2 ++ 3 files changed, 12 insertions(+) create mode 100644 Misc/NEWS.d/next/Security/2019-07-16-08-11-00.bpo-37461.1Ahz7O.rst diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index e3c343dffb424a..737951e4b1b11e 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -2366,6 +2366,9 @@ def get_parameter(value): while value: if value[0] in WSP: token, value = get_fws(value) + elif value[0] == '"': + token = ValueTerminal('"', 'DQUOTE') + value = value[1:] else: token, value = get_qcontent(value) v.append(token) diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py index 676732bb3d0261..a2c900fa7fd2c9 100644 --- a/Lib/test/test_email/test__header_value_parser.py +++ b/Lib/test/test_email/test__header_value_parser.py @@ -2601,6 +2601,13 @@ def mime_parameters_as_value(self, # Defects are apparent missing *0*, and two 'out of sequence'. [errors.InvalidHeaderDefect]*3), + # bpo-37461: Check that we don't go into an infinite loop. + 'extra_dquote': ( + 'r*="\'a\'\\"', + ' r="\\""', + 'r*=\'a\'"', + [('r', '"')], + [errors.InvalidHeaderDefect]*2), } @parameterize diff --git a/Misc/NEWS.d/next/Security/2019-07-16-08-11-00.bpo-37461.1Ahz7O.rst b/Misc/NEWS.d/next/Security/2019-07-16-08-11-00.bpo-37461.1Ahz7O.rst new file mode 100644 index 00000000000000..4bfd350c0b404e --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-07-16-08-11-00.bpo-37461.1Ahz7O.rst @@ -0,0 +1,2 @@ +Fix an inifite loop when parsing specially crafted email headers. Patch by +Abhilash Raj. From 13a19139b5e76175bc95294d54afc9425e4f36c9 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 9 Aug 2019 08:22:19 -0700 Subject: [PATCH 2161/2287] bpo-34155: Dont parse domains containing @ (GH-13079) (GH-14826) Before: >>> email.message_from_string('From: a@malicious.org@important.com', policy=email.policy.default)['from'].addresses (Address(display_name='', username='a', domain='malicious.org'),) >>> parseaddr('a@malicious.org@important.com') ('', 'a@malicious.org') After: >>> email.message_from_string('From: a@malicious.org@important.com', policy=email.policy.default)['from'].addresses (Address(display_name='', username='', domain=''),) >>> parseaddr('a@malicious.org@important.com') ('', 'a@') https://bugs.python.org/issue34155 (cherry picked from commit 8cb65d1381b027f0b09ee36bfed7f35bb4dec9a9) Co-authored-by: jpic --- Lib/email/_header_value_parser.py | 2 ++ Lib/email/_parseaddr.py | 11 ++++++++++- Lib/test/test_email/test__header_value_parser.py | 10 ++++++++++ Lib/test/test_email/test_email.py | 14 ++++++++++++++ .../2019-05-04-13-33-37.bpo-34155.MJll68.rst | 1 + 5 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Security/2019-05-04-13-33-37.bpo-34155.MJll68.rst diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 737951e4b1b11e..bc9c9b6241d48a 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -1561,6 +1561,8 @@ def get_domain(value): token, value = get_dot_atom(value) except errors.HeaderParseError: token, value = get_atom(value) + if value and value[0] == '@': + raise errors.HeaderParseError('Invalid Domain') if leader is not None: token[:0] = [leader] domain.append(token) diff --git a/Lib/email/_parseaddr.py b/Lib/email/_parseaddr.py index cdfa3729adc79e..41ff6f8c000d57 100644 --- a/Lib/email/_parseaddr.py +++ b/Lib/email/_parseaddr.py @@ -379,7 +379,12 @@ def getaddrspec(self): aslist.append('@') self.pos += 1 self.gotonext() - return EMPTYSTRING.join(aslist) + self.getdomain() + domain = self.getdomain() + if not domain: + # Invalid domain, return an empty address instead of returning a + # local part to denote failed parsing. + return EMPTYSTRING + return EMPTYSTRING.join(aslist) + domain def getdomain(self): """Get the complete domain name from an address.""" @@ -394,6 +399,10 @@ def getdomain(self): elif self.field[self.pos] == '.': self.pos += 1 sdlist.append('.') + elif self.field[self.pos] == '@': + # bpo-34155: Don't parse domains with two `@` like + # `a@malicious.org@important.com`. + return EMPTYSTRING elif self.field[self.pos] in self.atomends: break else: diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py index a2c900fa7fd2c9..02ef3e1006c6c2 100644 --- a/Lib/test/test_email/test__header_value_parser.py +++ b/Lib/test/test_email/test__header_value_parser.py @@ -1418,6 +1418,16 @@ def test_get_addr_spec_dot_atom(self): self.assertEqual(addr_spec.domain, 'example.com') self.assertEqual(addr_spec.addr_spec, 'star.a.star@example.com') + def test_get_addr_spec_multiple_domains(self): + with self.assertRaises(errors.HeaderParseError): + parser.get_addr_spec('star@a.star@example.com') + + with self.assertRaises(errors.HeaderParseError): + parser.get_addr_spec('star@a@example.com') + + with self.assertRaises(errors.HeaderParseError): + parser.get_addr_spec('star@172.17.0.1@example.com') + # get_obs_route def test_get_obs_route_simple(self): diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py index f97ccc6711cc73..68d0522799874e 100644 --- a/Lib/test/test_email/test_email.py +++ b/Lib/test/test_email/test_email.py @@ -3035,6 +3035,20 @@ def test_parseaddr_empty(self): self.assertEqual(utils.parseaddr('<>'), ('', '')) self.assertEqual(utils.formataddr(utils.parseaddr('<>')), '') + def test_parseaddr_multiple_domains(self): + self.assertEqual( + utils.parseaddr('a@b@c'), + ('', '') + ) + self.assertEqual( + utils.parseaddr('a@b.c@c'), + ('', '') + ) + self.assertEqual( + utils.parseaddr('a@172.17.0.1@c'), + ('', '') + ) + def test_noquote_dump(self): self.assertEqual( utils.formataddr(('A Silly Person', 'person@dom.ain')), diff --git a/Misc/NEWS.d/next/Security/2019-05-04-13-33-37.bpo-34155.MJll68.rst b/Misc/NEWS.d/next/Security/2019-05-04-13-33-37.bpo-34155.MJll68.rst new file mode 100644 index 00000000000000..50292e29ed1d2f --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-05-04-13-33-37.bpo-34155.MJll68.rst @@ -0,0 +1 @@ +Fix parsing of invalid email addresses with more than one ``@`` (e.g. a@b@c.com.) to not return the part before 2nd ``@`` as valid email address. Patch by maxking & jpic. From f1f9c0c532089824791cfc18e6d6f29e1cd62596 Mon Sep 17 00:00:00 2001 From: GeeTransit Date: Sat, 24 Aug 2019 00:33:36 -0400 Subject: [PATCH 2162/2287] [3.6] bpo-37461: Fix typo (inifite -> infinite) (#15432) --- .../next/Security/2019-07-16-08-11-00.bpo-37461.1Ahz7O.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Security/2019-07-16-08-11-00.bpo-37461.1Ahz7O.rst b/Misc/NEWS.d/next/Security/2019-07-16-08-11-00.bpo-37461.1Ahz7O.rst index 4bfd350c0b404e..9d47578c627710 100644 --- a/Misc/NEWS.d/next/Security/2019-07-16-08-11-00.bpo-37461.1Ahz7O.rst +++ b/Misc/NEWS.d/next/Security/2019-07-16-08-11-00.bpo-37461.1Ahz7O.rst @@ -1,2 +1,2 @@ -Fix an inifite loop when parsing specially crafted email headers. Patch by +Fix an infinite loop when parsing specially crafted email headers. Patch by Abhilash Raj. From f0501630b0ba31448c230c756b1027647f4ef100 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Wed, 25 Sep 2019 22:00:26 -0700 Subject: [PATCH 2163/2287] [3.6] closes bpo-38174: Update vendored expat library to 2.2.8. (GH-16410) Fixes CVE-2019-15903. See full changelog at https://github.com/libexpat/libexpat/blob/R_2_2_8/expat/Changes.. (cherry picked from commit 52b940803860e37bcc3f6096b2d24e7c20a0e807) --- .../2019-09-23-21-02-46.bpo-38174.MeWuJd.rst | 2 + Modules/expat/asciitab.h | 62 +- Modules/expat/expat.h | 275 +- Modules/expat/expat_external.h | 97 +- Modules/expat/iasciitab.h | 62 +- Modules/expat/internal.h | 48 +- Modules/expat/latin1tab.h | 62 +- Modules/expat/loadlibrary.c | 143 - Modules/expat/nametab.h | 242 +- Modules/expat/siphash.h | 443 +- Modules/expat/utf8tab.h | 62 +- Modules/expat/winconfig.h | 17 +- Modules/expat/xmlparse.c | 3793 ++++++++--------- Modules/expat/xmlrole.c | 747 ++-- Modules/expat/xmlrole.h | 13 +- Modules/expat/xmltok.c | 1372 +++--- Modules/expat/xmltok.h | 212 +- Modules/expat/xmltok_impl.c | 999 ++--- Modules/expat/xmltok_impl.h | 72 +- Modules/expat/xmltok_ns.c | 84 +- PCbuild/_elementtree.vcxproj | 1 - PCbuild/_elementtree.vcxproj.filters | 3 - PCbuild/pyexpat.vcxproj | 1 - PCbuild/pyexpat.vcxproj.filters | 3 - 24 files changed, 3973 insertions(+), 4842 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2019-09-23-21-02-46.bpo-38174.MeWuJd.rst delete mode 100644 Modules/expat/loadlibrary.c diff --git a/Misc/NEWS.d/next/Security/2019-09-23-21-02-46.bpo-38174.MeWuJd.rst b/Misc/NEWS.d/next/Security/2019-09-23-21-02-46.bpo-38174.MeWuJd.rst new file mode 100644 index 00000000000000..e3da6fcdd139f6 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-09-23-21-02-46.bpo-38174.MeWuJd.rst @@ -0,0 +1,2 @@ +Update vendorized expat library version to 2.2.8, which resolves +CVE-2019-15903. diff --git a/Modules/expat/asciitab.h b/Modules/expat/asciitab.h index 2f59fd92906537..63b1d1b4482efa 100644 --- a/Modules/expat/asciitab.h +++ b/Modules/expat/asciitab.h @@ -31,34 +31,34 @@ */ /* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, -/* 0x0C */ BT_NONXML, BT_CR, BT_NONXML, BT_NONXML, -/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, -/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, -/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, -/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, -/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, -/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, -/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, -/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, -/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, + /* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, + /* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, + /* 0x0C */ BT_NONXML, BT_CR, BT_NONXML, BT_NONXML, + /* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, + /* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, + /* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, + /* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, + /* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, + /* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, + /* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, + /* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, + /* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, + /* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, + /* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, + /* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, + /* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, + /* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, + /* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, + /* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, + /* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, + /* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, + /* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, + /* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, diff --git a/Modules/expat/expat.h b/Modules/expat/expat.h index c050f1d918cef0..6c8eb1fda4a30c 100644 --- a/Modules/expat/expat.h +++ b/Modules/expat/expat.h @@ -33,15 +33,6 @@ #ifndef Expat_INCLUDED #define Expat_INCLUDED 1 -#ifdef __VMS -/* 0 1 2 3 0 1 2 3 - 1234567890123456789012345678901 1234567890123456789012345678901 */ -#define XML_SetProcessingInstructionHandler XML_SetProcessingInstrHandler -#define XML_SetUnparsedEntityDeclHandler XML_SetUnparsedEntDeclHandler -#define XML_SetStartNamespaceDeclHandler XML_SetStartNamespcDeclHandler -#define XML_SetExternalEntityRefHandlerArg XML_SetExternalEntRefHandlerArg -#endif - #include #include "expat_external.h" @@ -53,8 +44,8 @@ struct XML_ParserStruct; typedef struct XML_ParserStruct *XML_Parser; typedef unsigned char XML_Bool; -#define XML_TRUE ((XML_Bool) 1) -#define XML_FALSE ((XML_Bool) 0) +#define XML_TRUE ((XML_Bool)1) +#define XML_FALSE ((XML_Bool)0) /* The XML_Status enum gives the possible return values for several API functions. The preprocessor #defines are included so this @@ -164,25 +155,23 @@ enum XML_Content_Quant { typedef struct XML_cp XML_Content; struct XML_cp { - enum XML_Content_Type type; - enum XML_Content_Quant quant; - XML_Char * name; - unsigned int numchildren; - XML_Content * children; + enum XML_Content_Type type; + enum XML_Content_Quant quant; + XML_Char *name; + unsigned int numchildren; + XML_Content *children; }; - /* This is called for an element declaration. See above for description of the model argument. It's the caller's responsibility to free model when finished with it. */ -typedef void (XMLCALL *XML_ElementDeclHandler) (void *userData, - const XML_Char *name, - XML_Content *model); +typedef void(XMLCALL *XML_ElementDeclHandler)(void *userData, + const XML_Char *name, + XML_Content *model); XMLPARSEAPI(void) -XML_SetElementDeclHandler(XML_Parser parser, - XML_ElementDeclHandler eldecl); +XML_SetElementDeclHandler(XML_Parser parser, XML_ElementDeclHandler eldecl); /* The Attlist declaration handler is called for *each* attribute. So a single Attlist declaration with multiple attributes declared will @@ -192,17 +181,12 @@ XML_SetElementDeclHandler(XML_Parser parser, value will be NULL in the case of "#REQUIRED". If "isrequired" is true and default is non-NULL, then this is a "#FIXED" default. */ -typedef void (XMLCALL *XML_AttlistDeclHandler) ( - void *userData, - const XML_Char *elname, - const XML_Char *attname, - const XML_Char *att_type, - const XML_Char *dflt, - int isrequired); +typedef void(XMLCALL *XML_AttlistDeclHandler)( + void *userData, const XML_Char *elname, const XML_Char *attname, + const XML_Char *att_type, const XML_Char *dflt, int isrequired); XMLPARSEAPI(void) -XML_SetAttlistDeclHandler(XML_Parser parser, - XML_AttlistDeclHandler attdecl); +XML_SetAttlistDeclHandler(XML_Parser parser, XML_AttlistDeclHandler attdecl); /* The XML declaration handler is called for *both* XML declarations and text declarations. The way to distinguish is that the version @@ -212,15 +196,13 @@ XML_SetAttlistDeclHandler(XML_Parser parser, was no standalone parameter in the declaration, that it was given as no, or that it was given as yes. */ -typedef void (XMLCALL *XML_XmlDeclHandler) (void *userData, - const XML_Char *version, - const XML_Char *encoding, - int standalone); +typedef void(XMLCALL *XML_XmlDeclHandler)(void *userData, + const XML_Char *version, + const XML_Char *encoding, + int standalone); XMLPARSEAPI(void) -XML_SetXmlDeclHandler(XML_Parser parser, - XML_XmlDeclHandler xmldecl); - +XML_SetXmlDeclHandler(XML_Parser parser, XML_XmlDeclHandler xmldecl); typedef struct { void *(*malloc_fcn)(size_t size); @@ -248,7 +230,6 @@ XML_ParserCreate(const XML_Char *encoding); XMLPARSEAPI(XML_Parser) XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator); - /* Constructs a new parser using the memory management suite referred to by memsuite. If memsuite is NULL, then use the standard library memory suite. If namespaceSeparator is non-NULL it creates a parser with @@ -278,31 +259,27 @@ XML_ParserReset(XML_Parser parser, const XML_Char *encoding); /* atts is array of name/value pairs, terminated by 0; names and values are 0 terminated. */ -typedef void (XMLCALL *XML_StartElementHandler) (void *userData, - const XML_Char *name, - const XML_Char **atts); - -typedef void (XMLCALL *XML_EndElementHandler) (void *userData, - const XML_Char *name); +typedef void(XMLCALL *XML_StartElementHandler)(void *userData, + const XML_Char *name, + const XML_Char **atts); +typedef void(XMLCALL *XML_EndElementHandler)(void *userData, + const XML_Char *name); /* s is not 0 terminated. */ -typedef void (XMLCALL *XML_CharacterDataHandler) (void *userData, - const XML_Char *s, - int len); +typedef void(XMLCALL *XML_CharacterDataHandler)(void *userData, + const XML_Char *s, int len); /* target and data are 0 terminated */ -typedef void (XMLCALL *XML_ProcessingInstructionHandler) ( - void *userData, - const XML_Char *target, - const XML_Char *data); +typedef void(XMLCALL *XML_ProcessingInstructionHandler)(void *userData, + const XML_Char *target, + const XML_Char *data); /* data is 0 terminated */ -typedef void (XMLCALL *XML_CommentHandler) (void *userData, - const XML_Char *data); +typedef void(XMLCALL *XML_CommentHandler)(void *userData, const XML_Char *data); -typedef void (XMLCALL *XML_StartCdataSectionHandler) (void *userData); -typedef void (XMLCALL *XML_EndCdataSectionHandler) (void *userData); +typedef void(XMLCALL *XML_StartCdataSectionHandler)(void *userData); +typedef void(XMLCALL *XML_EndCdataSectionHandler)(void *userData); /* This is called for any characters in the XML document for which there is no applicable handler. This includes both characters that @@ -317,25 +294,23 @@ typedef void (XMLCALL *XML_EndCdataSectionHandler) (void *userData); default handler: for example, a comment might be split between multiple calls. */ -typedef void (XMLCALL *XML_DefaultHandler) (void *userData, - const XML_Char *s, - int len); +typedef void(XMLCALL *XML_DefaultHandler)(void *userData, const XML_Char *s, + int len); /* This is called for the start of the DOCTYPE declaration, before any DTD or internal subset is parsed. */ -typedef void (XMLCALL *XML_StartDoctypeDeclHandler) ( - void *userData, - const XML_Char *doctypeName, - const XML_Char *sysid, - const XML_Char *pubid, - int has_internal_subset); +typedef void(XMLCALL *XML_StartDoctypeDeclHandler)(void *userData, + const XML_Char *doctypeName, + const XML_Char *sysid, + const XML_Char *pubid, + int has_internal_subset); /* This is called for the start of the DOCTYPE declaration when the closing > is encountered, but after processing any external subset. */ -typedef void (XMLCALL *XML_EndDoctypeDeclHandler)(void *userData); +typedef void(XMLCALL *XML_EndDoctypeDeclHandler)(void *userData); /* This is called for entity declarations. The is_parameter_entity argument will be non-zero if the entity is a parameter entity, zero @@ -355,20 +330,14 @@ typedef void (XMLCALL *XML_EndDoctypeDeclHandler)(void *userData); Note that is_parameter_entity can't be changed to XML_Bool, since that would break binary compatibility. */ -typedef void (XMLCALL *XML_EntityDeclHandler) ( - void *userData, - const XML_Char *entityName, - int is_parameter_entity, - const XML_Char *value, - int value_length, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId, - const XML_Char *notationName); +typedef void(XMLCALL *XML_EntityDeclHandler)( + void *userData, const XML_Char *entityName, int is_parameter_entity, + const XML_Char *value, int value_length, const XML_Char *base, + const XML_Char *systemId, const XML_Char *publicId, + const XML_Char *notationName); XMLPARSEAPI(void) -XML_SetEntityDeclHandler(XML_Parser parser, - XML_EntityDeclHandler handler); +XML_SetEntityDeclHandler(XML_Parser parser, XML_EntityDeclHandler handler); /* OBSOLETE -- OBSOLETE -- OBSOLETE This handler has been superseded by the EntityDeclHandler above. @@ -379,24 +348,20 @@ XML_SetEntityDeclHandler(XML_Parser parser, entityName, systemId and notationName arguments will never be NULL. The other arguments may be. */ -typedef void (XMLCALL *XML_UnparsedEntityDeclHandler) ( - void *userData, - const XML_Char *entityName, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId, - const XML_Char *notationName); +typedef void(XMLCALL *XML_UnparsedEntityDeclHandler)( + void *userData, const XML_Char *entityName, const XML_Char *base, + const XML_Char *systemId, const XML_Char *publicId, + const XML_Char *notationName); /* This is called for a declaration of notation. The base argument is whatever was set by XML_SetBase. The notationName will never be NULL. The other arguments can be. */ -typedef void (XMLCALL *XML_NotationDeclHandler) ( - void *userData, - const XML_Char *notationName, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId); +typedef void(XMLCALL *XML_NotationDeclHandler)(void *userData, + const XML_Char *notationName, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId); /* When namespace processing is enabled, these are called once for each namespace declaration. The call to the start and end element @@ -404,14 +369,12 @@ typedef void (XMLCALL *XML_NotationDeclHandler) ( declaration handlers. For an xmlns attribute, prefix will be NULL. For an xmlns="" attribute, uri will be NULL. */ -typedef void (XMLCALL *XML_StartNamespaceDeclHandler) ( - void *userData, - const XML_Char *prefix, - const XML_Char *uri); +typedef void(XMLCALL *XML_StartNamespaceDeclHandler)(void *userData, + const XML_Char *prefix, + const XML_Char *uri); -typedef void (XMLCALL *XML_EndNamespaceDeclHandler) ( - void *userData, - const XML_Char *prefix); +typedef void(XMLCALL *XML_EndNamespaceDeclHandler)(void *userData, + const XML_Char *prefix); /* This is called if the document is not standalone, that is, it has an external subset or a reference to a parameter entity, but does not @@ -422,7 +385,7 @@ typedef void (XMLCALL *XML_EndNamespaceDeclHandler) ( conditions above this handler will only be called if the referenced entity was actually read. */ -typedef int (XMLCALL *XML_NotStandaloneHandler) (void *userData); +typedef int(XMLCALL *XML_NotStandaloneHandler)(void *userData); /* This is called for a reference to an external parsed general entity. The referenced entity is not automatically parsed. The @@ -458,12 +421,11 @@ typedef int (XMLCALL *XML_NotStandaloneHandler) (void *userData); Note that unlike other handlers the first argument is the parser, not userData. */ -typedef int (XMLCALL *XML_ExternalEntityRefHandler) ( - XML_Parser parser, - const XML_Char *context, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId); +typedef int(XMLCALL *XML_ExternalEntityRefHandler)(XML_Parser parser, + const XML_Char *context, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId); /* This is called in two situations: 1) An entity reference is encountered for which no declaration @@ -475,10 +437,9 @@ typedef int (XMLCALL *XML_ExternalEntityRefHandler) ( the event would be out of sync with the reporting of the declarations or attribute values */ -typedef void (XMLCALL *XML_SkippedEntityHandler) ( - void *userData, - const XML_Char *entityName, - int is_parameter_entity); +typedef void(XMLCALL *XML_SkippedEntityHandler)(void *userData, + const XML_Char *entityName, + int is_parameter_entity); /* This structure is filled in by the XML_UnknownEncodingHandler to provide information to the parser about encodings that are unknown @@ -535,8 +496,8 @@ typedef void (XMLCALL *XML_SkippedEntityHandler) ( typedef struct { int map[256]; void *data; - int (XMLCALL *convert)(void *data, const char *s); - void (XMLCALL *release)(void *data); + int(XMLCALL *convert)(void *data, const char *s); + void(XMLCALL *release)(void *data); } XML_Encoding; /* This is called for an encoding that is unknown to the parser. @@ -554,23 +515,19 @@ typedef struct { If info does not describe a suitable encoding, then the parser will return an XML_UNKNOWN_ENCODING error. */ -typedef int (XMLCALL *XML_UnknownEncodingHandler) ( - void *encodingHandlerData, - const XML_Char *name, - XML_Encoding *info); +typedef int(XMLCALL *XML_UnknownEncodingHandler)(void *encodingHandlerData, + const XML_Char *name, + XML_Encoding *info); XMLPARSEAPI(void) -XML_SetElementHandler(XML_Parser parser, - XML_StartElementHandler start, +XML_SetElementHandler(XML_Parser parser, XML_StartElementHandler start, XML_EndElementHandler end); XMLPARSEAPI(void) -XML_SetStartElementHandler(XML_Parser parser, - XML_StartElementHandler handler); +XML_SetStartElementHandler(XML_Parser parser, XML_StartElementHandler handler); XMLPARSEAPI(void) -XML_SetEndElementHandler(XML_Parser parser, - XML_EndElementHandler handler); +XML_SetEndElementHandler(XML_Parser parser, XML_EndElementHandler handler); XMLPARSEAPI(void) XML_SetCharacterDataHandler(XML_Parser parser, @@ -580,8 +537,7 @@ XMLPARSEAPI(void) XML_SetProcessingInstructionHandler(XML_Parser parser, XML_ProcessingInstructionHandler handler); XMLPARSEAPI(void) -XML_SetCommentHandler(XML_Parser parser, - XML_CommentHandler handler); +XML_SetCommentHandler(XML_Parser parser, XML_CommentHandler handler); XMLPARSEAPI(void) XML_SetCdataSectionHandler(XML_Parser parser, @@ -601,20 +557,17 @@ XML_SetEndCdataSectionHandler(XML_Parser parser, default handler, or to the skipped entity handler, if one is set. */ XMLPARSEAPI(void) -XML_SetDefaultHandler(XML_Parser parser, - XML_DefaultHandler handler); +XML_SetDefaultHandler(XML_Parser parser, XML_DefaultHandler handler); /* This sets the default handler but does not inhibit expansion of internal entities. The entity reference will not be passed to the default handler. */ XMLPARSEAPI(void) -XML_SetDefaultHandlerExpand(XML_Parser parser, - XML_DefaultHandler handler); +XML_SetDefaultHandlerExpand(XML_Parser parser, XML_DefaultHandler handler); XMLPARSEAPI(void) -XML_SetDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start, +XML_SetDoctypeDeclHandler(XML_Parser parser, XML_StartDoctypeDeclHandler start, XML_EndDoctypeDeclHandler end); XMLPARSEAPI(void) @@ -622,16 +575,14 @@ XML_SetStartDoctypeDeclHandler(XML_Parser parser, XML_StartDoctypeDeclHandler start); XMLPARSEAPI(void) -XML_SetEndDoctypeDeclHandler(XML_Parser parser, - XML_EndDoctypeDeclHandler end); +XML_SetEndDoctypeDeclHandler(XML_Parser parser, XML_EndDoctypeDeclHandler end); XMLPARSEAPI(void) XML_SetUnparsedEntityDeclHandler(XML_Parser parser, XML_UnparsedEntityDeclHandler handler); XMLPARSEAPI(void) -XML_SetNotationDeclHandler(XML_Parser parser, - XML_NotationDeclHandler handler); +XML_SetNotationDeclHandler(XML_Parser parser, XML_NotationDeclHandler handler); XMLPARSEAPI(void) XML_SetNamespaceDeclHandler(XML_Parser parser, @@ -659,8 +610,7 @@ XML_SetExternalEntityRefHandler(XML_Parser parser, instead of the parser object. */ XMLPARSEAPI(void) -XML_SetExternalEntityRefHandlerArg(XML_Parser parser, - void *arg); +XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg); XMLPARSEAPI(void) XML_SetSkippedEntityHandler(XML_Parser parser, @@ -740,7 +690,6 @@ XML_UseParserAsHandlerArg(XML_Parser parser); XMLPARSEAPI(enum XML_Error) XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD); - /* Sets the base to be used for resolving relative URIs in system identifiers in declarations. Resolving relative identifiers is left to the application: this value will be passed through as the @@ -780,10 +729,10 @@ XML_GetIdAttributeIndex(XML_Parser parser); info->valueEnd - info->valueStart = 4 bytes. */ typedef struct { - XML_Index nameStart; /* Offset to beginning of the attribute name. */ - XML_Index nameEnd; /* Offset after the attribute name's last byte. */ - XML_Index valueStart; /* Offset to beginning of the attribute value. */ - XML_Index valueEnd; /* Offset after the attribute value's last byte. */ + XML_Index nameStart; /* Offset to beginning of the attribute name. */ + XML_Index nameEnd; /* Offset after the attribute name's last byte. */ + XML_Index valueStart; /* Offset to beginning of the attribute value. */ + XML_Index valueEnd; /* Offset after the attribute value's last byte. */ } XML_AttrInfo; /* Returns an array of XML_AttrInfo structures for the attribute/value pairs @@ -819,20 +768,20 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal); (resumable = 0) an already suspended parser. Some call-backs may still follow because they would otherwise get lost. Examples: - endElementHandler() for empty elements when stopped in - startElementHandler(), - - endNameSpaceDeclHandler() when stopped in endElementHandler(), + startElementHandler(), + - endNameSpaceDeclHandler() when stopped in endElementHandler(), and possibly others. Can be called from most handlers, including DTD related call-backs, except when parsing an external parameter entity and resumable != 0. Returns XML_STATUS_OK when successful, XML_STATUS_ERROR otherwise. - Possible error codes: + Possible error codes: - XML_ERROR_SUSPENDED: when suspending an already suspended parser. - XML_ERROR_FINISHED: when the parser has already finished. - XML_ERROR_SUSPEND_PE: when suspending while parsing an external PE. - When resumable != 0 (true) then parsing is suspended, that is, - XML_Parse() and XML_ParseBuffer() return XML_STATUS_SUSPENDED. + When resumable != 0 (true) then parsing is suspended, that is, + XML_Parse() and XML_ParseBuffer() return XML_STATUS_SUSPENDED. Otherwise, parsing is aborted, that is, XML_Parse() and XML_ParseBuffer() return XML_STATUS_ERROR with error code XML_ERROR_ABORTED. @@ -843,7 +792,7 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal); the externalEntityRefHandler() to call XML_StopParser() on the parent parser (recursively), if one wants to stop parsing altogether. - When suspended, parsing can be resumed by calling XML_ResumeParser(). + When suspended, parsing can be resumed by calling XML_ResumeParser(). */ XMLPARSEAPI(enum XML_Status) XML_StopParser(XML_Parser parser, XML_Bool resumable); @@ -851,7 +800,7 @@ XML_StopParser(XML_Parser parser, XML_Bool resumable); /* Resumes parsing after it has been suspended with XML_StopParser(). Must not be called from within a handler call-back. Returns same status codes as XML_Parse() or XML_ParseBuffer(). - Additional error code XML_ERROR_NOT_SUSPENDED possible. + Additional error code XML_ERROR_NOT_SUSPENDED possible. *Note*: This must be called on the most deeply nested child parser instance @@ -863,12 +812,7 @@ XML_StopParser(XML_Parser parser, XML_Bool resumable); XMLPARSEAPI(enum XML_Status) XML_ResumeParser(XML_Parser parser); -enum XML_Parsing { - XML_INITIALIZED, - XML_PARSING, - XML_FINISHED, - XML_SUSPENDED -}; +enum XML_Parsing { XML_INITIALIZED, XML_PARSING, XML_FINISHED, XML_SUSPENDED }; typedef struct { enum XML_Parsing parsing; @@ -900,8 +844,7 @@ XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status); Otherwise returns a new XML_Parser object. */ XMLPARSEAPI(XML_Parser) -XML_ExternalEntityParserCreate(XML_Parser parser, - const XML_Char *context, +XML_ExternalEntityParserCreate(XML_Parser parser, const XML_Char *context, const XML_Char *encoding); enum XML_ParamEntityParsing { @@ -945,8 +888,7 @@ XML_SetParamEntityParsing(XML_Parser parser, Note: If parser == NULL, the function will do nothing and return 0. */ XMLPARSEAPI(int) -XML_SetHashSalt(XML_Parser parser, - unsigned long hash_salt); +XML_SetHashSalt(XML_Parser parser, unsigned long hash_salt); /* If XML_Parse or XML_ParseBuffer have returned XML_STATUS_ERROR, then XML_GetErrorCode returns information about the error. @@ -963,7 +905,7 @@ XML_GetErrorCode(XML_Parser parser); be within the relevant markup. When called outside of the callback functions, the position indicated will be just past the last parse event (regardless of whether there was an associated callback). - + They may also be called after returning from a call to XML_Parse or XML_ParseBuffer. If the return value is XML_STATUS_ERROR then the location is the location of the character at which the error @@ -995,14 +937,12 @@ XML_GetCurrentByteCount(XML_Parser parser); the handler that makes the call. */ XMLPARSEAPI(const char *) -XML_GetInputContext(XML_Parser parser, - int *offset, - int *size); +XML_GetInputContext(XML_Parser parser, int *offset, int *size); /* For backwards compatibility with previous versions. */ -#define XML_GetErrorLineNumber XML_GetCurrentLineNumber +#define XML_GetErrorLineNumber XML_GetCurrentLineNumber #define XML_GetErrorColumnNumber XML_GetCurrentColumnNumber -#define XML_GetErrorByteIndex XML_GetCurrentByteIndex +#define XML_GetErrorByteIndex XML_GetCurrentByteIndex /* Frees the content model passed to the element declaration handler */ XMLPARSEAPI(void) @@ -1062,21 +1002,20 @@ enum XML_FeatureEnum { }; typedef struct { - enum XML_FeatureEnum feature; - const XML_LChar *name; - long int value; + enum XML_FeatureEnum feature; + const XML_LChar *name; + long int value; } XML_Feature; XMLPARSEAPI(const XML_Feature *) XML_GetFeatureList(void); - /* Expat follows the semantic versioning convention. See http://semver.org. */ #define XML_MAJOR_VERSION 2 #define XML_MINOR_VERSION 2 -#define XML_MICRO_VERSION 7 +#define XML_MICRO_VERSION 8 #ifdef __cplusplus } diff --git a/Modules/expat/expat_external.h b/Modules/expat/expat_external.h index fc63c2228d3e69..f2b75dda8e2798 100644 --- a/Modules/expat/expat_external.h +++ b/Modules/expat/expat_external.h @@ -35,10 +35,6 @@ /* External API definitions */ -#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__) -# define XML_USE_MSC_EXTENSIONS 1 -#endif - /* Expat tries very hard to make the API boundary very specifically defined. There are two macros defined to control this boundary; each of these can be defined before including this header to @@ -61,12 +57,17 @@ compiled with the cdecl calling convention as the default since system headers may assume the cdecl convention. */ + +/* Namespace external symbols to allow multiple libexpat version to + co-exist. */ +#include "pyexpatns.h" + #ifndef XMLCALL -# if defined(_MSC_VER) -# define XMLCALL __cdecl -# elif defined(__GNUC__) && defined(__i386) && !defined(__INTEL_COMPILER) -# define XMLCALL __attribute__((cdecl)) -# else +# if defined(_MSC_VER) +# define XMLCALL __cdecl +# elif defined(__GNUC__) && defined(__i386) && ! defined(__INTEL_COMPILER) +# define XMLCALL __attribute__((cdecl)) +# else /* For any platform which uses this definition and supports more than one calling convention, we need to extend this definition to declare the convention used on that platform, if it's possible to @@ -77,49 +78,46 @@ pre-processor and how to specify the same calling convention as the platform's malloc() implementation. */ -# define XMLCALL -# endif -#endif /* not defined XMLCALL */ - -/* Namespace external symbols to allow multiple libexpat version to - co-exist. */ -#include "pyexpatns.h" - +# define XMLCALL +# endif +#endif /* not defined XMLCALL */ -#if !defined(XML_STATIC) && !defined(XMLIMPORT) -# ifndef XML_BUILDING_EXPAT +#if ! defined(XML_STATIC) && ! defined(XMLIMPORT) +# ifndef XML_BUILDING_EXPAT /* using Expat from an application */ -# ifdef XML_USE_MSC_EXTENSIONS -# define XMLIMPORT __declspec(dllimport) -# endif +# if defined(_MSC_EXTENSIONS) && ! defined(__BEOS__) && ! defined(__CYGWIN__) +# define XMLIMPORT __declspec(dllimport) +# endif -# endif -#endif /* not defined XML_STATIC */ +# endif +#endif /* not defined XML_STATIC */ #ifndef XML_ENABLE_VISIBILITY -# define XML_ENABLE_VISIBILITY 0 +# define XML_ENABLE_VISIBILITY 0 #endif -#if !defined(XMLIMPORT) && XML_ENABLE_VISIBILITY -# define XMLIMPORT __attribute__ ((visibility ("default"))) +#if ! defined(XMLIMPORT) && XML_ENABLE_VISIBILITY +# define XMLIMPORT __attribute__((visibility("default"))) #endif /* If we didn't define it above, define it away: */ #ifndef XMLIMPORT -# define XMLIMPORT +# define XMLIMPORT #endif -#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)) -# define XML_ATTR_MALLOC __attribute__((__malloc__)) +#if defined(__GNUC__) \ + && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)) +# define XML_ATTR_MALLOC __attribute__((__malloc__)) #else -# define XML_ATTR_MALLOC +# define XML_ATTR_MALLOC #endif -#if defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) -# define XML_ATTR_ALLOC_SIZE(x) __attribute__((__alloc_size__(x))) +#if defined(__GNUC__) \ + && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) +# define XML_ATTR_ALLOC_SIZE(x) __attribute__((__alloc_size__(x))) #else -# define XML_ATTR_ALLOC_SIZE(x) +# define XML_ATTR_ALLOC_SIZE(x) #endif #define XMLPARSEAPI(type) XMLIMPORT type XMLCALL @@ -129,35 +127,30 @@ extern "C" { #endif #ifdef XML_UNICODE_WCHAR_T -# ifndef XML_UNICODE -# define XML_UNICODE -# endif -# if defined(__SIZEOF_WCHAR_T__) && (__SIZEOF_WCHAR_T__ != 2) -# error "sizeof(wchar_t) != 2; Need -fshort-wchar for both Expat and libc" -# endif +# ifndef XML_UNICODE +# define XML_UNICODE +# endif +# if defined(__SIZEOF_WCHAR_T__) && (__SIZEOF_WCHAR_T__ != 2) +# error "sizeof(wchar_t) != 2; Need -fshort-wchar for both Expat and libc" +# endif #endif -#ifdef XML_UNICODE /* Information is UTF-16 encoded. */ -# ifdef XML_UNICODE_WCHAR_T +#ifdef XML_UNICODE /* Information is UTF-16 encoded. */ +# ifdef XML_UNICODE_WCHAR_T typedef wchar_t XML_Char; typedef wchar_t XML_LChar; -# else +# else typedef unsigned short XML_Char; typedef char XML_LChar; -# endif /* XML_UNICODE_WCHAR_T */ -#else /* Information is UTF-8 encoded. */ +# endif /* XML_UNICODE_WCHAR_T */ +#else /* Information is UTF-8 encoded. */ typedef char XML_Char; typedef char XML_LChar; -#endif /* XML_UNICODE */ +#endif /* XML_UNICODE */ -#ifdef XML_LARGE_SIZE /* Use large integers for file/stream positions. */ -# if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400 -typedef __int64 XML_Index; -typedef unsigned __int64 XML_Size; -# else +#ifdef XML_LARGE_SIZE /* Use large integers for file/stream positions. */ typedef long long XML_Index; typedef unsigned long long XML_Size; -# endif #else typedef long XML_Index; typedef unsigned long XML_Size; diff --git a/Modules/expat/iasciitab.h b/Modules/expat/iasciitab.h index ce4a4bf7edef53..ea97cfcf678e06 100644 --- a/Modules/expat/iasciitab.h +++ b/Modules/expat/iasciitab.h @@ -32,34 +32,34 @@ /* Like asciitab.h, except that 0xD has code BT_S rather than BT_CR */ /* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, -/* 0x0C */ BT_NONXML, BT_S, BT_NONXML, BT_NONXML, -/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, -/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, -/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, -/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, -/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, -/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, -/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, -/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, -/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, + /* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, + /* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, + /* 0x0C */ BT_NONXML, BT_S, BT_NONXML, BT_NONXML, + /* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, + /* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, + /* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, + /* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, + /* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, + /* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, + /* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, + /* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, + /* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, + /* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, + /* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, + /* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, + /* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, + /* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, + /* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, + /* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, + /* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, + /* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, + /* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, + /* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, diff --git a/Modules/expat/internal.h b/Modules/expat/internal.h index dc4ef0c7e2588c..60913dab762f8f 100644 --- a/Modules/expat/internal.h +++ b/Modules/expat/internal.h @@ -49,7 +49,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#if defined(__GNUC__) && defined(__i386__) && !defined(__MINGW32__) +#if defined(__GNUC__) && defined(__i386__) && ! defined(__MINGW32__) /* We'll use this version by default only where we know it helps. regparm() generates warnings on Solaris boxes. See SF bug #692878. @@ -59,8 +59,8 @@ #define FASTCALL __attribute__((stdcall, regparm(3))) and let's try this: */ -#define FASTCALL __attribute__((regparm(3))) -#define PTRFASTCALL __attribute__((regparm(3))) +# define FASTCALL __attribute__((regparm(3))) +# define PTRFASTCALL __attribute__((regparm(3))) #endif /* Using __fastcall seems to have an unexpected negative effect under @@ -74,55 +74,49 @@ /* Make sure all of these are defined if they aren't already. */ #ifndef FASTCALL -#define FASTCALL +# define FASTCALL #endif #ifndef PTRCALL -#define PTRCALL +# define PTRCALL #endif #ifndef PTRFASTCALL -#define PTRFASTCALL +# define PTRFASTCALL #endif #ifndef XML_MIN_SIZE -#if !defined(__cplusplus) && !defined(inline) -#ifdef __GNUC__ -#define inline __inline -#endif /* __GNUC__ */ -#endif +# if ! defined(__cplusplus) && ! defined(inline) +# ifdef __GNUC__ +# define inline __inline +# endif /* __GNUC__ */ +# endif #endif /* XML_MIN_SIZE */ #ifdef __cplusplus -#define inline inline +# define inline inline #else -#ifndef inline -#define inline -#endif +# ifndef inline +# define inline +# endif #endif #ifndef UNUSED_P -# ifdef __GNUC__ -# define UNUSED_P(p) UNUSED_ ## p __attribute__((__unused__)) -# else -# define UNUSED_P(p) UNUSED_ ## p -# endif +# define UNUSED_P(p) (void)p #endif - #ifdef __cplusplus extern "C" { #endif - #ifdef XML_ENABLE_VISIBILITY -#if XML_ENABLE_VISIBILITY -__attribute__ ((visibility ("default"))) -#endif +# if XML_ENABLE_VISIBILITY +__attribute__((visibility("default"))) +# endif #endif void -_INTERNAL_trim_to_complete_utf8_characters(const char * from, const char ** fromLimRef); - +_INTERNAL_trim_to_complete_utf8_characters(const char *from, + const char **fromLimRef); #ifdef __cplusplus } diff --git a/Modules/expat/latin1tab.h b/Modules/expat/latin1tab.h index 95dfa52b1fbebb..6f916041355a86 100644 --- a/Modules/expat/latin1tab.h +++ b/Modules/expat/latin1tab.h @@ -31,34 +31,34 @@ */ /* 0x80 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x84 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x88 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x8C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x90 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x94 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x98 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x9C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xA0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xA4 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xA8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, -/* 0xAC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xB0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xB4 */ BT_OTHER, BT_NMSTRT, BT_OTHER, BT_NAME, -/* 0xB8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, -/* 0xBC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xC0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xC4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xC8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xCC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xD0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xD4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0xD8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xDC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xE0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xE4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xE8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xEC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xF0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xF4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0xF8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xFC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0x84 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, + /* 0x88 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, + /* 0x8C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, + /* 0x90 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, + /* 0x94 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, + /* 0x98 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, + /* 0x9C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, + /* 0xA0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, + /* 0xA4 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, + /* 0xA8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, + /* 0xAC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, + /* 0xB0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, + /* 0xB4 */ BT_OTHER, BT_NMSTRT, BT_OTHER, BT_NAME, + /* 0xB8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, + /* 0xBC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, + /* 0xC0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0xC4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0xC8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0xCC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0xD0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0xD4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, + /* 0xD8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0xDC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0xE0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0xE4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0xE8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0xEC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0xF0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0xF4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, + /* 0xF8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, + /* 0xFC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, diff --git a/Modules/expat/loadlibrary.c b/Modules/expat/loadlibrary.c deleted file mode 100644 index 35fdf98bce6cea..00000000000000 --- a/Modules/expat/loadlibrary.c +++ /dev/null @@ -1,143 +0,0 @@ -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 2016 - 2017, Steve Holme, . - * Copyright (C) 2017, Expat development team - * - * All rights reserved. - * Licensed under the MIT license: - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH - * THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Except as contained in this notice, the name of a copyright holder shall - * not be used in advertising or otherwise to promote the sale, use or other - * dealings in this Software without prior written authorization of the - * copyright holder. - * - ***************************************************************************/ - -#if defined(_WIN32) - -#include -#include - - -HMODULE _Expat_LoadLibrary(LPCTSTR filename); - - -#if !defined(LOAD_WITH_ALTERED_SEARCH_PATH) -#define LOAD_WITH_ALTERED_SEARCH_PATH 0x00000008 -#endif - -#if !defined(LOAD_LIBRARY_SEARCH_SYSTEM32) -#define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800 -#endif - -/* We use our own typedef here since some headers might lack these */ -typedef HMODULE (APIENTRY *LOADLIBRARYEX_FN)(LPCTSTR, HANDLE, DWORD); - -/* See function definitions in winbase.h */ -#ifdef UNICODE -# ifdef _WIN32_WCE -# define LOADLIBARYEX L"LoadLibraryExW" -# else -# define LOADLIBARYEX "LoadLibraryExW" -# endif -#else -# define LOADLIBARYEX "LoadLibraryExA" -#endif - - -/* - * _Expat_LoadLibrary() - * - * This is used to dynamically load DLLs using the most secure method available - * for the version of Windows that we are running on. - * - * Parameters: - * - * filename [in] - The filename or full path of the DLL to load. If only the - * filename is passed then the DLL will be loaded from the - * Windows system directory. - * - * Returns the handle of the module on success; otherwise NULL. - */ -HMODULE _Expat_LoadLibrary(LPCTSTR filename) -{ - HMODULE hModule = NULL; - LOADLIBRARYEX_FN pLoadLibraryEx = NULL; - - /* Get a handle to kernel32 so we can access it's functions at runtime */ - HMODULE hKernel32 = GetModuleHandle(TEXT("kernel32")); - if(!hKernel32) - return NULL; /* LCOV_EXCL_LINE */ - - /* Attempt to find LoadLibraryEx() which is only available on Windows 2000 - and above */ - pLoadLibraryEx = (LOADLIBRARYEX_FN) GetProcAddress(hKernel32, LOADLIBARYEX); - - /* Detect if there's already a path in the filename and load the library if - there is. Note: Both back slashes and forward slashes have been supported - since the earlier days of DOS at an API level although they are not - supported by command prompt */ - if(_tcspbrk(filename, TEXT("\\/"))) { - /** !checksrc! disable BANNEDFUNC 1 **/ - hModule = pLoadLibraryEx ? - pLoadLibraryEx(filename, NULL, LOAD_WITH_ALTERED_SEARCH_PATH) : - LoadLibrary(filename); - } - /* Detect if KB2533623 is installed, as LOAD_LIBARY_SEARCH_SYSTEM32 is only - supported on Windows Vista, Windows Server 2008, Windows 7 and Windows - Server 2008 R2 with this patch or natively on Windows 8 and above */ - else if(pLoadLibraryEx && GetProcAddress(hKernel32, "AddDllDirectory")) { - /* Load the DLL from the Windows system directory */ - hModule = pLoadLibraryEx(filename, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32); - } - else { - /* Attempt to get the Windows system path */ - UINT systemdirlen = GetSystemDirectory(NULL, 0); - if(systemdirlen) { - /* Allocate space for the full DLL path (Room for the null terminator - is included in systemdirlen) */ - size_t filenamelen = _tcslen(filename); - TCHAR *path = malloc(sizeof(TCHAR) * (systemdirlen + 1 + filenamelen)); - if(path && GetSystemDirectory(path, systemdirlen)) { - /* Calculate the full DLL path */ - _tcscpy(path + _tcslen(path), TEXT("\\")); - _tcscpy(path + _tcslen(path), filename); - - /* Load the DLL from the Windows system directory */ - /** !checksrc! disable BANNEDFUNC 1 **/ - hModule = pLoadLibraryEx ? - pLoadLibraryEx(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH) : - LoadLibrary(path); - - } - free(path); - } - } - - return hModule; -} - -#else /* defined(_WIN32) */ - -/* ISO C requires a translation unit to contain at least one declaration - [-Wempty-translation-unit] */ -typedef int _TRANSLATION_UNIT_LOAD_LIBRARY_C_NOT_EMTPY; - -#endif /* defined(_WIN32) */ diff --git a/Modules/expat/nametab.h b/Modules/expat/nametab.h index bfa2bd38cd95cd..3681df348eebd6 100644 --- a/Modules/expat/nametab.h +++ b/Modules/expat/nametab.h @@ -31,152 +31,106 @@ */ static const unsigned namingBitmap[] = { -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0x00000000, 0x04000000, 0x87FFFFFE, 0x07FFFFFE, -0x00000000, 0x00000000, 0xFF7FFFFF, 0xFF7FFFFF, -0xFFFFFFFF, 0x7FF3FFFF, 0xFFFFFDFE, 0x7FFFFFFF, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE00F, 0xFC31FFFF, -0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, -0xFFFFFFFF, 0xF80001FF, 0x00000003, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFD740, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, -0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, -0xFFFF0003, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, -0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, -0x0000007F, 0x00000000, 0xFFFF0000, 0x000707FF, -0x00000000, 0x07FFFFFE, 0x000007FE, 0xFFFE0000, -0xFFFFFFFF, 0x7CFFFFFF, 0x002F7FFF, 0x00000060, -0xFFFFFFE0, 0x23FFFFFF, 0xFF000000, 0x00000003, -0xFFF99FE0, 0x03C5FDFF, 0xB0000000, 0x00030003, -0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000, -0xFFFBAFE0, 0x23EDFDFF, 0x00000000, 0x00000001, -0xFFF99FE0, 0x23CDFDFF, 0xB0000000, 0x00000003, -0xD63DC7E0, 0x03BFC718, 0x00000000, 0x00000000, -0xFFFDDFE0, 0x03EFFDFF, 0x00000000, 0x00000003, -0xFFFDDFE0, 0x03EFFDFF, 0x40000000, 0x00000003, -0xFFFDDFE0, 0x03FFFDFF, 0x00000000, 0x00000003, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFE, 0x000D7FFF, 0x0000003F, 0x00000000, -0xFEF02596, 0x200D6CAE, 0x0000001F, 0x00000000, -0x00000000, 0x00000000, 0xFFFFFEFF, 0x000003FF, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0xFFFFFFFF, 0xFFFF003F, 0x007FFFFF, -0x0007DAED, 0x50000000, 0x82315001, 0x002C62AB, -0x40000000, 0xF580C900, 0x00000007, 0x02010800, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, -0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, -0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF, -0x00000000, 0x00004C40, 0x00000000, 0x00000000, -0x00000007, 0x00000000, 0x00000000, 0x00000000, -0x00000080, 0x000003FE, 0xFFFFFFFE, 0xFFFFFFFF, -0x001FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x07FFFFFF, -0xFFFFFFE0, 0x00001FFF, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000, -0x00000000, 0x07FF6000, 0x87FFFFFE, 0x07FFFFFE, -0x00000000, 0x00800000, 0xFF7FFFFF, 0xFF7FFFFF, -0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, -0xFFFFFFFF, 0xF80001FF, 0x00030003, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000003, -0xFFFFD7C0, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, -0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, -0xFFFF007B, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, -0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, -0xFFFE007F, 0xBBFFFFFB, 0xFFFF0016, 0x000707FF, -0x00000000, 0x07FFFFFE, 0x0007FFFF, 0xFFFF03FF, -0xFFFFFFFF, 0x7CFFFFFF, 0xFFEF7FFF, 0x03FF3DFF, -0xFFFFFFEE, 0xF3FFFFFF, 0xFF1E3FFF, 0x0000FFCF, -0xFFF99FEE, 0xD3C5FDFF, 0xB080399F, 0x0003FFCF, -0xFFF987E4, 0xD36DFDFF, 0x5E003987, 0x001FFFC0, -0xFFFBAFEE, 0xF3EDFDFF, 0x00003BBF, 0x0000FFC1, -0xFFF99FEE, 0xF3CDFDFF, 0xB0C0398F, 0x0000FFC3, -0xD63DC7EC, 0xC3BFC718, 0x00803DC7, 0x0000FF80, -0xFFFDDFEE, 0xC3EFFDFF, 0x00603DDF, 0x0000FFC3, -0xFFFDDFEC, 0xC3EFFDFF, 0x40603DDF, 0x0000FFC3, -0xFFFDDFEC, 0xC3FFFDFF, 0x00803DCF, 0x0000FFC3, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FFF, 0x00000000, -0xFEF02596, 0x3BFF6CAE, 0x03FF3F5F, 0x00000000, -0x03000000, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE03FF, -0xFEBF0FDF, 0x02FE3FFF, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x1FFF0000, 0x00000002, -0x000000A0, 0x003EFFFE, 0xFFFFFFFE, 0xFFFFFFFF, -0x661FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x77FFFFFF, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x04000000, + 0x87FFFFFE, 0x07FFFFFE, 0x00000000, 0x00000000, 0xFF7FFFFF, 0xFF7FFFFF, + 0xFFFFFFFF, 0x7FF3FFFF, 0xFFFFFDFE, 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFE00F, 0xFC31FFFF, 0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, + 0xFFFFFFFF, 0xF80001FF, 0x00000003, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFD740, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, + 0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, 0xFFFF0003, 0xFFFFFFFF, + 0xFFFF199F, 0x033FCFFF, 0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, + 0x0000007F, 0x00000000, 0xFFFF0000, 0x000707FF, 0x00000000, 0x07FFFFFE, + 0x000007FE, 0xFFFE0000, 0xFFFFFFFF, 0x7CFFFFFF, 0x002F7FFF, 0x00000060, + 0xFFFFFFE0, 0x23FFFFFF, 0xFF000000, 0x00000003, 0xFFF99FE0, 0x03C5FDFF, + 0xB0000000, 0x00030003, 0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000, + 0xFFFBAFE0, 0x23EDFDFF, 0x00000000, 0x00000001, 0xFFF99FE0, 0x23CDFDFF, + 0xB0000000, 0x00000003, 0xD63DC7E0, 0x03BFC718, 0x00000000, 0x00000000, + 0xFFFDDFE0, 0x03EFFDFF, 0x00000000, 0x00000003, 0xFFFDDFE0, 0x03EFFDFF, + 0x40000000, 0x00000003, 0xFFFDDFE0, 0x03FFFDFF, 0x00000000, 0x00000003, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFE, 0x000D7FFF, + 0x0000003F, 0x00000000, 0xFEF02596, 0x200D6CAE, 0x0000001F, 0x00000000, + 0x00000000, 0x00000000, 0xFFFFFEFF, 0x000003FF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xFFFFFFFF, 0xFFFF003F, 0x007FFFFF, 0x0007DAED, 0x50000000, + 0x82315001, 0x002C62AB, 0x40000000, 0xF580C900, 0x00000007, 0x02010800, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0FFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0x03FFFFFF, 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, + 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF, 0x00000000, 0x00004C40, + 0x00000000, 0x00000000, 0x00000007, 0x00000000, 0x00000000, 0x00000000, + 0x00000080, 0x000003FE, 0xFFFFFFFE, 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFE, + 0xFFFFFFFF, 0x07FFFFFF, 0xFFFFFFE0, 0x00001FFF, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, + 0x00000000, 0x00000000, 0x00000000, 0x07FF6000, 0x87FFFFFE, 0x07FFFFFE, + 0x00000000, 0x00800000, 0xFF7FFFFF, 0xFF7FFFFF, 0x00FFFFFF, 0x00000000, + 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0xF80001FF, 0x00030003, 0x00000000, + 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000003, 0xFFFFD7C0, 0xFFFFFFFB, + 0x547F7FFF, 0x000FFFFD, 0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, + 0xFFFF007B, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, 0x00000000, 0xFFFE0000, + 0x027FFFFF, 0xFFFFFFFE, 0xFFFE007F, 0xBBFFFFFB, 0xFFFF0016, 0x000707FF, + 0x00000000, 0x07FFFFFE, 0x0007FFFF, 0xFFFF03FF, 0xFFFFFFFF, 0x7CFFFFFF, + 0xFFEF7FFF, 0x03FF3DFF, 0xFFFFFFEE, 0xF3FFFFFF, 0xFF1E3FFF, 0x0000FFCF, + 0xFFF99FEE, 0xD3C5FDFF, 0xB080399F, 0x0003FFCF, 0xFFF987E4, 0xD36DFDFF, + 0x5E003987, 0x001FFFC0, 0xFFFBAFEE, 0xF3EDFDFF, 0x00003BBF, 0x0000FFC1, + 0xFFF99FEE, 0xF3CDFDFF, 0xB0C0398F, 0x0000FFC3, 0xD63DC7EC, 0xC3BFC718, + 0x00803DC7, 0x0000FF80, 0xFFFDDFEE, 0xC3EFFDFF, 0x00603DDF, 0x0000FFC3, + 0xFFFDDFEC, 0xC3EFFDFF, 0x40603DDF, 0x0000FFC3, 0xFFFDDFEC, 0xC3FFFDFF, + 0x00803DCF, 0x0000FFC3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FFF, 0x00000000, 0xFEF02596, 0x3BFF6CAE, + 0x03FF3F5F, 0x00000000, 0x03000000, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE03FF, + 0xFEBF0FDF, 0x02FE3FFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x1FFF0000, 0x00000002, + 0x000000A0, 0x003EFFFE, 0xFFFFFFFE, 0xFFFFFFFF, 0x661FFFFF, 0xFFFFFFFE, + 0xFFFFFFFF, 0x77FFFFFF, }; static const unsigned char nmstrtPages[] = { -0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, -0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, -0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, -0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x09, 0x0A, 0x0B, + 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, }; static const unsigned char namePages[] = { -0x19, 0x03, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x00, -0x00, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, -0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, -0x26, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x27, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x19, 0x03, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x00, 0x00, 0x1F, 0x20, 0x21, + 0x22, 0x23, 0x24, 0x25, 0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, 0x26, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x27, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, }; diff --git a/Modules/expat/siphash.h b/Modules/expat/siphash.h index 4d6786d7839a2c..bfee65a332f1bf 100644 --- a/Modules/expat/siphash.h +++ b/Modules/expat/siphash.h @@ -11,6 +11,10 @@ * -------------------------------------------------------------------------- * HISTORY: * + * 2019-08-03 (Sebastian Pipping) + * - Mark part of sip24_valid as to be excluded from clang-format + * - Re-format code using clang-format 9 + * * 2018-07-08 (Anton Maklakov) * - Add "fall through" markers for GCC's -Wimplicit-fallthrough * @@ -94,186 +98,186 @@ #include /* size_t */ #if defined(_WIN32) && defined(_MSC_VER) && (_MSC_VER < 1600) - /* For vs2003/7.1 up to vs2008/9.0; _MSC_VER 1600 is vs2010/10.0 */ - typedef unsigned __int8 uint8_t; - typedef unsigned __int32 uint32_t; - typedef unsigned __int64 uint64_t; +/* For vs2003/7.1 up to vs2008/9.0; _MSC_VER 1600 is vs2010/10.0 */ +typedef unsigned __int8 uint8_t; +typedef unsigned __int32 uint32_t; +typedef unsigned __int64 uint64_t; #else - #include /* uint64_t uint32_t uint8_t */ +# include /* uint64_t uint32_t uint8_t */ #endif - /* * Workaround to not require a C++11 compiler for using ULL suffix * if this code is included and compiled as C++; related GCC warning is: * warning: use of C++11 long long integer constant [-Wlong-long] */ -#define _SIP_ULL(high, low) (((uint64_t)high << 32) | low) - - -#define SIP_ROTL(x, b) (uint64_t)(((x) << (b)) | ( (x) >> (64 - (b)))) +#define _SIP_ULL(high, low) (((uint64_t)high << 32) | low) -#define SIP_U32TO8_LE(p, v) \ - (p)[0] = (uint8_t)((v) >> 0); (p)[1] = (uint8_t)((v) >> 8); \ - (p)[2] = (uint8_t)((v) >> 16); (p)[3] = (uint8_t)((v) >> 24); +#define SIP_ROTL(x, b) (uint64_t)(((x) << (b)) | ((x) >> (64 - (b)))) -#define SIP_U64TO8_LE(p, v) \ - SIP_U32TO8_LE((p) + 0, (uint32_t)((v) >> 0)); \ - SIP_U32TO8_LE((p) + 4, (uint32_t)((v) >> 32)); +#define SIP_U32TO8_LE(p, v) \ + (p)[0] = (uint8_t)((v) >> 0); \ + (p)[1] = (uint8_t)((v) >> 8); \ + (p)[2] = (uint8_t)((v) >> 16); \ + (p)[3] = (uint8_t)((v) >> 24); -#define SIP_U8TO64_LE(p) \ - (((uint64_t)((p)[0]) << 0) | \ - ((uint64_t)((p)[1]) << 8) | \ - ((uint64_t)((p)[2]) << 16) | \ - ((uint64_t)((p)[3]) << 24) | \ - ((uint64_t)((p)[4]) << 32) | \ - ((uint64_t)((p)[5]) << 40) | \ - ((uint64_t)((p)[6]) << 48) | \ - ((uint64_t)((p)[7]) << 56)) +#define SIP_U64TO8_LE(p, v) \ + SIP_U32TO8_LE((p) + 0, (uint32_t)((v) >> 0)); \ + SIP_U32TO8_LE((p) + 4, (uint32_t)((v) >> 32)); +#define SIP_U8TO64_LE(p) \ + (((uint64_t)((p)[0]) << 0) | ((uint64_t)((p)[1]) << 8) \ + | ((uint64_t)((p)[2]) << 16) | ((uint64_t)((p)[3]) << 24) \ + | ((uint64_t)((p)[4]) << 32) | ((uint64_t)((p)[5]) << 40) \ + | ((uint64_t)((p)[6]) << 48) | ((uint64_t)((p)[7]) << 56)) -#define SIPHASH_INITIALIZER { 0, 0, 0, 0, { 0 }, 0, 0 } +#define SIPHASH_INITIALIZER \ + { 0, 0, 0, 0, {0}, 0, 0 } struct siphash { - uint64_t v0, v1, v2, v3; + uint64_t v0, v1, v2, v3; - unsigned char buf[8], *p; - uint64_t c; + unsigned char buf[8], *p; + uint64_t c; }; /* struct siphash */ - #define SIP_KEYLEN 16 struct sipkey { - uint64_t k[2]; + uint64_t k[2]; }; /* struct sipkey */ -#define sip_keyof(k) sip_tokey(&(struct sipkey){ { 0 } }, (k)) +#define sip_keyof(k) sip_tokey(&(struct sipkey){{0}}, (k)) -static struct sipkey *sip_tokey(struct sipkey *key, const void *src) { - key->k[0] = SIP_U8TO64_LE((const unsigned char *)src); - key->k[1] = SIP_U8TO64_LE((const unsigned char *)src + 8); - return key; +static struct sipkey * +sip_tokey(struct sipkey *key, const void *src) { + key->k[0] = SIP_U8TO64_LE((const unsigned char *)src); + key->k[1] = SIP_U8TO64_LE((const unsigned char *)src + 8); + return key; } /* sip_tokey() */ - #ifdef SIPHASH_TOBIN -#define sip_binof(v) sip_tobin((unsigned char[8]){ 0 }, (v)) +# define sip_binof(v) sip_tobin((unsigned char[8]){0}, (v)) -static void *sip_tobin(void *dst, uint64_t u64) { - SIP_U64TO8_LE((unsigned char *)dst, u64); - return dst; +static void * +sip_tobin(void *dst, uint64_t u64) { + SIP_U64TO8_LE((unsigned char *)dst, u64); + return dst; } /* sip_tobin() */ -#endif /* SIPHASH_TOBIN */ - +#endif /* SIPHASH_TOBIN */ -static void sip_round(struct siphash *H, const int rounds) { - int i; +static void +sip_round(struct siphash *H, const int rounds) { + int i; - for (i = 0; i < rounds; i++) { - H->v0 += H->v1; - H->v1 = SIP_ROTL(H->v1, 13); - H->v1 ^= H->v0; - H->v0 = SIP_ROTL(H->v0, 32); + for (i = 0; i < rounds; i++) { + H->v0 += H->v1; + H->v1 = SIP_ROTL(H->v1, 13); + H->v1 ^= H->v0; + H->v0 = SIP_ROTL(H->v0, 32); - H->v2 += H->v3; - H->v3 = SIP_ROTL(H->v3, 16); - H->v3 ^= H->v2; + H->v2 += H->v3; + H->v3 = SIP_ROTL(H->v3, 16); + H->v3 ^= H->v2; - H->v0 += H->v3; - H->v3 = SIP_ROTL(H->v3, 21); - H->v3 ^= H->v0; + H->v0 += H->v3; + H->v3 = SIP_ROTL(H->v3, 21); + H->v3 ^= H->v0; - H->v2 += H->v1; - H->v1 = SIP_ROTL(H->v1, 17); - H->v1 ^= H->v2; - H->v2 = SIP_ROTL(H->v2, 32); - } + H->v2 += H->v1; + H->v1 = SIP_ROTL(H->v1, 17); + H->v1 ^= H->v2; + H->v2 = SIP_ROTL(H->v2, 32); + } } /* sip_round() */ +static struct siphash * +sip24_init(struct siphash *H, const struct sipkey *key) { + H->v0 = _SIP_ULL(0x736f6d65U, 0x70736575U) ^ key->k[0]; + H->v1 = _SIP_ULL(0x646f7261U, 0x6e646f6dU) ^ key->k[1]; + H->v2 = _SIP_ULL(0x6c796765U, 0x6e657261U) ^ key->k[0]; + H->v3 = _SIP_ULL(0x74656462U, 0x79746573U) ^ key->k[1]; -static struct siphash *sip24_init(struct siphash *H, - const struct sipkey *key) { - H->v0 = _SIP_ULL(0x736f6d65U, 0x70736575U) ^ key->k[0]; - H->v1 = _SIP_ULL(0x646f7261U, 0x6e646f6dU) ^ key->k[1]; - H->v2 = _SIP_ULL(0x6c796765U, 0x6e657261U) ^ key->k[0]; - H->v3 = _SIP_ULL(0x74656462U, 0x79746573U) ^ key->k[1]; + H->p = H->buf; + H->c = 0; - H->p = H->buf; - H->c = 0; - - return H; + return H; } /* sip24_init() */ +#define sip_endof(a) (&(a)[sizeof(a) / sizeof *(a)]) -#define sip_endof(a) (&(a)[sizeof (a) / sizeof *(a)]) - -static struct siphash *sip24_update(struct siphash *H, const void *src, - size_t len) { - const unsigned char *p = (const unsigned char *)src, *pe = p + len; - uint64_t m; +static struct siphash * +sip24_update(struct siphash *H, const void *src, size_t len) { + const unsigned char *p = (const unsigned char *)src, *pe = p + len; + uint64_t m; - do { - while (p < pe && H->p < sip_endof(H->buf)) - *H->p++ = *p++; + do { + while (p < pe && H->p < sip_endof(H->buf)) + *H->p++ = *p++; - if (H->p < sip_endof(H->buf)) - break; + if (H->p < sip_endof(H->buf)) + break; - m = SIP_U8TO64_LE(H->buf); - H->v3 ^= m; - sip_round(H, 2); - H->v0 ^= m; + m = SIP_U8TO64_LE(H->buf); + H->v3 ^= m; + sip_round(H, 2); + H->v0 ^= m; - H->p = H->buf; - H->c += 8; - } while (p < pe); + H->p = H->buf; + H->c += 8; + } while (p < pe); - return H; + return H; } /* sip24_update() */ - -static uint64_t sip24_final(struct siphash *H) { - const char left = (char)(H->p - H->buf); - uint64_t b = (H->c + left) << 56; - - switch (left) { - case 7: b |= (uint64_t)H->buf[6] << 48; - /* fall through */ - case 6: b |= (uint64_t)H->buf[5] << 40; - /* fall through */ - case 5: b |= (uint64_t)H->buf[4] << 32; - /* fall through */ - case 4: b |= (uint64_t)H->buf[3] << 24; - /* fall through */ - case 3: b |= (uint64_t)H->buf[2] << 16; - /* fall through */ - case 2: b |= (uint64_t)H->buf[1] << 8; - /* fall through */ - case 1: b |= (uint64_t)H->buf[0] << 0; - /* fall through */ - case 0: break; - } - - H->v3 ^= b; - sip_round(H, 2); - H->v0 ^= b; - H->v2 ^= 0xff; - sip_round(H, 4); - - return H->v0 ^ H->v1 ^ H->v2 ^ H->v3; +static uint64_t +sip24_final(struct siphash *H) { + const char left = (char)(H->p - H->buf); + uint64_t b = (H->c + left) << 56; + + switch (left) { + case 7: + b |= (uint64_t)H->buf[6] << 48; + /* fall through */ + case 6: + b |= (uint64_t)H->buf[5] << 40; + /* fall through */ + case 5: + b |= (uint64_t)H->buf[4] << 32; + /* fall through */ + case 4: + b |= (uint64_t)H->buf[3] << 24; + /* fall through */ + case 3: + b |= (uint64_t)H->buf[2] << 16; + /* fall through */ + case 2: + b |= (uint64_t)H->buf[1] << 8; + /* fall through */ + case 1: + b |= (uint64_t)H->buf[0] << 0; + /* fall through */ + case 0: + break; + } + + H->v3 ^= b; + sip_round(H, 2); + H->v0 ^= b; + H->v2 ^= 0xff; + sip_round(H, 4); + + return H->v0 ^ H->v1 ^ H->v2 ^ H->v3; } /* sip24_final() */ - -static uint64_t siphash24(const void *src, size_t len, - const struct sipkey *key) { - struct siphash state = SIPHASH_INITIALIZER; - return sip24_final(sip24_update(sip24_init(&state, key), src, len)); +static uint64_t +siphash24(const void *src, size_t len, const struct sipkey *key) { + struct siphash state = SIPHASH_INITIALIZER; + return sip24_final(sip24_update(sip24_init(&state, key), src, len)); } /* siphash24() */ - /* * SipHash-2-4 output with * k = 00 01 02 ... @@ -285,107 +289,110 @@ static uint64_t siphash24(const void *src, size_t len, * ... * in = 00 01 02 ... 3e (63 bytes) */ -static int sip24_valid(void) { - static const unsigned char vectors[64][8] = { - { 0x31, 0x0e, 0x0e, 0xdd, 0x47, 0xdb, 0x6f, 0x72, }, - { 0xfd, 0x67, 0xdc, 0x93, 0xc5, 0x39, 0xf8, 0x74, }, - { 0x5a, 0x4f, 0xa9, 0xd9, 0x09, 0x80, 0x6c, 0x0d, }, - { 0x2d, 0x7e, 0xfb, 0xd7, 0x96, 0x66, 0x67, 0x85, }, - { 0xb7, 0x87, 0x71, 0x27, 0xe0, 0x94, 0x27, 0xcf, }, - { 0x8d, 0xa6, 0x99, 0xcd, 0x64, 0x55, 0x76, 0x18, }, - { 0xce, 0xe3, 0xfe, 0x58, 0x6e, 0x46, 0xc9, 0xcb, }, - { 0x37, 0xd1, 0x01, 0x8b, 0xf5, 0x00, 0x02, 0xab, }, - { 0x62, 0x24, 0x93, 0x9a, 0x79, 0xf5, 0xf5, 0x93, }, - { 0xb0, 0xe4, 0xa9, 0x0b, 0xdf, 0x82, 0x00, 0x9e, }, - { 0xf3, 0xb9, 0xdd, 0x94, 0xc5, 0xbb, 0x5d, 0x7a, }, - { 0xa7, 0xad, 0x6b, 0x22, 0x46, 0x2f, 0xb3, 0xf4, }, - { 0xfb, 0xe5, 0x0e, 0x86, 0xbc, 0x8f, 0x1e, 0x75, }, - { 0x90, 0x3d, 0x84, 0xc0, 0x27, 0x56, 0xea, 0x14, }, - { 0xee, 0xf2, 0x7a, 0x8e, 0x90, 0xca, 0x23, 0xf7, }, - { 0xe5, 0x45, 0xbe, 0x49, 0x61, 0xca, 0x29, 0xa1, }, - { 0xdb, 0x9b, 0xc2, 0x57, 0x7f, 0xcc, 0x2a, 0x3f, }, - { 0x94, 0x47, 0xbe, 0x2c, 0xf5, 0xe9, 0x9a, 0x69, }, - { 0x9c, 0xd3, 0x8d, 0x96, 0xf0, 0xb3, 0xc1, 0x4b, }, - { 0xbd, 0x61, 0x79, 0xa7, 0x1d, 0xc9, 0x6d, 0xbb, }, - { 0x98, 0xee, 0xa2, 0x1a, 0xf2, 0x5c, 0xd6, 0xbe, }, - { 0xc7, 0x67, 0x3b, 0x2e, 0xb0, 0xcb, 0xf2, 0xd0, }, - { 0x88, 0x3e, 0xa3, 0xe3, 0x95, 0x67, 0x53, 0x93, }, - { 0xc8, 0xce, 0x5c, 0xcd, 0x8c, 0x03, 0x0c, 0xa8, }, - { 0x94, 0xaf, 0x49, 0xf6, 0xc6, 0x50, 0xad, 0xb8, }, - { 0xea, 0xb8, 0x85, 0x8a, 0xde, 0x92, 0xe1, 0xbc, }, - { 0xf3, 0x15, 0xbb, 0x5b, 0xb8, 0x35, 0xd8, 0x17, }, - { 0xad, 0xcf, 0x6b, 0x07, 0x63, 0x61, 0x2e, 0x2f, }, - { 0xa5, 0xc9, 0x1d, 0xa7, 0xac, 0xaa, 0x4d, 0xde, }, - { 0x71, 0x65, 0x95, 0x87, 0x66, 0x50, 0xa2, 0xa6, }, - { 0x28, 0xef, 0x49, 0x5c, 0x53, 0xa3, 0x87, 0xad, }, - { 0x42, 0xc3, 0x41, 0xd8, 0xfa, 0x92, 0xd8, 0x32, }, - { 0xce, 0x7c, 0xf2, 0x72, 0x2f, 0x51, 0x27, 0x71, }, - { 0xe3, 0x78, 0x59, 0xf9, 0x46, 0x23, 0xf3, 0xa7, }, - { 0x38, 0x12, 0x05, 0xbb, 0x1a, 0xb0, 0xe0, 0x12, }, - { 0xae, 0x97, 0xa1, 0x0f, 0xd4, 0x34, 0xe0, 0x15, }, - { 0xb4, 0xa3, 0x15, 0x08, 0xbe, 0xff, 0x4d, 0x31, }, - { 0x81, 0x39, 0x62, 0x29, 0xf0, 0x90, 0x79, 0x02, }, - { 0x4d, 0x0c, 0xf4, 0x9e, 0xe5, 0xd4, 0xdc, 0xca, }, - { 0x5c, 0x73, 0x33, 0x6a, 0x76, 0xd8, 0xbf, 0x9a, }, - { 0xd0, 0xa7, 0x04, 0x53, 0x6b, 0xa9, 0x3e, 0x0e, }, - { 0x92, 0x59, 0x58, 0xfc, 0xd6, 0x42, 0x0c, 0xad, }, - { 0xa9, 0x15, 0xc2, 0x9b, 0xc8, 0x06, 0x73, 0x18, }, - { 0x95, 0x2b, 0x79, 0xf3, 0xbc, 0x0a, 0xa6, 0xd4, }, - { 0xf2, 0x1d, 0xf2, 0xe4, 0x1d, 0x45, 0x35, 0xf9, }, - { 0x87, 0x57, 0x75, 0x19, 0x04, 0x8f, 0x53, 0xa9, }, - { 0x10, 0xa5, 0x6c, 0xf5, 0xdf, 0xcd, 0x9a, 0xdb, }, - { 0xeb, 0x75, 0x09, 0x5c, 0xcd, 0x98, 0x6c, 0xd0, }, - { 0x51, 0xa9, 0xcb, 0x9e, 0xcb, 0xa3, 0x12, 0xe6, }, - { 0x96, 0xaf, 0xad, 0xfc, 0x2c, 0xe6, 0x66, 0xc7, }, - { 0x72, 0xfe, 0x52, 0x97, 0x5a, 0x43, 0x64, 0xee, }, - { 0x5a, 0x16, 0x45, 0xb2, 0x76, 0xd5, 0x92, 0xa1, }, - { 0xb2, 0x74, 0xcb, 0x8e, 0xbf, 0x87, 0x87, 0x0a, }, - { 0x6f, 0x9b, 0xb4, 0x20, 0x3d, 0xe7, 0xb3, 0x81, }, - { 0xea, 0xec, 0xb2, 0xa3, 0x0b, 0x22, 0xa8, 0x7f, }, - { 0x99, 0x24, 0xa4, 0x3c, 0xc1, 0x31, 0x57, 0x24, }, - { 0xbd, 0x83, 0x8d, 0x3a, 0xaf, 0xbf, 0x8d, 0xb7, }, - { 0x0b, 0x1a, 0x2a, 0x32, 0x65, 0xd5, 0x1a, 0xea, }, - { 0x13, 0x50, 0x79, 0xa3, 0x23, 0x1c, 0xe6, 0x60, }, - { 0x93, 0x2b, 0x28, 0x46, 0xe4, 0xd7, 0x06, 0x66, }, - { 0xe1, 0x91, 0x5f, 0x5c, 0xb1, 0xec, 0xa4, 0x6c, }, - { 0xf3, 0x25, 0x96, 0x5c, 0xa1, 0x6d, 0x62, 0x9f, }, - { 0x57, 0x5f, 0xf2, 0x8e, 0x60, 0x38, 0x1b, 0xe5, }, - { 0x72, 0x45, 0x06, 0xeb, 0x4c, 0x32, 0x8a, 0x95, } - }; - unsigned char in[64]; - struct sipkey k; - size_t i; - - sip_tokey(&k, "\000\001\002\003\004\005\006\007\010\011" - "\012\013\014\015\016\017"); - - for (i = 0; i < sizeof in; ++i) { - in[i] = (unsigned char)i; - - if (siphash24(in, i, &k) != SIP_U8TO64_LE(vectors[i])) - return 0; - } - - return 1; +static int +sip24_valid(void) { + /* clang-format off */ + static const unsigned char vectors[64][8] = { + { 0x31, 0x0e, 0x0e, 0xdd, 0x47, 0xdb, 0x6f, 0x72, }, + { 0xfd, 0x67, 0xdc, 0x93, 0xc5, 0x39, 0xf8, 0x74, }, + { 0x5a, 0x4f, 0xa9, 0xd9, 0x09, 0x80, 0x6c, 0x0d, }, + { 0x2d, 0x7e, 0xfb, 0xd7, 0x96, 0x66, 0x67, 0x85, }, + { 0xb7, 0x87, 0x71, 0x27, 0xe0, 0x94, 0x27, 0xcf, }, + { 0x8d, 0xa6, 0x99, 0xcd, 0x64, 0x55, 0x76, 0x18, }, + { 0xce, 0xe3, 0xfe, 0x58, 0x6e, 0x46, 0xc9, 0xcb, }, + { 0x37, 0xd1, 0x01, 0x8b, 0xf5, 0x00, 0x02, 0xab, }, + { 0x62, 0x24, 0x93, 0x9a, 0x79, 0xf5, 0xf5, 0x93, }, + { 0xb0, 0xe4, 0xa9, 0x0b, 0xdf, 0x82, 0x00, 0x9e, }, + { 0xf3, 0xb9, 0xdd, 0x94, 0xc5, 0xbb, 0x5d, 0x7a, }, + { 0xa7, 0xad, 0x6b, 0x22, 0x46, 0x2f, 0xb3, 0xf4, }, + { 0xfb, 0xe5, 0x0e, 0x86, 0xbc, 0x8f, 0x1e, 0x75, }, + { 0x90, 0x3d, 0x84, 0xc0, 0x27, 0x56, 0xea, 0x14, }, + { 0xee, 0xf2, 0x7a, 0x8e, 0x90, 0xca, 0x23, 0xf7, }, + { 0xe5, 0x45, 0xbe, 0x49, 0x61, 0xca, 0x29, 0xa1, }, + { 0xdb, 0x9b, 0xc2, 0x57, 0x7f, 0xcc, 0x2a, 0x3f, }, + { 0x94, 0x47, 0xbe, 0x2c, 0xf5, 0xe9, 0x9a, 0x69, }, + { 0x9c, 0xd3, 0x8d, 0x96, 0xf0, 0xb3, 0xc1, 0x4b, }, + { 0xbd, 0x61, 0x79, 0xa7, 0x1d, 0xc9, 0x6d, 0xbb, }, + { 0x98, 0xee, 0xa2, 0x1a, 0xf2, 0x5c, 0xd6, 0xbe, }, + { 0xc7, 0x67, 0x3b, 0x2e, 0xb0, 0xcb, 0xf2, 0xd0, }, + { 0x88, 0x3e, 0xa3, 0xe3, 0x95, 0x67, 0x53, 0x93, }, + { 0xc8, 0xce, 0x5c, 0xcd, 0x8c, 0x03, 0x0c, 0xa8, }, + { 0x94, 0xaf, 0x49, 0xf6, 0xc6, 0x50, 0xad, 0xb8, }, + { 0xea, 0xb8, 0x85, 0x8a, 0xde, 0x92, 0xe1, 0xbc, }, + { 0xf3, 0x15, 0xbb, 0x5b, 0xb8, 0x35, 0xd8, 0x17, }, + { 0xad, 0xcf, 0x6b, 0x07, 0x63, 0x61, 0x2e, 0x2f, }, + { 0xa5, 0xc9, 0x1d, 0xa7, 0xac, 0xaa, 0x4d, 0xde, }, + { 0x71, 0x65, 0x95, 0x87, 0x66, 0x50, 0xa2, 0xa6, }, + { 0x28, 0xef, 0x49, 0x5c, 0x53, 0xa3, 0x87, 0xad, }, + { 0x42, 0xc3, 0x41, 0xd8, 0xfa, 0x92, 0xd8, 0x32, }, + { 0xce, 0x7c, 0xf2, 0x72, 0x2f, 0x51, 0x27, 0x71, }, + { 0xe3, 0x78, 0x59, 0xf9, 0x46, 0x23, 0xf3, 0xa7, }, + { 0x38, 0x12, 0x05, 0xbb, 0x1a, 0xb0, 0xe0, 0x12, }, + { 0xae, 0x97, 0xa1, 0x0f, 0xd4, 0x34, 0xe0, 0x15, }, + { 0xb4, 0xa3, 0x15, 0x08, 0xbe, 0xff, 0x4d, 0x31, }, + { 0x81, 0x39, 0x62, 0x29, 0xf0, 0x90, 0x79, 0x02, }, + { 0x4d, 0x0c, 0xf4, 0x9e, 0xe5, 0xd4, 0xdc, 0xca, }, + { 0x5c, 0x73, 0x33, 0x6a, 0x76, 0xd8, 0xbf, 0x9a, }, + { 0xd0, 0xa7, 0x04, 0x53, 0x6b, 0xa9, 0x3e, 0x0e, }, + { 0x92, 0x59, 0x58, 0xfc, 0xd6, 0x42, 0x0c, 0xad, }, + { 0xa9, 0x15, 0xc2, 0x9b, 0xc8, 0x06, 0x73, 0x18, }, + { 0x95, 0x2b, 0x79, 0xf3, 0xbc, 0x0a, 0xa6, 0xd4, }, + { 0xf2, 0x1d, 0xf2, 0xe4, 0x1d, 0x45, 0x35, 0xf9, }, + { 0x87, 0x57, 0x75, 0x19, 0x04, 0x8f, 0x53, 0xa9, }, + { 0x10, 0xa5, 0x6c, 0xf5, 0xdf, 0xcd, 0x9a, 0xdb, }, + { 0xeb, 0x75, 0x09, 0x5c, 0xcd, 0x98, 0x6c, 0xd0, }, + { 0x51, 0xa9, 0xcb, 0x9e, 0xcb, 0xa3, 0x12, 0xe6, }, + { 0x96, 0xaf, 0xad, 0xfc, 0x2c, 0xe6, 0x66, 0xc7, }, + { 0x72, 0xfe, 0x52, 0x97, 0x5a, 0x43, 0x64, 0xee, }, + { 0x5a, 0x16, 0x45, 0xb2, 0x76, 0xd5, 0x92, 0xa1, }, + { 0xb2, 0x74, 0xcb, 0x8e, 0xbf, 0x87, 0x87, 0x0a, }, + { 0x6f, 0x9b, 0xb4, 0x20, 0x3d, 0xe7, 0xb3, 0x81, }, + { 0xea, 0xec, 0xb2, 0xa3, 0x0b, 0x22, 0xa8, 0x7f, }, + { 0x99, 0x24, 0xa4, 0x3c, 0xc1, 0x31, 0x57, 0x24, }, + { 0xbd, 0x83, 0x8d, 0x3a, 0xaf, 0xbf, 0x8d, 0xb7, }, + { 0x0b, 0x1a, 0x2a, 0x32, 0x65, 0xd5, 0x1a, 0xea, }, + { 0x13, 0x50, 0x79, 0xa3, 0x23, 0x1c, 0xe6, 0x60, }, + { 0x93, 0x2b, 0x28, 0x46, 0xe4, 0xd7, 0x06, 0x66, }, + { 0xe1, 0x91, 0x5f, 0x5c, 0xb1, 0xec, 0xa4, 0x6c, }, + { 0xf3, 0x25, 0x96, 0x5c, 0xa1, 0x6d, 0x62, 0x9f, }, + { 0x57, 0x5f, 0xf2, 0x8e, 0x60, 0x38, 0x1b, 0xe5, }, + { 0x72, 0x45, 0x06, 0xeb, 0x4c, 0x32, 0x8a, 0x95, } + }; + /* clang-format on */ + + unsigned char in[64]; + struct sipkey k; + size_t i; + + sip_tokey(&k, "\000\001\002\003\004\005\006\007\010\011" + "\012\013\014\015\016\017"); + + for (i = 0; i < sizeof in; ++i) { + in[i] = (unsigned char)i; + + if (siphash24(in, i, &k) != SIP_U8TO64_LE(vectors[i])) + return 0; + } + + return 1; } /* sip24_valid() */ - #ifdef SIPHASH_MAIN -#include +# include -int main(void) { - const int ok = sip24_valid(); +int +main(void) { + const int ok = sip24_valid(); - if (ok) - puts("OK"); - else - puts("FAIL"); + if (ok) + puts("OK"); + else + puts("FAIL"); - return !ok; + return ! ok; } /* main() */ #endif /* SIPHASH_MAIN */ - #endif /* SIPHASH_H */ diff --git a/Modules/expat/utf8tab.h b/Modules/expat/utf8tab.h index fa0bed6f5d751d..a22986acbb9526 100644 --- a/Modules/expat/utf8tab.h +++ b/Modules/expat/utf8tab.h @@ -31,34 +31,34 @@ */ /* 0x80 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x84 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x88 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x8C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x90 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x94 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x98 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x9C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xA0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xA4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xA8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xAC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xB0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xB4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xB8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xBC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xC0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xC4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xC8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xCC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xD0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xD4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xD8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xDC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xE0 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xE4 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xE8 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xEC */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xF0 */ BT_LEAD4, BT_LEAD4, BT_LEAD4, BT_LEAD4, -/* 0xF4 */ BT_LEAD4, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0xF8 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0xFC */ BT_NONXML, BT_NONXML, BT_MALFORM, BT_MALFORM, + /* 0x84 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, + /* 0x88 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, + /* 0x8C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, + /* 0x90 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, + /* 0x94 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, + /* 0x98 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, + /* 0x9C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, + /* 0xA0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, + /* 0xA4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, + /* 0xA8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, + /* 0xAC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, + /* 0xB0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, + /* 0xB4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, + /* 0xB8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, + /* 0xBC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, + /* 0xC0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, + /* 0xC4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, + /* 0xC8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, + /* 0xCC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, + /* 0xD0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, + /* 0xD4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, + /* 0xD8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, + /* 0xDC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, + /* 0xE0 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, + /* 0xE4 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, + /* 0xE8 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, + /* 0xEC */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, + /* 0xF0 */ BT_LEAD4, BT_LEAD4, BT_LEAD4, BT_LEAD4, + /* 0xF4 */ BT_LEAD4, BT_NONXML, BT_NONXML, BT_NONXML, + /* 0xF8 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, + /* 0xFC */ BT_NONXML, BT_NONXML, BT_MALFORM, BT_MALFORM, diff --git a/Modules/expat/winconfig.h b/Modules/expat/winconfig.h index 28a043c6044ca4..562a4a82dc1d63 100644 --- a/Modules/expat/winconfig.h +++ b/Modules/expat/winconfig.h @@ -40,20 +40,17 @@ #include #include +#if defined(HAVE_EXPAT_CONFIG_H) /* e.g. MinGW */ +# include +#else /* !defined(HAVE_EXPAT_CONFIG_H) */ -#if defined(HAVE_EXPAT_CONFIG_H) /* e.g. MinGW */ -# include -#else /* !defined(HAVE_EXPAT_CONFIG_H) */ - - -#define XML_NS 1 -#define XML_DTD 1 -#define XML_CONTEXT_BYTES 1024 +# define XML_NS 1 +# define XML_DTD 1 +# define XML_CONTEXT_BYTES 1024 /* we will assume all Windows platforms are little endian */ -#define BYTEORDER 1234 +# define BYTEORDER 1234 #endif /* !defined(HAVE_EXPAT_CONFIG_H) */ - #endif /* ndef WINCONFIG_H */ diff --git a/Modules/expat/xmlparse.c b/Modules/expat/xmlparse.c index 9c0987f4f6d874..e740f0e19c7d4a 100644 --- a/Modules/expat/xmlparse.c +++ b/Modules/expat/xmlparse.c @@ -1,4 +1,4 @@ -/* 69df5be70289a11fb834869ce4a91c23c1d9dd04baffcbd10e86742d149a080c (2.2.7+) +/* f2d0ab6d1d4422a08cf1cf3bbdfba96b49dea42fb5ff4615e03a2a25c306e769 (2.2.8+) __ __ _ ___\ \/ /_ __ __ _| |_ / _ \\ /| '_ \ / _` | __| @@ -30,33 +30,38 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#if !defined(_GNU_SOURCE) -# define _GNU_SOURCE 1 /* syscall prototype */ +#if ! defined(_GNU_SOURCE) +# define _GNU_SOURCE 1 /* syscall prototype */ +#endif + +#ifdef _WIN32 +/* force stdlib to define rand_s() */ +# define _CRT_RAND_S #endif #include -#include /* memset(), memcpy() */ +#include /* memset(), memcpy() */ #include -#include /* UINT_MAX */ -#include /* fprintf */ -#include /* getenv */ +#include /* UINT_MAX */ +#include /* fprintf */ +#include /* getenv, rand_s */ #ifdef _WIN32 -#define getpid GetCurrentProcessId +# define getpid GetCurrentProcessId #else -#include /* gettimeofday() */ -#include /* getpid() */ -#include /* getpid() */ -#include /* O_RDONLY */ -#include +# include /* gettimeofday() */ +# include /* getpid() */ +# include /* getpid() */ +# include /* O_RDONLY */ +# include #endif #define XML_BUILDING_EXPAT 1 #ifdef _WIN32 -#include "winconfig.h" +# include "winconfig.h" #elif defined(HAVE_EXPAT_CONFIG_H) -#include +# include #endif /* ndef _WIN32 */ #include "ascii.h" @@ -64,33 +69,31 @@ #include "siphash.h" #if defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) -# if defined(HAVE_GETRANDOM) -# include /* getrandom */ -# else -# include /* syscall */ -# include /* SYS_getrandom */ -# endif -# if ! defined(GRND_NONBLOCK) -# define GRND_NONBLOCK 0x0001 -# endif /* defined(GRND_NONBLOCK) */ -#endif /* defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) */ - -#if defined(HAVE_LIBBSD) \ +# if defined(HAVE_GETRANDOM) +# include /* getrandom */ +# else +# include /* syscall */ +# include /* SYS_getrandom */ +# endif +# if ! defined(GRND_NONBLOCK) +# define GRND_NONBLOCK 0x0001 +# endif /* defined(GRND_NONBLOCK) */ +#endif /* defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) */ + +#if defined(HAVE_LIBBSD) \ && (defined(HAVE_ARC4RANDOM_BUF) || defined(HAVE_ARC4RANDOM)) -# include +# include #endif -#if defined(_WIN32) && !defined(LOAD_LIBRARY_SEARCH_SYSTEM32) -# define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800 +#if defined(_WIN32) && ! defined(LOAD_LIBRARY_SEARCH_SYSTEM32) +# define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800 #endif -#if !defined(HAVE_GETRANDOM) && !defined(HAVE_SYSCALL_GETRANDOM) \ - && !defined(HAVE_ARC4RANDOM_BUF) && !defined(HAVE_ARC4RANDOM) \ - && !defined(XML_DEV_URANDOM) \ - && !defined(_WIN32) \ - && !defined(XML_POOR_ENTROPY) -# error \ - You do not have support for any sources of high quality entropy \ +#if ! defined(HAVE_GETRANDOM) && ! defined(HAVE_SYSCALL_GETRANDOM) \ + && ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM) \ + && ! defined(XML_DEV_URANDOM) && ! defined(_WIN32) \ + && ! defined(XML_POOR_ENTROPY) +# error You do not have support for any sources of high quality entropy \ enabled. For end user security, that is probably not what you want. \ \ Your options include: \ @@ -101,7 +104,7 @@ * libbsd (arc4random_buf): HAVE_ARC4RANDOM_BUF + HAVE_LIBBSD, \ * libbsd (arc4random): HAVE_ARC4RANDOM + HAVE_LIBBSD, \ * Linux / BSD / macOS (/dev/urandom): XML_DEV_URANDOM \ - * Windows (RtlGenRandom): _WIN32. \ + * Windows (rand_s): _WIN32. \ \ If insist on not using any of these, bypass this error by defining \ XML_POOR_ENTROPY; you have been warned. \ @@ -110,56 +113,55 @@ to the build system, please open a bug. Thank you! #endif - #ifdef XML_UNICODE -#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX -#define XmlConvert XmlUtf16Convert -#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding -#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS -#define XmlEncode XmlUtf16Encode +# define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX +# define XmlConvert XmlUtf16Convert +# define XmlGetInternalEncoding XmlGetUtf16InternalEncoding +# define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS +# define XmlEncode XmlUtf16Encode /* Using pointer subtraction to convert to integer type. */ -#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((char *)(s) - (char *)NULL) & 1)) +# define MUST_CONVERT(enc, s) \ + (! (enc)->isUtf16 || (((char *)(s) - (char *)NULL) & 1)) typedef unsigned short ICHAR; #else -#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX -#define XmlConvert XmlUtf8Convert -#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding -#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS -#define XmlEncode XmlUtf8Encode -#define MUST_CONVERT(enc, s) (!(enc)->isUtf8) +# define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX +# define XmlConvert XmlUtf8Convert +# define XmlGetInternalEncoding XmlGetUtf8InternalEncoding +# define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS +# define XmlEncode XmlUtf8Encode +# define MUST_CONVERT(enc, s) (! (enc)->isUtf8) typedef char ICHAR; #endif - #ifndef XML_NS -#define XmlInitEncodingNS XmlInitEncoding -#define XmlInitUnknownEncodingNS XmlInitUnknownEncoding -#undef XmlGetInternalEncodingNS -#define XmlGetInternalEncodingNS XmlGetInternalEncoding -#define XmlParseXmlDeclNS XmlParseXmlDecl +# define XmlInitEncodingNS XmlInitEncoding +# define XmlInitUnknownEncodingNS XmlInitUnknownEncoding +# undef XmlGetInternalEncodingNS +# define XmlGetInternalEncodingNS XmlGetInternalEncoding +# define XmlParseXmlDeclNS XmlParseXmlDecl #endif #ifdef XML_UNICODE -#ifdef XML_UNICODE_WCHAR_T -#define XML_T(x) (const wchar_t)x -#define XML_L(x) L ## x -#else -#define XML_T(x) (const unsigned short)x -#define XML_L(x) x -#endif +# ifdef XML_UNICODE_WCHAR_T +# define XML_T(x) (const wchar_t) x +# define XML_L(x) L##x +# else +# define XML_T(x) (const unsigned short)x +# define XML_L(x) x +# endif #else -#define XML_T(x) x -#define XML_L(x) x +# define XML_T(x) x +# define XML_L(x) x #endif /* Round up n to be a multiple of sz, where sz is a power of 2. */ -#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1)) +#define ROUND_UP(n, sz) (((n) + ((sz)-1)) & ~((sz)-1)) /* Do safe (NULL-aware) pointer arithmetic */ #define EXPAT_SAFE_PTR_DIFF(p, q) (((p) && (q)) ? ((p) - (q)) : 0) @@ -182,11 +184,9 @@ typedef struct { const XML_Memory_Handling_Suite *mem; } HASH_TABLE; -static size_t -keylen(KEY s); +static size_t keylen(KEY s); -static void -copy_salt_to_sipkey(XML_Parser parser, struct sipkey * key); +static void copy_salt_to_sipkey(XML_Parser parser, struct sipkey *key); /* For probing (after a collision) we need a step size relative prime to the hash table size, which is a power of 2. We use double-hashing, @@ -196,9 +196,9 @@ copy_salt_to_sipkey(XML_Parser parser, struct sipkey * key); We limit the maximum step size to table->size / 4 (mask >> 2) and make it odd, since odd numbers are always relative prime to a power of 2. */ -#define SECOND_HASH(hash, mask, power) \ - ((((hash) & ~(mask)) >> ((power) - 1)) & ((mask) >> 2)) -#define PROBE_STEP(hash, mask, power) \ +#define SECOND_HASH(hash, mask, power) \ + ((((hash) & ~(mask)) >> ((power)-1)) & ((mask) >> 2)) +#define PROBE_STEP(hash, mask, power) \ ((unsigned char)((SECOND_HASH(hash, mask, power)) | 1)) typedef struct { @@ -206,7 +206,7 @@ typedef struct { NAMED **end; } HASH_TABLE_ITER; -#define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */ +#define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */ #define INIT_DATA_BUF_SIZE 1024 #define INIT_ATTS_SIZE 16 #define INIT_ATTS_VERSION 0xFFFFFFFF @@ -253,20 +253,20 @@ typedef struct { TAG objects in a free list. */ typedef struct tag { - struct tag *parent; /* parent of this element */ - const char *rawName; /* tagName in the original encoding */ + struct tag *parent; /* parent of this element */ + const char *rawName; /* tagName in the original encoding */ int rawNameLength; - TAG_NAME name; /* tagName in the API encoding */ - char *buf; /* buffer for name components */ - char *bufEnd; /* end of the buffer */ + TAG_NAME name; /* tagName in the API encoding */ + char *buf; /* buffer for name components */ + char *bufEnd; /* end of the buffer */ BINDING *bindings; } TAG; typedef struct { const XML_Char *name; const XML_Char *textPtr; - int textLen; /* length in XML_Chars */ - int processed; /* # of processed bytes - when suspended */ + int textLen; /* length in XML_Chars */ + int processed; /* # of processed bytes - when suspended */ const XML_Char *systemId; const XML_Char *base; const XML_Char *publicId; @@ -277,13 +277,13 @@ typedef struct { } ENTITY; typedef struct { - enum XML_Content_Type type; - enum XML_Content_Quant quant; - const XML_Char * name; - int firstchild; - int lastchild; - int childcnt; - int nextsib; + enum XML_Content_Type type; + enum XML_Content_Quant quant; + const XML_Char *name; + int firstchild; + int lastchild; + int childcnt; + int nextsib; } CONTENT_SCAFFOLD; #define INIT_SCAFFOLD_ELEMENTS 32 @@ -371,10 +371,8 @@ typedef struct open_internal_entity { XML_Bool betweenDecl; /* WFC: PE Between Declarations */ } OPEN_INTERNAL_ENTITY; -typedef enum XML_Error PTRCALL Processor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr); +typedef enum XML_Error PTRCALL Processor(XML_Parser parser, const char *start, + const char *end, const char **endPtr); static Processor prologProcessor; static Processor prologInitProcessor; @@ -395,118 +393,101 @@ static Processor externalEntityInitProcessor3; static Processor externalEntityContentProcessor; static Processor internalEntityProcessor; -static enum XML_Error -handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName); -static enum XML_Error -processXmlDecl(XML_Parser parser, int isGeneralTextEntity, - const char *s, const char *next); -static enum XML_Error -initializeEncoding(XML_Parser parser); -static enum XML_Error -doProlog(XML_Parser parser, const ENCODING *enc, const char *s, - const char *end, int tok, const char *next, const char **nextPtr, - XML_Bool haveMore); -static enum XML_Error -processInternalEntity(XML_Parser parser, ENTITY *entity, - XML_Bool betweenDecl); -static enum XML_Error -doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, - const char *start, const char *end, const char **endPtr, - XML_Bool haveMore); -static enum XML_Error -doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, - const char *end, const char **nextPtr, XML_Bool haveMore); +static enum XML_Error handleUnknownEncoding(XML_Parser parser, + const XML_Char *encodingName); +static enum XML_Error processXmlDecl(XML_Parser parser, int isGeneralTextEntity, + const char *s, const char *next); +static enum XML_Error initializeEncoding(XML_Parser parser); +static enum XML_Error doProlog(XML_Parser parser, const ENCODING *enc, + const char *s, const char *end, int tok, + const char *next, const char **nextPtr, + XML_Bool haveMore, XML_Bool allowClosingDoctype); +static enum XML_Error processInternalEntity(XML_Parser parser, ENTITY *entity, + XML_Bool betweenDecl); +static enum XML_Error doContent(XML_Parser parser, int startTagLevel, + const ENCODING *enc, const char *start, + const char *end, const char **endPtr, + XML_Bool haveMore); +static enum XML_Error doCdataSection(XML_Parser parser, const ENCODING *, + const char **startPtr, const char *end, + const char **nextPtr, XML_Bool haveMore); #ifdef XML_DTD -static enum XML_Error -doIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr, - const char *end, const char **nextPtr, XML_Bool haveMore); +static enum XML_Error doIgnoreSection(XML_Parser parser, const ENCODING *, + const char **startPtr, const char *end, + const char **nextPtr, XML_Bool haveMore); #endif /* XML_DTD */ -static void -freeBindings(XML_Parser parser, BINDING *bindings); -static enum XML_Error -storeAtts(XML_Parser parser, const ENCODING *, const char *s, - TAG_NAME *tagNamePtr, BINDING **bindingsPtr); -static enum XML_Error -addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, - const XML_Char *uri, BINDING **bindingsPtr); -static int -defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata, - XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser); -static enum XML_Error -storeAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, - const char *, const char *, STRING_POOL *); -static enum XML_Error -appendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, - const char *, const char *, STRING_POOL *); -static ATTRIBUTE_ID * -getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); -static int -setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *); -static enum XML_Error -storeEntityValue(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); -static int -reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end); -static int -reportComment(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); -static void -reportDefault(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); - -static const XML_Char * getContext(XML_Parser parser); -static XML_Bool -setContext(XML_Parser parser, const XML_Char *context); +static void freeBindings(XML_Parser parser, BINDING *bindings); +static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *, + const char *s, TAG_NAME *tagNamePtr, + BINDING **bindingsPtr); +static enum XML_Error addBinding(XML_Parser parser, PREFIX *prefix, + const ATTRIBUTE_ID *attId, const XML_Char *uri, + BINDING **bindingsPtr); +static int defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata, + XML_Bool isId, const XML_Char *dfltValue, + XML_Parser parser); +static enum XML_Error storeAttributeValue(XML_Parser parser, const ENCODING *, + XML_Bool isCdata, const char *, + const char *, STRING_POOL *); +static enum XML_Error appendAttributeValue(XML_Parser parser, const ENCODING *, + XML_Bool isCdata, const char *, + const char *, STRING_POOL *); +static ATTRIBUTE_ID *getAttributeId(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end); +static int setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *); +static enum XML_Error storeEntityValue(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end); +static int reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end); +static int reportComment(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end); +static void reportDefault(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end); + +static const XML_Char *getContext(XML_Parser parser); +static XML_Bool setContext(XML_Parser parser, const XML_Char *context); static void FASTCALL normalizePublicId(XML_Char *s); -static DTD * dtdCreate(const XML_Memory_Handling_Suite *ms); +static DTD *dtdCreate(const XML_Memory_Handling_Suite *ms); /* do not call if m_parentParser != NULL */ static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms); -static void -dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms); -static int -dtdCopy(XML_Parser oldParser, - DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms); -static int -copyEntityTable(XML_Parser oldParser, - HASH_TABLE *, STRING_POOL *, const HASH_TABLE *); -static NAMED * -lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize); -static void FASTCALL -hashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms); +static void dtdDestroy(DTD *p, XML_Bool isDocEntity, + const XML_Memory_Handling_Suite *ms); +static int dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, + const XML_Memory_Handling_Suite *ms); +static int copyEntityTable(XML_Parser oldParser, HASH_TABLE *, STRING_POOL *, + const HASH_TABLE *); +static NAMED *lookup(XML_Parser parser, HASH_TABLE *table, KEY name, + size_t createSize); +static void FASTCALL hashTableInit(HASH_TABLE *, + const XML_Memory_Handling_Suite *ms); static void FASTCALL hashTableClear(HASH_TABLE *); static void FASTCALL hashTableDestroy(HASH_TABLE *); -static void FASTCALL -hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *); -static NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *); +static void FASTCALL hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *); +static NAMED *FASTCALL hashTableIterNext(HASH_TABLE_ITER *); -static void FASTCALL -poolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms); +static void FASTCALL poolInit(STRING_POOL *, + const XML_Memory_Handling_Suite *ms); static void FASTCALL poolClear(STRING_POOL *); static void FASTCALL poolDestroy(STRING_POOL *); -static XML_Char * -poolAppend(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end); -static XML_Char * -poolStoreString(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end); +static XML_Char *poolAppend(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end); +static XML_Char *poolStoreString(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end); static XML_Bool FASTCALL poolGrow(STRING_POOL *pool); -static const XML_Char * FASTCALL -poolCopyString(STRING_POOL *pool, const XML_Char *s); -static const XML_Char * -poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n); -static const XML_Char * FASTCALL -poolAppendString(STRING_POOL *pool, const XML_Char *s); +static const XML_Char *FASTCALL poolCopyString(STRING_POOL *pool, + const XML_Char *s); +static const XML_Char *poolCopyStringN(STRING_POOL *pool, const XML_Char *s, + int n); +static const XML_Char *FASTCALL poolAppendString(STRING_POOL *pool, + const XML_Char *s); static int FASTCALL nextScaffoldPart(XML_Parser parser); -static XML_Content * build_model(XML_Parser parser); -static ELEMENT_TYPE * -getElementType(XML_Parser parser, const ENCODING *enc, - const char *ptr, const char *end); +static XML_Content *build_model(XML_Parser parser); +static ELEMENT_TYPE *getElementType(XML_Parser parser, const ENCODING *enc, + const char *ptr, const char *end); static XML_Char *copyString(const XML_Char *s, const XML_Memory_Handling_Suite *memsuite); @@ -514,14 +495,11 @@ static XML_Char *copyString(const XML_Char *s, static unsigned long generate_hash_secret_salt(XML_Parser parser); static XML_Bool startParsing(XML_Parser parser); -static XML_Parser -parserCreate(const XML_Char *encodingName, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *nameSep, - DTD *dtd); +static XML_Parser parserCreate(const XML_Char *encodingName, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *nameSep, DTD *dtd); -static void -parserInit(XML_Parser parser, const XML_Char *encodingName); +static void parserInit(XML_Parser parser, const XML_Char *encodingName); #define poolStart(pool) ((pool)->start) #define poolEnd(pool) ((pool)->ptr) @@ -530,10 +508,10 @@ parserInit(XML_Parser parser, const XML_Char *encodingName); #define poolLastChar(pool) (((pool)->ptr)[-1]) #define poolDiscard(pool) ((pool)->ptr = (pool)->start) #define poolFinish(pool) ((pool)->start = (pool)->ptr) -#define poolAppendChar(pool, c) \ - (((pool)->ptr == (pool)->end && !poolGrow(pool)) \ - ? 0 \ - : ((*((pool)->ptr)++ = c), 1)) +#define poolAppendChar(pool, c) \ + (((pool)->ptr == (pool)->end && ! poolGrow(pool)) \ + ? 0 \ + : ((*((pool)->ptr)++ = c), 1)) struct XML_ParserStruct { /* The first member must be m_userData so that the XML_GetUserData @@ -584,7 +562,7 @@ struct XML_ParserStruct { void *m_unknownEncodingMem; void *m_unknownEncodingData; void *m_unknownEncodingHandlerData; - void (XMLCALL *m_unknownEncodingRelease)(void *); + void(XMLCALL *m_unknownEncodingRelease)(void *); PROLOG_STATE m_prologState; Processor *m_processor; enum XML_Error m_errorCode; @@ -638,57 +616,55 @@ struct XML_ParserStruct { unsigned long m_hash_secret_salt; }; -#define MALLOC(parser, s) (parser->m_mem.malloc_fcn((s))) -#define REALLOC(parser, p, s) (parser->m_mem.realloc_fcn((p),(s))) -#define FREE(parser, p) (parser->m_mem.free_fcn((p))) - +#define MALLOC(parser, s) (parser->m_mem.malloc_fcn((s))) +#define REALLOC(parser, p, s) (parser->m_mem.realloc_fcn((p), (s))) +#define FREE(parser, p) (parser->m_mem.free_fcn((p))) XML_Parser XMLCALL -XML_ParserCreate(const XML_Char *encodingName) -{ +XML_ParserCreate(const XML_Char *encodingName) { return XML_ParserCreate_MM(encodingName, NULL, NULL); } XML_Parser XMLCALL -XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) -{ +XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) { XML_Char tmp[2]; *tmp = nsSep; return XML_ParserCreate_MM(encodingName, NULL, tmp); } -static const XML_Char implicitContext[] = { - ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h, ASCII_t, ASCII_t, ASCII_p, - ASCII_COLON, ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, - ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, ASCII_g, - ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, ASCII_SLASH, ASCII_1, ASCII_9, - ASCII_9, ASCII_8, ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e, - ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, '\0' -}; - +static const XML_Char implicitContext[] + = {ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h, + ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, + ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, + ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, + ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, + ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, ASCII_8, + ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e, + ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, + '\0'}; /* To avoid warnings about unused functions: */ #if ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM) -#if defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) +# if defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) /* Obtain entropy on Linux 3.17+ */ static int -writeRandomBytes_getrandom_nonblock(void * target, size_t count) { - int success = 0; /* full count bytes written? */ +writeRandomBytes_getrandom_nonblock(void *target, size_t count) { + int success = 0; /* full count bytes written? */ size_t bytesWrittenTotal = 0; const unsigned int getrandomFlags = GRND_NONBLOCK; do { - void * const currentTarget = (void*)((char*)target + bytesWrittenTotal); + void *const currentTarget = (void *)((char *)target + bytesWrittenTotal); const size_t bytesToWrite = count - bytesWrittenTotal; const int bytesWrittenMore = -#if defined(HAVE_GETRANDOM) +# if defined(HAVE_GETRANDOM) getrandom(currentTarget, bytesToWrite, getrandomFlags); -#else +# else syscall(SYS_getrandom, currentTarget, bytesToWrite, getrandomFlags); -#endif +# endif if (bytesWrittenMore > 0) { bytesWrittenTotal += bytesWrittenMore; @@ -700,15 +676,14 @@ writeRandomBytes_getrandom_nonblock(void * target, size_t count) { return success; } -#endif /* defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) */ - +# endif /* defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) */ -#if ! defined(_WIN32) && defined(XML_DEV_URANDOM) +# if ! defined(_WIN32) && defined(XML_DEV_URANDOM) /* Extract entropy from /dev/urandom */ static int -writeRandomBytes_dev_urandom(void * target, size_t count) { - int success = 0; /* full count bytes written? */ +writeRandomBytes_dev_urandom(void *target, size_t count) { + int success = 0; /* full count bytes written? */ size_t bytesWrittenTotal = 0; const int fd = open("/dev/urandom", O_RDONLY); @@ -717,7 +692,7 @@ writeRandomBytes_dev_urandom(void * target, size_t count) { } do { - void * const currentTarget = (void*)((char*)target + bytesWrittenTotal); + void *const currentTarget = (void *)((char *)target + bytesWrittenTotal); const size_t bytesToWrite = count - bytesWrittenTotal; const ssize_t bytesWrittenMore = read(fd, currentTarget, bytesToWrite); @@ -733,15 +708,14 @@ writeRandomBytes_dev_urandom(void * target, size_t count) { return success; } -#endif /* ! defined(_WIN32) && defined(XML_DEV_URANDOM) */ - -#endif /* ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM) */ +# endif /* ! defined(_WIN32) && defined(XML_DEV_URANDOM) */ +#endif /* ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM) */ #if defined(HAVE_ARC4RANDOM) && ! defined(HAVE_ARC4RANDOM_BUF) static void -writeRandomBytes_arc4random(void * target, size_t count) { +writeRandomBytes_arc4random(void *target, size_t count) { size_t bytesWrittenTotal = 0; while (bytesWrittenTotal < count) { @@ -749,93 +723,82 @@ writeRandomBytes_arc4random(void * target, size_t count) { size_t i = 0; for (; (i < sizeof(random32)) && (bytesWrittenTotal < count); - i++, bytesWrittenTotal++) { + i++, bytesWrittenTotal++) { const uint8_t random8 = (uint8_t)(random32 >> (i * 8)); ((uint8_t *)target)[bytesWrittenTotal] = random8; } } } -#endif /* defined(HAVE_ARC4RANDOM) && ! defined(HAVE_ARC4RANDOM_BUF) */ - +#endif /* defined(HAVE_ARC4RANDOM) && ! defined(HAVE_ARC4RANDOM_BUF) */ #ifdef _WIN32 -typedef BOOLEAN (APIENTRY *RTLGENRANDOM_FUNC)(PVOID, ULONG); -HMODULE _Expat_LoadLibrary(LPCTSTR filename); /* see loadlibrary.c */ - -/* Obtain entropy on Windows XP / Windows Server 2003 and later. - * Hint on RtlGenRandom and the following article from libsodium. - * - * Michael Howard: Cryptographically Secure Random number on Windows without using CryptoAPI - * https://blogs.msdn.microsoft.com/michael_howard/2005/01/14/cryptographically-secure-random-number-on-windows-without-using-cryptoapi/ +/* Obtain entropy on Windows using the rand_s() function which + * generates cryptographically secure random numbers. Internally it + * uses RtlGenRandom API which is present in Windows XP and later. */ static int -writeRandomBytes_RtlGenRandom(void * target, size_t count) { - int success = 0; /* full count bytes written? */ - const HMODULE advapi32 = _Expat_LoadLibrary(TEXT("ADVAPI32.DLL")); - - if (advapi32) { - const RTLGENRANDOM_FUNC RtlGenRandom - = (RTLGENRANDOM_FUNC)GetProcAddress(advapi32, "SystemFunction036"); - if (RtlGenRandom) { - if (RtlGenRandom((PVOID)target, (ULONG)count) == TRUE) { - success = 1; - } +writeRandomBytes_rand_s(void *target, size_t count) { + size_t bytesWrittenTotal = 0; + + while (bytesWrittenTotal < count) { + unsigned int random32 = 0; + size_t i = 0; + + if (rand_s(&random32)) + return 0; /* failure */ + + for (; (i < sizeof(random32)) && (bytesWrittenTotal < count); + i++, bytesWrittenTotal++) { + const uint8_t random8 = (uint8_t)(random32 >> (i * 8)); + ((uint8_t *)target)[bytesWrittenTotal] = random8; } - FreeLibrary(advapi32); } - - return success; + return 1; /* success */ } #endif /* _WIN32 */ - #if ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM) static unsigned long -gather_time_entropy(void) -{ -#ifdef _WIN32 +gather_time_entropy(void) { +# ifdef _WIN32 FILETIME ft; GetSystemTimeAsFileTime(&ft); /* never fails */ return ft.dwHighDateTime ^ ft.dwLowDateTime; -#else +# else struct timeval tv; int gettimeofday_res; gettimeofday_res = gettimeofday(&tv, NULL); -#if defined(NDEBUG) +# if defined(NDEBUG) (void)gettimeofday_res; -#else - assert (gettimeofday_res == 0); -#endif /* defined(NDEBUG) */ +# else + assert(gettimeofday_res == 0); +# endif /* defined(NDEBUG) */ /* Microseconds time is <20 bits entropy */ return tv.tv_usec; -#endif +# endif } -#endif /* ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM) */ - +#endif /* ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM) */ static unsigned long -ENTROPY_DEBUG(const char * label, unsigned long entropy) { - const char * const EXPAT_ENTROPY_DEBUG = getenv("EXPAT_ENTROPY_DEBUG"); +ENTROPY_DEBUG(const char *label, unsigned long entropy) { + const char *const EXPAT_ENTROPY_DEBUG = getenv("EXPAT_ENTROPY_DEBUG"); if (EXPAT_ENTROPY_DEBUG && ! strcmp(EXPAT_ENTROPY_DEBUG, "1")) { - fprintf(stderr, "Entropy: %s --> 0x%0*lx (%lu bytes)\n", - label, - (int)sizeof(entropy) * 2, entropy, - (unsigned long)sizeof(entropy)); + fprintf(stderr, "Entropy: %s --> 0x%0*lx (%lu bytes)\n", label, + (int)sizeof(entropy) * 2, entropy, (unsigned long)sizeof(entropy)); } return entropy; } static unsigned long -generate_hash_secret_salt(XML_Parser parser) -{ +generate_hash_secret_salt(XML_Parser parser) { unsigned long entropy; (void)parser; @@ -848,20 +811,20 @@ generate_hash_secret_salt(XML_Parser parser) return ENTROPY_DEBUG("arc4random", entropy); #else /* Try high quality providers first .. */ -#ifdef _WIN32 - if (writeRandomBytes_RtlGenRandom((void *)&entropy, sizeof(entropy))) { - return ENTROPY_DEBUG("RtlGenRandom", entropy); +# ifdef _WIN32 + if (writeRandomBytes_rand_s((void *)&entropy, sizeof(entropy))) { + return ENTROPY_DEBUG("rand_s", entropy); } -#elif defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) +# elif defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) if (writeRandomBytes_getrandom_nonblock((void *)&entropy, sizeof(entropy))) { return ENTROPY_DEBUG("getrandom", entropy); } -#endif -#if ! defined(_WIN32) && defined(XML_DEV_URANDOM) +# endif +# if ! defined(_WIN32) && defined(XML_DEV_URANDOM) if (writeRandomBytes_dev_urandom((void *)&entropy, sizeof(entropy))) { return ENTROPY_DEBUG("/dev/urandom", entropy); } -#endif /* ! defined(_WIN32) && defined(XML_DEV_URANDOM) */ +# endif /* ! defined(_WIN32) && defined(XML_DEV_URANDOM) */ /* .. and self-made low quality for backup: */ /* Process ID is 0 bits entropy if attacker has local access */ @@ -872,7 +835,7 @@ generate_hash_secret_salt(XML_Parser parser) return ENTROPY_DEBUG("fallback(4)", entropy * 2147483647); } else { return ENTROPY_DEBUG("fallback(8)", - entropy * (unsigned long)2305843009213693951ULL); + entropy * (unsigned long)2305843009213693951ULL); } #endif } @@ -884,49 +847,43 @@ get_hash_secret_salt(XML_Parser parser) { return parser->m_hash_secret_salt; } -static XML_Bool /* only valid for root parser */ -startParsing(XML_Parser parser) -{ - /* hash functions must be initialized before setContext() is called */ - if (parser->m_hash_secret_salt == 0) - parser->m_hash_secret_salt = generate_hash_secret_salt(parser); - if (parser->m_ns) { - /* implicit context only set for root parser, since child - parsers (i.e. external entity parsers) will inherit it - */ - return setContext(parser, implicitContext); - } - return XML_TRUE; +static XML_Bool /* only valid for root parser */ +startParsing(XML_Parser parser) { + /* hash functions must be initialized before setContext() is called */ + if (parser->m_hash_secret_salt == 0) + parser->m_hash_secret_salt = generate_hash_secret_salt(parser); + if (parser->m_ns) { + /* implicit context only set for root parser, since child + parsers (i.e. external entity parsers) will inherit it + */ + return setContext(parser, implicitContext); + } + return XML_TRUE; } XML_Parser XMLCALL XML_ParserCreate_MM(const XML_Char *encodingName, const XML_Memory_Handling_Suite *memsuite, - const XML_Char *nameSep) -{ + const XML_Char *nameSep) { return parserCreate(encodingName, memsuite, nameSep, NULL); } static XML_Parser parserCreate(const XML_Char *encodingName, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *nameSep, - DTD *dtd) -{ + const XML_Memory_Handling_Suite *memsuite, const XML_Char *nameSep, + DTD *dtd) { XML_Parser parser; if (memsuite) { XML_Memory_Handling_Suite *mtemp; - parser = (XML_Parser) - memsuite->malloc_fcn(sizeof(struct XML_ParserStruct)); + parser = (XML_Parser)memsuite->malloc_fcn(sizeof(struct XML_ParserStruct)); if (parser != NULL) { mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); mtemp->malloc_fcn = memsuite->malloc_fcn; mtemp->realloc_fcn = memsuite->realloc_fcn; mtemp->free_fcn = memsuite->free_fcn; } - } - else { + } else { XML_Memory_Handling_Suite *mtemp; parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct)); if (parser != NULL) { @@ -937,27 +894,30 @@ parserCreate(const XML_Char *encodingName, } } - if (!parser) + if (! parser) return parser; parser->m_buffer = NULL; parser->m_bufferLim = NULL; parser->m_attsSize = INIT_ATTS_SIZE; - parser->m_atts = (ATTRIBUTE *)MALLOC(parser, parser->m_attsSize * sizeof(ATTRIBUTE)); + parser->m_atts + = (ATTRIBUTE *)MALLOC(parser, parser->m_attsSize * sizeof(ATTRIBUTE)); if (parser->m_atts == NULL) { FREE(parser, parser); return NULL; } #ifdef XML_ATTR_INFO - parser->m_attInfo = (XML_AttrInfo*)MALLOC(parser, parser->m_attsSize * sizeof(XML_AttrInfo)); + parser->m_attInfo = (XML_AttrInfo *)MALLOC( + parser, parser->m_attsSize * sizeof(XML_AttrInfo)); if (parser->m_attInfo == NULL) { FREE(parser, parser->m_atts); FREE(parser, parser); return NULL; } #endif - parser->m_dataBuf = (XML_Char *)MALLOC(parser, INIT_DATA_BUF_SIZE * sizeof(XML_Char)); + parser->m_dataBuf + = (XML_Char *)MALLOC(parser, INIT_DATA_BUF_SIZE * sizeof(XML_Char)); if (parser->m_dataBuf == NULL) { FREE(parser, parser->m_atts); #ifdef XML_ATTR_INFO @@ -1007,7 +967,7 @@ parserCreate(const XML_Char *encodingName, poolInit(&parser->m_temp2Pool, &(parser->m_mem)); parserInit(parser, encodingName); - if (encodingName && !parser->m_protocolEncodingName) { + if (encodingName && ! parser->m_protocolEncodingName) { XML_ParserFree(parser); return NULL; } @@ -1016,8 +976,7 @@ parserCreate(const XML_Char *encodingName, parser->m_ns = XML_TRUE; parser->m_internalEncoding = XmlGetInternalEncodingNS(); parser->m_namespaceSeparator = *nameSep; - } - else { + } else { parser->m_internalEncoding = XmlGetInternalEncoding(); } @@ -1025,8 +984,7 @@ parserCreate(const XML_Char *encodingName, } static void -parserInit(XML_Parser parser, const XML_Char *encodingName) -{ +parserInit(XML_Parser parser, const XML_Char *encodingName) { parser->m_processor = prologInitProcessor; XmlPrologStateInit(&parser->m_prologState); if (encodingName != NULL) { @@ -1099,8 +1057,7 @@ parserInit(XML_Parser parser, const XML_Char *encodingName) /* moves list of bindings to m_freeBindingList */ static void FASTCALL -moveToFreeBindingList(XML_Parser parser, BINDING *bindings) -{ +moveToFreeBindingList(XML_Parser parser, BINDING *bindings) { while (bindings) { BINDING *b = bindings; bindings = bindings->nextTagBinding; @@ -1110,13 +1067,12 @@ moveToFreeBindingList(XML_Parser parser, BINDING *bindings) } XML_Bool XMLCALL -XML_ParserReset(XML_Parser parser, const XML_Char *encodingName) -{ +XML_ParserReset(XML_Parser parser, const XML_Char *encodingName) { TAG *tStk; OPEN_INTERNAL_ENTITY *openEntityList; if (parser == NULL) - return XML_FALSE; + return XML_FALSE; if (parser->m_parentParser) return XML_FALSE; @@ -1152,15 +1108,15 @@ XML_ParserReset(XML_Parser parser, const XML_Char *encodingName) } enum XML_Status XMLCALL -XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) -{ +XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) { if (parser == NULL) - return XML_STATUS_ERROR; + return XML_STATUS_ERROR; /* Block after XML_Parse()/XML_ParseBuffer() has been called. XXX There's no way for the caller to determine which of the XXX possible error cases caused the XML_STATUS_ERROR return. */ - if (parser->m_parsingStatus.parsing == XML_PARSING || parser->m_parsingStatus.parsing == XML_SUSPENDED) + if (parser->m_parsingStatus.parsing == XML_PARSING + || parser->m_parsingStatus.parsing == XML_SUSPENDED) return XML_STATUS_ERROR; /* Get rid of any previous encoding name */ @@ -1172,17 +1128,15 @@ XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) else { /* Copy the new encoding name into allocated memory */ parser->m_protocolEncodingName = copyString(encodingName, &(parser->m_mem)); - if (!parser->m_protocolEncodingName) + if (! parser->m_protocolEncodingName) return XML_STATUS_ERROR; } return XML_STATUS_OK; } XML_Parser XMLCALL -XML_ExternalEntityParserCreate(XML_Parser oldParser, - const XML_Char *context, - const XML_Char *encodingName) -{ +XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context, + const XML_Char *encodingName) { XML_Parser parser = oldParser; DTD *newDtd = NULL; DTD *oldDtd; @@ -1206,7 +1160,7 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, XML_AttlistDeclHandler oldAttlistDeclHandler; XML_EntityDeclHandler oldEntityDeclHandler; XML_XmlDeclHandler oldXmlDeclHandler; - ELEMENT_TYPE * oldDeclElementType; + ELEMENT_TYPE *oldDeclElementType; void *oldUserData; void *oldHandlerArg; @@ -1269,7 +1223,7 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, oldhash_secret_salt = parser->m_hash_secret_salt; #ifdef XML_DTD - if (!context) + if (! context) newDtd = oldDtd; #endif /* XML_DTD */ @@ -1282,12 +1236,11 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, XML_Char tmp[2]; *tmp = parser->m_namespaceSeparator; parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd); - } - else { + } else { parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd); } - if (!parser) + if (! parser) return NULL; parser->m_startElementHandler = oldStartElementHandler; @@ -1327,21 +1280,20 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, parser->m_prologState.inEntityValue = oldInEntityValue; if (context) { #endif /* XML_DTD */ - if (!dtdCopy(oldParser, parser->m_dtd, oldDtd, &parser->m_mem) - || !setContext(parser, context)) { + if (! dtdCopy(oldParser, parser->m_dtd, oldDtd, &parser->m_mem) + || ! setContext(parser, context)) { XML_ParserFree(parser); return NULL; } parser->m_processor = externalEntityInitProcessor; #ifdef XML_DTD - } - else { - /* The DTD instance referenced by parser->m_dtd is shared between the document's - root parser and external PE parsers, therefore one does not need to - call setContext. In addition, one also *must* not call setContext, - because this would overwrite existing prefix->binding pointers in - parser->m_dtd with ones that get destroyed with the external PE parser. - This would leave those prefixes with dangling pointers. + } else { + /* The DTD instance referenced by parser->m_dtd is shared between the + document's root parser and external PE parsers, therefore one does not + need to call setContext. In addition, one also *must* not call + setContext, because this would overwrite existing prefix->binding + pointers in parser->m_dtd with ones that get destroyed with the external + PE parser. This would leave those prefixes with dangling pointers. */ parser->m_isParamEntity = XML_TRUE; XmlPrologStateInitExternalEntity(&parser->m_prologState); @@ -1352,11 +1304,10 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, } static void FASTCALL -destroyBindings(BINDING *bindings, XML_Parser parser) -{ +destroyBindings(BINDING *bindings, XML_Parser parser) { for (;;) { BINDING *b = bindings; - if (!b) + if (! b) break; bindings = b->nextTagBinding; FREE(parser, b->uri); @@ -1365,8 +1316,7 @@ destroyBindings(BINDING *bindings, XML_Parser parser) } void XMLCALL -XML_ParserFree(XML_Parser parser) -{ +XML_ParserFree(XML_Parser parser) { TAG *tagList; OPEN_INTERNAL_ENTITY *entityList; if (parser == NULL) @@ -1411,11 +1361,12 @@ XML_ParserFree(XML_Parser parser) /* external parameter entity parsers share the DTD structure parser->m_dtd with the root parser, so we must not destroy it */ - if (!parser->m_isParamEntity && parser->m_dtd) + if (! parser->m_isParamEntity && parser->m_dtd) #else if (parser->m_dtd) #endif /* XML_DTD */ - dtdDestroy(parser->m_dtd, (XML_Bool)!parser->m_parentParser, &parser->m_mem); + dtdDestroy(parser->m_dtd, (XML_Bool)! parser->m_parentParser, + &parser->m_mem); FREE(parser, (void *)parser->m_atts); #ifdef XML_ATTR_INFO FREE(parser, (void *)parser->m_attInfo); @@ -1431,20 +1382,19 @@ XML_ParserFree(XML_Parser parser) } void XMLCALL -XML_UseParserAsHandlerArg(XML_Parser parser) -{ +XML_UseParserAsHandlerArg(XML_Parser parser) { if (parser != NULL) parser->m_handlerArg = parser; } enum XML_Error XMLCALL -XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD) -{ +XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD) { if (parser == NULL) return XML_ERROR_INVALID_ARGUMENT; #ifdef XML_DTD /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (parser->m_parsingStatus.parsing == XML_PARSING || parser->m_parsingStatus.parsing == XML_SUSPENDED) + if (parser->m_parsingStatus.parsing == XML_PARSING + || parser->m_parsingStatus.parsing == XML_SUSPENDED) return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING; parser->m_useForeignDTD = useDTD; return XML_ERROR_NONE; @@ -1454,19 +1404,18 @@ XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD) } void XMLCALL -XML_SetReturnNSTriplet(XML_Parser parser, int do_nst) -{ +XML_SetReturnNSTriplet(XML_Parser parser, int do_nst) { if (parser == NULL) return; /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (parser->m_parsingStatus.parsing == XML_PARSING || parser->m_parsingStatus.parsing == XML_SUSPENDED) + if (parser->m_parsingStatus.parsing == XML_PARSING + || parser->m_parsingStatus.parsing == XML_SUSPENDED) return; parser->m_ns_triplets = do_nst ? XML_TRUE : XML_FALSE; } void XMLCALL -XML_SetUserData(XML_Parser parser, void *p) -{ +XML_SetUserData(XML_Parser parser, void *p) { if (parser == NULL) return; if (parser->m_handlerArg == parser->m_userData) @@ -1476,49 +1425,43 @@ XML_SetUserData(XML_Parser parser, void *p) } enum XML_Status XMLCALL -XML_SetBase(XML_Parser parser, const XML_Char *p) -{ +XML_SetBase(XML_Parser parser, const XML_Char *p) { if (parser == NULL) return XML_STATUS_ERROR; if (p) { p = poolCopyString(&parser->m_dtd->pool, p); - if (!p) + if (! p) return XML_STATUS_ERROR; parser->m_curBase = p; - } - else + } else parser->m_curBase = NULL; return XML_STATUS_OK; } -const XML_Char * XMLCALL -XML_GetBase(XML_Parser parser) -{ +const XML_Char *XMLCALL +XML_GetBase(XML_Parser parser) { if (parser == NULL) return NULL; return parser->m_curBase; } int XMLCALL -XML_GetSpecifiedAttributeCount(XML_Parser parser) -{ +XML_GetSpecifiedAttributeCount(XML_Parser parser) { if (parser == NULL) return -1; return parser->m_nSpecifiedAtts; } int XMLCALL -XML_GetIdAttributeIndex(XML_Parser parser) -{ +XML_GetIdAttributeIndex(XML_Parser parser) { if (parser == NULL) return -1; return parser->m_idAttIndex; } #ifdef XML_ATTR_INFO -const XML_AttrInfo * XMLCALL -XML_GetAttributeInfo(XML_Parser parser) -{ +const XML_AttrInfo *XMLCALL +XML_GetAttributeInfo(XML_Parser parser) { if (parser == NULL) return NULL; return parser->m_attInfo; @@ -1526,10 +1469,8 @@ XML_GetAttributeInfo(XML_Parser parser) #endif void XMLCALL -XML_SetElementHandler(XML_Parser parser, - XML_StartElementHandler start, - XML_EndElementHandler end) -{ +XML_SetElementHandler(XML_Parser parser, XML_StartElementHandler start, + XML_EndElementHandler end) { if (parser == NULL) return; parser->m_startElementHandler = start; @@ -1537,39 +1478,33 @@ XML_SetElementHandler(XML_Parser parser, } void XMLCALL -XML_SetStartElementHandler(XML_Parser parser, - XML_StartElementHandler start) { +XML_SetStartElementHandler(XML_Parser parser, XML_StartElementHandler start) { if (parser != NULL) parser->m_startElementHandler = start; } void XMLCALL -XML_SetEndElementHandler(XML_Parser parser, - XML_EndElementHandler end) { +XML_SetEndElementHandler(XML_Parser parser, XML_EndElementHandler end) { if (parser != NULL) parser->m_endElementHandler = end; } void XMLCALL XML_SetCharacterDataHandler(XML_Parser parser, - XML_CharacterDataHandler handler) -{ + XML_CharacterDataHandler handler) { if (parser != NULL) parser->m_characterDataHandler = handler; } void XMLCALL XML_SetProcessingInstructionHandler(XML_Parser parser, - XML_ProcessingInstructionHandler handler) -{ + XML_ProcessingInstructionHandler handler) { if (parser != NULL) parser->m_processingInstructionHandler = handler; } void XMLCALL -XML_SetCommentHandler(XML_Parser parser, - XML_CommentHandler handler) -{ +XML_SetCommentHandler(XML_Parser parser, XML_CommentHandler handler) { if (parser != NULL) parser->m_commentHandler = handler; } @@ -1577,8 +1512,7 @@ XML_SetCommentHandler(XML_Parser parser, void XMLCALL XML_SetCdataSectionHandler(XML_Parser parser, XML_StartCdataSectionHandler start, - XML_EndCdataSectionHandler end) -{ + XML_EndCdataSectionHandler end) { if (parser == NULL) return; parser->m_startCdataSectionHandler = start; @@ -1600,9 +1534,7 @@ XML_SetEndCdataSectionHandler(XML_Parser parser, } void XMLCALL -XML_SetDefaultHandler(XML_Parser parser, - XML_DefaultHandler handler) -{ +XML_SetDefaultHandler(XML_Parser parser, XML_DefaultHandler handler) { if (parser == NULL) return; parser->m_defaultHandler = handler; @@ -1610,9 +1542,7 @@ XML_SetDefaultHandler(XML_Parser parser, } void XMLCALL -XML_SetDefaultHandlerExpand(XML_Parser parser, - XML_DefaultHandler handler) -{ +XML_SetDefaultHandlerExpand(XML_Parser parser, XML_DefaultHandler handler) { if (parser == NULL) return; parser->m_defaultHandler = handler; @@ -1620,10 +1550,8 @@ XML_SetDefaultHandlerExpand(XML_Parser parser, } void XMLCALL -XML_SetDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start, - XML_EndDoctypeDeclHandler end) -{ +XML_SetDoctypeDeclHandler(XML_Parser parser, XML_StartDoctypeDeclHandler start, + XML_EndDoctypeDeclHandler end) { if (parser == NULL) return; parser->m_startDoctypeDeclHandler = start; @@ -1638,24 +1566,20 @@ XML_SetStartDoctypeDeclHandler(XML_Parser parser, } void XMLCALL -XML_SetEndDoctypeDeclHandler(XML_Parser parser, - XML_EndDoctypeDeclHandler end) { +XML_SetEndDoctypeDeclHandler(XML_Parser parser, XML_EndDoctypeDeclHandler end) { if (parser != NULL) parser->m_endDoctypeDeclHandler = end; } void XMLCALL XML_SetUnparsedEntityDeclHandler(XML_Parser parser, - XML_UnparsedEntityDeclHandler handler) -{ + XML_UnparsedEntityDeclHandler handler) { if (parser != NULL) parser->m_unparsedEntityDeclHandler = handler; } void XMLCALL -XML_SetNotationDeclHandler(XML_Parser parser, - XML_NotationDeclHandler handler) -{ +XML_SetNotationDeclHandler(XML_Parser parser, XML_NotationDeclHandler handler) { if (parser != NULL) parser->m_notationDeclHandler = handler; } @@ -1663,8 +1587,7 @@ XML_SetNotationDeclHandler(XML_Parser parser, void XMLCALL XML_SetNamespaceDeclHandler(XML_Parser parser, XML_StartNamespaceDeclHandler start, - XML_EndNamespaceDeclHandler end) -{ + XML_EndNamespaceDeclHandler end) { if (parser == NULL) return; parser->m_startNamespaceDeclHandler = start; @@ -1687,23 +1610,20 @@ XML_SetEndNamespaceDeclHandler(XML_Parser parser, void XMLCALL XML_SetNotStandaloneHandler(XML_Parser parser, - XML_NotStandaloneHandler handler) -{ + XML_NotStandaloneHandler handler) { if (parser != NULL) parser->m_notStandaloneHandler = handler; } void XMLCALL XML_SetExternalEntityRefHandler(XML_Parser parser, - XML_ExternalEntityRefHandler handler) -{ + XML_ExternalEntityRefHandler handler) { if (parser != NULL) parser->m_externalEntityRefHandler = handler; } void XMLCALL -XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg) -{ +XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg) { if (parser == NULL) return; if (arg) @@ -1714,17 +1634,14 @@ XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg) void XMLCALL XML_SetSkippedEntityHandler(XML_Parser parser, - XML_SkippedEntityHandler handler) -{ + XML_SkippedEntityHandler handler) { if (parser != NULL) parser->m_skippedEntityHandler = handler; } void XMLCALL XML_SetUnknownEncodingHandler(XML_Parser parser, - XML_UnknownEncodingHandler handler, - void *data) -{ + XML_UnknownEncodingHandler handler, void *data) { if (parser == NULL) return; parser->m_unknownEncodingHandler = handler; @@ -1732,44 +1649,37 @@ XML_SetUnknownEncodingHandler(XML_Parser parser, } void XMLCALL -XML_SetElementDeclHandler(XML_Parser parser, - XML_ElementDeclHandler eldecl) -{ +XML_SetElementDeclHandler(XML_Parser parser, XML_ElementDeclHandler eldecl) { if (parser != NULL) parser->m_elementDeclHandler = eldecl; } void XMLCALL -XML_SetAttlistDeclHandler(XML_Parser parser, - XML_AttlistDeclHandler attdecl) -{ +XML_SetAttlistDeclHandler(XML_Parser parser, XML_AttlistDeclHandler attdecl) { if (parser != NULL) parser->m_attlistDeclHandler = attdecl; } void XMLCALL -XML_SetEntityDeclHandler(XML_Parser parser, - XML_EntityDeclHandler handler) -{ +XML_SetEntityDeclHandler(XML_Parser parser, XML_EntityDeclHandler handler) { if (parser != NULL) parser->m_entityDeclHandler = handler; } void XMLCALL -XML_SetXmlDeclHandler(XML_Parser parser, - XML_XmlDeclHandler handler) { +XML_SetXmlDeclHandler(XML_Parser parser, XML_XmlDeclHandler handler) { if (parser != NULL) parser->m_xmlDeclHandler = handler; } int XMLCALL XML_SetParamEntityParsing(XML_Parser parser, - enum XML_ParamEntityParsing peParsing) -{ + enum XML_ParamEntityParsing peParsing) { if (parser == NULL) return 0; /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (parser->m_parsingStatus.parsing == XML_PARSING || parser->m_parsingStatus.parsing == XML_SUSPENDED) + if (parser->m_parsingStatus.parsing == XML_PARSING + || parser->m_parsingStatus.parsing == XML_SUSPENDED) return 0; #ifdef XML_DTD parser->m_paramEntityParsing = peParsing; @@ -1780,23 +1690,21 @@ XML_SetParamEntityParsing(XML_Parser parser, } int XMLCALL -XML_SetHashSalt(XML_Parser parser, - unsigned long hash_salt) -{ +XML_SetHashSalt(XML_Parser parser, unsigned long hash_salt) { if (parser == NULL) return 0; if (parser->m_parentParser) return XML_SetHashSalt(parser->m_parentParser, hash_salt); /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (parser->m_parsingStatus.parsing == XML_PARSING || parser->m_parsingStatus.parsing == XML_SUSPENDED) + if (parser->m_parsingStatus.parsing == XML_PARSING + || parser->m_parsingStatus.parsing == XML_SUSPENDED) return 0; parser->m_hash_secret_salt = hash_salt; return 1; } enum XML_Status XMLCALL -XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) -{ +XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) { if ((parser == NULL) || (len < 0) || ((s == NULL) && (len != 0))) { if (parser != NULL) parser->m_errorCode = XML_ERROR_INVALID_ARGUMENT; @@ -1810,7 +1718,7 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) parser->m_errorCode = XML_ERROR_FINISHED; return XML_STATUS_ERROR; case XML_INITIALIZED: - if (parser->m_parentParser == NULL && !startParsing(parser)) { + if (parser->m_parentParser == NULL && ! startParsing(parser)) { parser->m_errorCode = XML_ERROR_NO_MEMORY; return XML_STATUS_ERROR; } @@ -1821,7 +1729,7 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) if (len == 0) { parser->m_parsingStatus.finalBuffer = (XML_Bool)isFinal; - if (!isFinal) + if (! isFinal) return XML_STATUS_OK; parser->m_positionPtr = parser->m_bufferPtr; parser->m_parseEndPtr = parser->m_bufferEnd; @@ -1830,7 +1738,9 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) data are the final chunk of input, then we have to check them again to detect errors based on that fact. */ - parser->m_errorCode = parser->m_processor(parser, parser->m_bufferPtr, parser->m_parseEndPtr, &parser->m_bufferPtr); + parser->m_errorCode + = parser->m_processor(parser, parser->m_bufferPtr, + parser->m_parseEndPtr, &parser->m_bufferPtr); if (parser->m_errorCode == XML_ERROR_NONE) { switch (parser->m_parsingStatus.parsing) { @@ -1847,7 +1757,8 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) * * LCOV_EXCL_START */ - XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, parser->m_bufferPtr, &parser->m_position); + XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, + parser->m_bufferPtr, &parser->m_position); parser->m_positionPtr = parser->m_bufferPtr; return XML_STATUS_SUSPENDED; /* LCOV_EXCL_STOP */ @@ -1870,23 +1781,23 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) enum XML_Status result; /* Detect overflow (a+b > MAX <==> b > MAX-a) */ if (len > ((XML_Size)-1) / 2 - parser->m_parseEndByteIndex) { - parser->m_errorCode = XML_ERROR_NO_MEMORY; - parser->m_eventPtr = parser->m_eventEndPtr = NULL; - parser->m_processor = errorProcessor; - return XML_STATUS_ERROR; + parser->m_errorCode = XML_ERROR_NO_MEMORY; + parser->m_eventPtr = parser->m_eventEndPtr = NULL; + parser->m_processor = errorProcessor; + return XML_STATUS_ERROR; } parser->m_parseEndByteIndex += len; parser->m_positionPtr = s; parser->m_parsingStatus.finalBuffer = (XML_Bool)isFinal; - parser->m_errorCode = parser->m_processor(parser, s, parser->m_parseEndPtr = s + len, &end); + parser->m_errorCode + = parser->m_processor(parser, s, parser->m_parseEndPtr = s + len, &end); if (parser->m_errorCode != XML_ERROR_NONE) { parser->m_eventEndPtr = parser->m_eventPtr; parser->m_processor = errorProcessor; return XML_STATUS_ERROR; - } - else { + } else { switch (parser->m_parsingStatus.parsing) { case XML_SUSPENDED: result = XML_STATUS_SUSPENDED; @@ -1903,10 +1814,12 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) } } - XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, end, &parser->m_position); + XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, end, + &parser->m_position); nLeftOver = s + len - end; if (nLeftOver) { - if (parser->m_buffer == NULL || nLeftOver > parser->m_bufferLim - parser->m_buffer) { + if (parser->m_buffer == NULL + || nLeftOver > parser->m_bufferLim - parser->m_buffer) { /* avoid _signed_ integer overflow */ char *temp = NULL; const int bytesToAllocate = (int)((unsigned)len * 2U); @@ -1932,7 +1845,7 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) parser->m_eventEndPtr = parser->m_bufferPtr; return result; } -#endif /* not defined XML_CONTEXT_BYTES */ +#endif /* not defined XML_CONTEXT_BYTES */ else { void *buff = XML_GetBuffer(parser, len); if (buff == NULL) @@ -1945,8 +1858,7 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) } enum XML_Status XMLCALL -XML_ParseBuffer(XML_Parser parser, int len, int isFinal) -{ +XML_ParseBuffer(XML_Parser parser, int len, int isFinal) { const char *start; enum XML_Status result = XML_STATUS_OK; @@ -1960,7 +1872,7 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal) parser->m_errorCode = XML_ERROR_FINISHED; return XML_STATUS_ERROR; case XML_INITIALIZED: - if (parser->m_parentParser == NULL && !startParsing(parser)) { + if (parser->m_parentParser == NULL && ! startParsing(parser)) { parser->m_errorCode = XML_ERROR_NO_MEMORY; return XML_STATUS_ERROR; } @@ -1976,14 +1888,14 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal) parser->m_parseEndByteIndex += len; parser->m_parsingStatus.finalBuffer = (XML_Bool)isFinal; - parser->m_errorCode = parser->m_processor(parser, start, parser->m_parseEndPtr, &parser->m_bufferPtr); + parser->m_errorCode = parser->m_processor( + parser, start, parser->m_parseEndPtr, &parser->m_bufferPtr); if (parser->m_errorCode != XML_ERROR_NONE) { parser->m_eventEndPtr = parser->m_eventPtr; parser->m_processor = errorProcessor; return XML_STATUS_ERROR; - } - else { + } else { switch (parser->m_parsingStatus.parsing) { case XML_SUSPENDED: result = XML_STATUS_SUSPENDED; @@ -1994,18 +1906,18 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal) parser->m_parsingStatus.parsing = XML_FINISHED; return result; } - default: ; /* should not happen */ + default:; /* should not happen */ } } - XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, parser->m_bufferPtr, &parser->m_position); + XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, + parser->m_bufferPtr, &parser->m_position); parser->m_positionPtr = parser->m_bufferPtr; return result; } -void * XMLCALL -XML_GetBuffer(XML_Parser parser, int len) -{ +void *XMLCALL +XML_GetBuffer(XML_Parser parser, int len) { if (parser == NULL) return NULL; if (len < 0) { @@ -2019,17 +1931,17 @@ XML_GetBuffer(XML_Parser parser, int len) case XML_FINISHED: parser->m_errorCode = XML_ERROR_FINISHED; return NULL; - default: ; + default:; } if (len > EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_bufferEnd)) { #ifdef XML_CONTEXT_BYTES int keep; -#endif /* defined XML_CONTEXT_BYTES */ +#endif /* defined XML_CONTEXT_BYTES */ /* Do not invoke signed arithmetic overflow: */ - int neededSize = (int) ((unsigned)len + - (unsigned)EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, - parser->m_bufferPtr)); + int neededSize = (int)((unsigned)len + + (unsigned)EXPAT_SAFE_PTR_DIFF( + parser->m_bufferEnd, parser->m_bufferPtr)); if (neededSize < 0) { parser->m_errorCode = XML_ERROR_NO_MEMORY; return NULL; @@ -2039,13 +1951,18 @@ XML_GetBuffer(XML_Parser parser, int len) if (keep > XML_CONTEXT_BYTES) keep = XML_CONTEXT_BYTES; neededSize += keep; -#endif /* defined XML_CONTEXT_BYTES */ - if (neededSize <= EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_buffer)) { +#endif /* defined XML_CONTEXT_BYTES */ + if (neededSize + <= EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_buffer)) { #ifdef XML_CONTEXT_BYTES if (keep < EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer)) { - int offset = (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer) - keep; - /* The buffer pointers cannot be NULL here; we have at least some bytes in the buffer */ - memmove(parser->m_buffer, &parser->m_buffer[offset], parser->m_bufferEnd - parser->m_bufferPtr + keep); + int offset + = (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer) + - keep; + /* The buffer pointers cannot be NULL here; we have at least some bytes + * in the buffer */ + memmove(parser->m_buffer, &parser->m_buffer[offset], + parser->m_bufferEnd - parser->m_bufferPtr + keep); parser->m_bufferEnd -= offset; parser->m_bufferPtr -= offset; } @@ -2053,20 +1970,21 @@ XML_GetBuffer(XML_Parser parser, int len) if (parser->m_buffer && parser->m_bufferPtr) { memmove(parser->m_buffer, parser->m_bufferPtr, EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr)); - parser->m_bufferEnd = parser->m_buffer + - EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr); + parser->m_bufferEnd + = parser->m_buffer + + EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr); parser->m_bufferPtr = parser->m_buffer; } -#endif /* not defined XML_CONTEXT_BYTES */ - } - else { +#endif /* not defined XML_CONTEXT_BYTES */ + } else { char *newBuf; - int bufferSize = (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_bufferPtr); + int bufferSize + = (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_bufferPtr); if (bufferSize == 0) bufferSize = INIT_BUFFER_SIZE; do { /* Do not invoke signed arithmetic overflow: */ - bufferSize = (int) (2U * (unsigned) bufferSize); + bufferSize = (int)(2U * (unsigned)bufferSize); } while (bufferSize < neededSize && bufferSize > 0); if (bufferSize <= 0) { parser->m_errorCode = XML_ERROR_NO_MEMORY; @@ -2080,18 +1998,17 @@ XML_GetBuffer(XML_Parser parser, int len) parser->m_bufferLim = newBuf + bufferSize; #ifdef XML_CONTEXT_BYTES if (parser->m_bufferPtr) { - int keep = (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer); - if (keep > XML_CONTEXT_BYTES) - keep = XML_CONTEXT_BYTES; memcpy(newBuf, &parser->m_bufferPtr[-keep], - EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr) + keep); + EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr) + + keep); FREE(parser, parser->m_buffer); parser->m_buffer = newBuf; - parser->m_bufferEnd = parser->m_buffer + - EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr) + keep; + parser->m_bufferEnd + = parser->m_buffer + + EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr) + + keep; parser->m_bufferPtr = parser->m_buffer + keep; - } - else { + } else { /* This must be a brand new buffer with no data in it yet */ parser->m_bufferEnd = newBuf; parser->m_bufferPtr = parser->m_buffer = newBuf; @@ -2101,15 +2018,15 @@ XML_GetBuffer(XML_Parser parser, int len) memcpy(newBuf, parser->m_bufferPtr, EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr)); FREE(parser, parser->m_buffer); - parser->m_bufferEnd = newBuf + - EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr); - } - else { + parser->m_bufferEnd + = newBuf + + EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr); + } else { /* This must be a brand new buffer with no data in it yet */ parser->m_bufferEnd = newBuf; } parser->m_bufferPtr = parser->m_buffer = newBuf; -#endif /* not defined XML_CONTEXT_BYTES */ +#endif /* not defined XML_CONTEXT_BYTES */ } parser->m_eventPtr = parser->m_eventEndPtr = NULL; parser->m_positionPtr = NULL; @@ -2118,8 +2035,7 @@ XML_GetBuffer(XML_Parser parser, int len) } enum XML_Status XMLCALL -XML_StopParser(XML_Parser parser, XML_Bool resumable) -{ +XML_StopParser(XML_Parser parser, XML_Bool resumable) { if (parser == NULL) return XML_STATUS_ERROR; switch (parser->m_parsingStatus.parsing) { @@ -2142,16 +2058,14 @@ XML_StopParser(XML_Parser parser, XML_Bool resumable) } #endif parser->m_parsingStatus.parsing = XML_SUSPENDED; - } - else + } else parser->m_parsingStatus.parsing = XML_FINISHED; } return XML_STATUS_OK; } enum XML_Status XMLCALL -XML_ResumeParser(XML_Parser parser) -{ +XML_ResumeParser(XML_Parser parser) { enum XML_Status result = XML_STATUS_OK; if (parser == NULL) @@ -2162,14 +2076,14 @@ XML_ResumeParser(XML_Parser parser) } parser->m_parsingStatus.parsing = XML_PARSING; - parser->m_errorCode = parser->m_processor(parser, parser->m_bufferPtr, parser->m_parseEndPtr, &parser->m_bufferPtr); + parser->m_errorCode = parser->m_processor( + parser, parser->m_bufferPtr, parser->m_parseEndPtr, &parser->m_bufferPtr); if (parser->m_errorCode != XML_ERROR_NONE) { parser->m_eventEndPtr = parser->m_eventPtr; parser->m_processor = errorProcessor; return XML_STATUS_ERROR; - } - else { + } else { switch (parser->m_parsingStatus.parsing) { case XML_SUSPENDED: result = XML_STATUS_SUSPENDED; @@ -2180,18 +2094,18 @@ XML_ResumeParser(XML_Parser parser) parser->m_parsingStatus.parsing = XML_FINISHED; return result; } - default: ; + default:; } } - XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, parser->m_bufferPtr, &parser->m_position); + XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, + parser->m_bufferPtr, &parser->m_position); parser->m_positionPtr = parser->m_bufferPtr; return result; } void XMLCALL -XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status) -{ +XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status) { if (parser == NULL) return; assert(status != NULL); @@ -2199,26 +2113,24 @@ XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status) } enum XML_Error XMLCALL -XML_GetErrorCode(XML_Parser parser) -{ +XML_GetErrorCode(XML_Parser parser) { if (parser == NULL) return XML_ERROR_INVALID_ARGUMENT; return parser->m_errorCode; } XML_Index XMLCALL -XML_GetCurrentByteIndex(XML_Parser parser) -{ +XML_GetCurrentByteIndex(XML_Parser parser) { if (parser == NULL) return -1; if (parser->m_eventPtr) - return (XML_Index)(parser->m_parseEndByteIndex - (parser->m_parseEndPtr - parser->m_eventPtr)); + return (XML_Index)(parser->m_parseEndByteIndex + - (parser->m_parseEndPtr - parser->m_eventPtr)); return -1; } int XMLCALL -XML_GetCurrentByteCount(XML_Parser parser) -{ +XML_GetCurrentByteCount(XML_Parser parser) { if (parser == NULL) return 0; if (parser->m_eventEndPtr && parser->m_eventPtr) @@ -2226,9 +2138,8 @@ XML_GetCurrentByteCount(XML_Parser parser) return 0; } -const char * XMLCALL -XML_GetInputContext(XML_Parser parser, int *offset, int *size) -{ +const char *XMLCALL +XML_GetInputContext(XML_Parser parser, int *offset, int *size) { #ifdef XML_CONTEXT_BYTES if (parser == NULL) return NULL; @@ -2236,7 +2147,7 @@ XML_GetInputContext(XML_Parser parser, int *offset, int *size) if (offset != NULL) *offset = (int)(parser->m_eventPtr - parser->m_buffer); if (size != NULL) - *size = (int)(parser->m_bufferEnd - parser->m_buffer); + *size = (int)(parser->m_bufferEnd - parser->m_buffer); return parser->m_buffer; } #else @@ -2244,82 +2155,76 @@ XML_GetInputContext(XML_Parser parser, int *offset, int *size) (void)offset; (void)size; #endif /* defined XML_CONTEXT_BYTES */ - return (char *) 0; + return (char *)0; } XML_Size XMLCALL -XML_GetCurrentLineNumber(XML_Parser parser) -{ +XML_GetCurrentLineNumber(XML_Parser parser) { if (parser == NULL) return 0; if (parser->m_eventPtr && parser->m_eventPtr >= parser->m_positionPtr) { - XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, parser->m_eventPtr, &parser->m_position); + XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, + parser->m_eventPtr, &parser->m_position); parser->m_positionPtr = parser->m_eventPtr; } return parser->m_position.lineNumber + 1; } XML_Size XMLCALL -XML_GetCurrentColumnNumber(XML_Parser parser) -{ +XML_GetCurrentColumnNumber(XML_Parser parser) { if (parser == NULL) return 0; if (parser->m_eventPtr && parser->m_eventPtr >= parser->m_positionPtr) { - XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, parser->m_eventPtr, &parser->m_position); + XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, + parser->m_eventPtr, &parser->m_position); parser->m_positionPtr = parser->m_eventPtr; } return parser->m_position.columnNumber; } void XMLCALL -XML_FreeContentModel(XML_Parser parser, XML_Content *model) -{ +XML_FreeContentModel(XML_Parser parser, XML_Content *model) { if (parser != NULL) FREE(parser, model); } -void * XMLCALL -XML_MemMalloc(XML_Parser parser, size_t size) -{ +void *XMLCALL +XML_MemMalloc(XML_Parser parser, size_t size) { if (parser == NULL) return NULL; return MALLOC(parser, size); } -void * XMLCALL -XML_MemRealloc(XML_Parser parser, void *ptr, size_t size) -{ +void *XMLCALL +XML_MemRealloc(XML_Parser parser, void *ptr, size_t size) { if (parser == NULL) return NULL; return REALLOC(parser, ptr, size); } void XMLCALL -XML_MemFree(XML_Parser parser, void *ptr) -{ +XML_MemFree(XML_Parser parser, void *ptr) { if (parser != NULL) FREE(parser, ptr); } void XMLCALL -XML_DefaultCurrent(XML_Parser parser) -{ +XML_DefaultCurrent(XML_Parser parser) { if (parser == NULL) return; if (parser->m_defaultHandler) { if (parser->m_openInternalEntities) - reportDefault(parser, - parser->m_internalEncoding, + reportDefault(parser, parser->m_internalEncoding, parser->m_openInternalEntities->internalEventPtr, parser->m_openInternalEntities->internalEventEndPtr); else - reportDefault(parser, parser->m_encoding, parser->m_eventPtr, parser->m_eventEndPtr); + reportDefault(parser, parser->m_encoding, parser->m_eventPtr, + parser->m_eventEndPtr); } } -const XML_LChar * XMLCALL -XML_ErrorString(enum XML_Error code) -{ +const XML_LChar *XMLCALL +XML_ErrorString(enum XML_Error code) { switch (code) { case XML_ERROR_NONE: return NULL; @@ -2401,21 +2306,22 @@ XML_ErrorString(enum XML_Error code) return XML_L("cannot suspend in external parameter entity"); /* Added in 2.0.0. */ case XML_ERROR_RESERVED_PREFIX_XML: - return XML_L("reserved prefix (xml) must not be undeclared or bound to another namespace name"); + return XML_L( + "reserved prefix (xml) must not be undeclared or bound to another namespace name"); case XML_ERROR_RESERVED_PREFIX_XMLNS: return XML_L("reserved prefix (xmlns) must not be declared or undeclared"); case XML_ERROR_RESERVED_NAMESPACE_URI: - return XML_L("prefix must not be bound to one of the reserved namespace names"); + return XML_L( + "prefix must not be bound to one of the reserved namespace names"); /* Added in 2.2.5. */ - case XML_ERROR_INVALID_ARGUMENT: /* Constant added in 2.2.1, already */ + case XML_ERROR_INVALID_ARGUMENT: /* Constant added in 2.2.1, already */ return XML_L("invalid argument"); } return NULL; } -const XML_LChar * XMLCALL +const XML_LChar *XMLCALL XML_ExpatVersion(void) { - /* V1 is used to string-ize the version number. However, it would string-ize the actual version macro *names* unless we get them substituted before being passed to V1. CPP is defined to expand @@ -2424,8 +2330,8 @@ XML_ExpatVersion(void) { with the correct numerals. */ /* ### I'm assuming cpp is portable in this respect... */ -#define V1(a,b,c) XML_L(#a)XML_L(".")XML_L(#b)XML_L(".")XML_L(#c) -#define V2(a,b,c) XML_L("expat_")V1(a,b,c) +#define V1(a, b, c) XML_L(#a) XML_L(".") XML_L(#b) XML_L(".") XML_L(#c) +#define V2(a, b, c) XML_L("expat_") V1(a, b, c) return V2(XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION); @@ -2434,8 +2340,7 @@ XML_ExpatVersion(void) { } XML_Expat_Version XMLCALL -XML_ExpatVersionInfo(void) -{ +XML_ExpatVersionInfo(void) { XML_Expat_Version version; version.major = XML_MAJOR_VERSION; @@ -2445,41 +2350,39 @@ XML_ExpatVersionInfo(void) return version; } -const XML_Feature * XMLCALL -XML_GetFeatureList(void) -{ - static const XML_Feature features[] = { - {XML_FEATURE_SIZEOF_XML_CHAR, XML_L("sizeof(XML_Char)"), - sizeof(XML_Char)}, - {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"), - sizeof(XML_LChar)}, +const XML_Feature *XMLCALL +XML_GetFeatureList(void) { + static const XML_Feature features[] + = {{XML_FEATURE_SIZEOF_XML_CHAR, XML_L("sizeof(XML_Char)"), + sizeof(XML_Char)}, + {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"), + sizeof(XML_LChar)}, #ifdef XML_UNICODE - {XML_FEATURE_UNICODE, XML_L("XML_UNICODE"), 0}, + {XML_FEATURE_UNICODE, XML_L("XML_UNICODE"), 0}, #endif #ifdef XML_UNICODE_WCHAR_T - {XML_FEATURE_UNICODE_WCHAR_T, XML_L("XML_UNICODE_WCHAR_T"), 0}, + {XML_FEATURE_UNICODE_WCHAR_T, XML_L("XML_UNICODE_WCHAR_T"), 0}, #endif #ifdef XML_DTD - {XML_FEATURE_DTD, XML_L("XML_DTD"), 0}, + {XML_FEATURE_DTD, XML_L("XML_DTD"), 0}, #endif #ifdef XML_CONTEXT_BYTES - {XML_FEATURE_CONTEXT_BYTES, XML_L("XML_CONTEXT_BYTES"), - XML_CONTEXT_BYTES}, + {XML_FEATURE_CONTEXT_BYTES, XML_L("XML_CONTEXT_BYTES"), + XML_CONTEXT_BYTES}, #endif #ifdef XML_MIN_SIZE - {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE"), 0}, + {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE"), 0}, #endif #ifdef XML_NS - {XML_FEATURE_NS, XML_L("XML_NS"), 0}, + {XML_FEATURE_NS, XML_L("XML_NS"), 0}, #endif #ifdef XML_LARGE_SIZE - {XML_FEATURE_LARGE_SIZE, XML_L("XML_LARGE_SIZE"), 0}, + {XML_FEATURE_LARGE_SIZE, XML_L("XML_LARGE_SIZE"), 0}, #endif #ifdef XML_ATTR_INFO - {XML_FEATURE_ATTR_INFO, XML_L("XML_ATTR_INFO"), 0}, + {XML_FEATURE_ATTR_INFO, XML_L("XML_ATTR_INFO"), 0}, #endif - {XML_FEATURE_END, NULL, 0} - }; + {XML_FEATURE_END, NULL, 0}}; return features; } @@ -2490,8 +2393,7 @@ XML_GetFeatureList(void) permanent location, since the parse buffer is about to be discarded. */ static XML_Bool -storeRawNames(XML_Parser parser) -{ +storeRawNames(XML_Parser parser) { TAG *tag = parser->m_tagStack; while (tag) { int bufSize; @@ -2521,8 +2423,8 @@ storeRawNames(XML_Parser parser) then update it as well, since it will always point into tag->buf */ if (tag->name.localPart) - tag->name.localPart = (XML_Char *)temp + (tag->name.localPart - - (XML_Char *)tag->buf); + tag->name.localPart + = (XML_Char *)temp + (tag->name.localPart - (XML_Char *)tag->buf); tag->buf = temp; tag->bufEnd = temp + bufSize; rawNameBuf = temp + nameLen; @@ -2535,26 +2437,21 @@ storeRawNames(XML_Parser parser) } static enum XML_Error PTRCALL -contentProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doContent(parser, 0, parser->m_encoding, start, end, - endPtr, (XML_Bool)!parser->m_parsingStatus.finalBuffer); +contentProcessor(XML_Parser parser, const char *start, const char *end, + const char **endPtr) { + enum XML_Error result + = doContent(parser, 0, parser->m_encoding, start, end, endPtr, + (XML_Bool)! parser->m_parsingStatus.finalBuffer); if (result == XML_ERROR_NONE) { - if (!storeRawNames(parser)) + if (! storeRawNames(parser)) return XML_ERROR_NO_MEMORY; } return result; } static enum XML_Error PTRCALL -externalEntityInitProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ +externalEntityInitProcessor(XML_Parser parser, const char *start, + const char *end, const char **endPtr) { enum XML_Error result = initializeEncoding(parser); if (result != XML_ERROR_NONE) return result; @@ -2563,11 +2460,8 @@ externalEntityInitProcessor(XML_Parser parser, } static enum XML_Error PTRCALL -externalEntityInitProcessor2(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ +externalEntityInitProcessor2(XML_Parser parser, const char *start, + const char *end, const char **endPtr) { const char *next = start; /* XmlContentTok doesn't always set the last arg */ int tok = XmlContentTok(parser->m_encoding, start, end, &next); switch (tok) { @@ -2577,21 +2471,21 @@ externalEntityInitProcessor2(XML_Parser parser, doContent (by detecting XML_TOK_NONE) without processing any xml text declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent. */ - if (next == end && !parser->m_parsingStatus.finalBuffer) { + if (next == end && ! parser->m_parsingStatus.finalBuffer) { *endPtr = next; return XML_ERROR_NONE; } start = next; break; case XML_TOK_PARTIAL: - if (!parser->m_parsingStatus.finalBuffer) { + if (! parser->m_parsingStatus.finalBuffer) { *endPtr = start; return XML_ERROR_NONE; } parser->m_eventPtr = start; return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: - if (!parser->m_parsingStatus.finalBuffer) { + if (! parser->m_parsingStatus.finalBuffer) { *endPtr = start; return XML_ERROR_NONE; } @@ -2603,11 +2497,8 @@ externalEntityInitProcessor2(XML_Parser parser, } static enum XML_Error PTRCALL -externalEntityInitProcessor3(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ +externalEntityInitProcessor3(XML_Parser parser, const char *start, + const char *end, const char **endPtr) { int tok; const char *next = start; /* XmlContentTok doesn't always set the last arg */ parser->m_eventPtr = start; @@ -2615,31 +2506,29 @@ externalEntityInitProcessor3(XML_Parser parser, parser->m_eventEndPtr = next; switch (tok) { - case XML_TOK_XML_DECL: - { - enum XML_Error result; - result = processXmlDecl(parser, 1, start, next); - if (result != XML_ERROR_NONE) - return result; - switch (parser->m_parsingStatus.parsing) { - case XML_SUSPENDED: - *endPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: - start = next; - } + case XML_TOK_XML_DECL: { + enum XML_Error result; + result = processXmlDecl(parser, 1, start, next); + if (result != XML_ERROR_NONE) + return result; + switch (parser->m_parsingStatus.parsing) { + case XML_SUSPENDED: + *endPtr = next; + return XML_ERROR_NONE; + case XML_FINISHED: + return XML_ERROR_ABORTED; + default: + start = next; } - break; + } break; case XML_TOK_PARTIAL: - if (!parser->m_parsingStatus.finalBuffer) { + if (! parser->m_parsingStatus.finalBuffer) { *endPtr = start; return XML_ERROR_NONE; } return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: - if (!parser->m_parsingStatus.finalBuffer) { + if (! parser->m_parsingStatus.finalBuffer) { *endPtr = start; return XML_ERROR_NONE; } @@ -2651,39 +2540,31 @@ externalEntityInitProcessor3(XML_Parser parser, } static enum XML_Error PTRCALL -externalEntityContentProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doContent(parser, 1, parser->m_encoding, start, end, - endPtr, (XML_Bool)!parser->m_parsingStatus.finalBuffer); +externalEntityContentProcessor(XML_Parser parser, const char *start, + const char *end, const char **endPtr) { + enum XML_Error result + = doContent(parser, 1, parser->m_encoding, start, end, endPtr, + (XML_Bool)! parser->m_parsingStatus.finalBuffer); if (result == XML_ERROR_NONE) { - if (!storeRawNames(parser)) + if (! storeRawNames(parser)) return XML_ERROR_NO_MEMORY; } return result; } static enum XML_Error -doContent(XML_Parser parser, - int startTagLevel, - const ENCODING *enc, - const char *s, - const char *end, - const char **nextPtr, - XML_Bool haveMore) -{ +doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, + const char *s, const char *end, const char **nextPtr, + XML_Bool haveMore) { /* save one level of indirection */ - DTD * const dtd = parser->m_dtd; + DTD *const dtd = parser->m_dtd; const char **eventPP; const char **eventEndPP; if (enc == parser->m_encoding) { eventPP = &parser->m_eventPtr; eventEndPP = &parser->m_eventEndPtr; - } - else { + } else { eventPP = &(parser->m_openInternalEntities->internalEventPtr); eventEndPP = &(parser->m_openInternalEntities->internalEventEndPtr); } @@ -2703,8 +2584,7 @@ doContent(XML_Parser parser, if (parser->m_characterDataHandler) { XML_Char c = 0xA; parser->m_characterDataHandler(parser->m_handlerArg, &c, 1); - } - else if (parser->m_defaultHandler) + } else if (parser->m_defaultHandler) reportDefault(parser, enc, s, end); /* We are at the end of the final buffer, should we check for XML_SUSPENDED, XML_FINISHED? @@ -2742,185 +2622,178 @@ doContent(XML_Parser parser, return XML_ERROR_NONE; } return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_ENTITY_REF: - { - const XML_Char *name; - ENTITY *entity; - XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (ch) { - if (parser->m_characterDataHandler) - parser->m_characterDataHandler(parser->m_handlerArg, &ch, 1); - else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - name = poolStoreString(&dtd->pool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) - return XML_ERROR_NO_MEMORY; - entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); - poolDiscard(&dtd->pool); - /* First, determine if a check for an existing declaration is needed; - if yes, check that the entity exists, and that it is internal, - otherwise call the skipped entity or default handler. - */ - if (!dtd->hasParamEntityRefs || dtd->standalone) { - if (!entity) - return XML_ERROR_UNDEFINED_ENTITY; - else if (!entity->is_internal) - return XML_ERROR_ENTITY_DECLARED_IN_PE; - } - else if (!entity) { + case XML_TOK_ENTITY_REF: { + const XML_Char *name; + ENTITY *entity; + XML_Char ch = (XML_Char)XmlPredefinedEntityName( + enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); + if (ch) { + if (parser->m_characterDataHandler) + parser->m_characterDataHandler(parser->m_handlerArg, &ch, 1); + else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + name = poolStoreString(&dtd->pool, enc, s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (! name) + return XML_ERROR_NO_MEMORY; + entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); + poolDiscard(&dtd->pool); + /* First, determine if a check for an existing declaration is needed; + if yes, check that the entity exists, and that it is internal, + otherwise call the skipped entity or default handler. + */ + if (! dtd->hasParamEntityRefs || dtd->standalone) { + if (! entity) + return XML_ERROR_UNDEFINED_ENTITY; + else if (! entity->is_internal) + return XML_ERROR_ENTITY_DECLARED_IN_PE; + } else if (! entity) { + if (parser->m_skippedEntityHandler) + parser->m_skippedEntityHandler(parser->m_handlerArg, name, 0); + else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + if (entity->open) + return XML_ERROR_RECURSIVE_ENTITY_REF; + if (entity->notation) + return XML_ERROR_BINARY_ENTITY_REF; + if (entity->textPtr) { + enum XML_Error result; + if (! parser->m_defaultExpandInternalEntities) { if (parser->m_skippedEntityHandler) - parser->m_skippedEntityHandler(parser->m_handlerArg, name, 0); + parser->m_skippedEntityHandler(parser->m_handlerArg, entity->name, + 0); else if (parser->m_defaultHandler) reportDefault(parser, enc, s, next); break; } - if (entity->open) - return XML_ERROR_RECURSIVE_ENTITY_REF; - if (entity->notation) - return XML_ERROR_BINARY_ENTITY_REF; - if (entity->textPtr) { - enum XML_Error result; - if (!parser->m_defaultExpandInternalEntities) { - if (parser->m_skippedEntityHandler) - parser->m_skippedEntityHandler(parser->m_handlerArg, entity->name, 0); - else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - result = processInternalEntity(parser, entity, XML_FALSE); - if (result != XML_ERROR_NONE) - return result; - } - else if (parser->m_externalEntityRefHandler) { - const XML_Char *context; - entity->open = XML_TRUE; - context = getContext(parser); - entity->open = XML_FALSE; - if (!context) - return XML_ERROR_NO_MEMORY; - if (!parser->m_externalEntityRefHandler(parser->m_externalEntityRefHandlerArg, - context, - entity->base, - entity->systemId, - entity->publicId)) - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - poolDiscard(&parser->m_tempPool); - } - else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - break; - } + result = processInternalEntity(parser, entity, XML_FALSE); + if (result != XML_ERROR_NONE) + return result; + } else if (parser->m_externalEntityRefHandler) { + const XML_Char *context; + entity->open = XML_TRUE; + context = getContext(parser); + entity->open = XML_FALSE; + if (! context) + return XML_ERROR_NO_MEMORY; + if (! parser->m_externalEntityRefHandler( + parser->m_externalEntityRefHandlerArg, context, entity->base, + entity->systemId, entity->publicId)) + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + poolDiscard(&parser->m_tempPool); + } else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + break; + } case XML_TOK_START_TAG_NO_ATTS: /* fall through */ - case XML_TOK_START_TAG_WITH_ATTS: - { - TAG *tag; - enum XML_Error result; - XML_Char *toPtr; - if (parser->m_freeTagList) { - tag = parser->m_freeTagList; - parser->m_freeTagList = parser->m_freeTagList->parent; + case XML_TOK_START_TAG_WITH_ATTS: { + TAG *tag; + enum XML_Error result; + XML_Char *toPtr; + if (parser->m_freeTagList) { + tag = parser->m_freeTagList; + parser->m_freeTagList = parser->m_freeTagList->parent; + } else { + tag = (TAG *)MALLOC(parser, sizeof(TAG)); + if (! tag) + return XML_ERROR_NO_MEMORY; + tag->buf = (char *)MALLOC(parser, INIT_TAG_BUF_SIZE); + if (! tag->buf) { + FREE(parser, tag); + return XML_ERROR_NO_MEMORY; } - else { - tag = (TAG *)MALLOC(parser, sizeof(TAG)); - if (!tag) - return XML_ERROR_NO_MEMORY; - tag->buf = (char *)MALLOC(parser, INIT_TAG_BUF_SIZE); - if (!tag->buf) { - FREE(parser, tag); - return XML_ERROR_NO_MEMORY; + tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE; + } + tag->bindings = NULL; + tag->parent = parser->m_tagStack; + parser->m_tagStack = tag; + tag->name.localPart = NULL; + tag->name.prefix = NULL; + tag->rawName = s + enc->minBytesPerChar; + tag->rawNameLength = XmlNameLength(enc, tag->rawName); + ++parser->m_tagLevel; + { + const char *rawNameEnd = tag->rawName + tag->rawNameLength; + const char *fromPtr = tag->rawName; + toPtr = (XML_Char *)tag->buf; + for (;;) { + int bufSize; + int convLen; + const enum XML_Convert_Result convert_res + = XmlConvert(enc, &fromPtr, rawNameEnd, (ICHAR **)&toPtr, + (ICHAR *)tag->bufEnd - 1); + convLen = (int)(toPtr - (XML_Char *)tag->buf); + if ((fromPtr >= rawNameEnd) + || (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) { + tag->name.strLen = convLen; + break; } - tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE; - } - tag->bindings = NULL; - tag->parent = parser->m_tagStack; - parser->m_tagStack = tag; - tag->name.localPart = NULL; - tag->name.prefix = NULL; - tag->rawName = s + enc->minBytesPerChar; - tag->rawNameLength = XmlNameLength(enc, tag->rawName); - ++parser->m_tagLevel; - { - const char *rawNameEnd = tag->rawName + tag->rawNameLength; - const char *fromPtr = tag->rawName; - toPtr = (XML_Char *)tag->buf; - for (;;) { - int bufSize; - int convLen; - const enum XML_Convert_Result convert_res = XmlConvert(enc, - &fromPtr, rawNameEnd, - (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1); - convLen = (int)(toPtr - (XML_Char *)tag->buf); - if ((fromPtr >= rawNameEnd) || (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) { - tag->name.strLen = convLen; - break; - } - bufSize = (int)(tag->bufEnd - tag->buf) << 1; - { - char *temp = (char *)REALLOC(parser, tag->buf, bufSize); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - tag->buf = temp; - tag->bufEnd = temp + bufSize; - toPtr = (XML_Char *)temp + convLen; - } + bufSize = (int)(tag->bufEnd - tag->buf) << 1; + { + char *temp = (char *)REALLOC(parser, tag->buf, bufSize); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + tag->buf = temp; + tag->bufEnd = temp + bufSize; + toPtr = (XML_Char *)temp + convLen; } } - tag->name.str = (XML_Char *)tag->buf; - *toPtr = XML_T('\0'); - result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings)); - if (result) - return result; - if (parser->m_startElementHandler) - parser->m_startElementHandler(parser->m_handlerArg, tag->name.str, - (const XML_Char **)parser->m_atts); - else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - poolClear(&parser->m_tempPool); - break; } + tag->name.str = (XML_Char *)tag->buf; + *toPtr = XML_T('\0'); + result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings)); + if (result) + return result; + if (parser->m_startElementHandler) + parser->m_startElementHandler(parser->m_handlerArg, tag->name.str, + (const XML_Char **)parser->m_atts); + else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + poolClear(&parser->m_tempPool); + break; + } case XML_TOK_EMPTY_ELEMENT_NO_ATTS: /* fall through */ - case XML_TOK_EMPTY_ELEMENT_WITH_ATTS: - { - const char *rawName = s + enc->minBytesPerChar; - enum XML_Error result; - BINDING *bindings = NULL; - XML_Bool noElmHandlers = XML_TRUE; - TAG_NAME name; - name.str = poolStoreString(&parser->m_tempPool, enc, rawName, - rawName + XmlNameLength(enc, rawName)); - if (!name.str) - return XML_ERROR_NO_MEMORY; - poolFinish(&parser->m_tempPool); - result = storeAtts(parser, enc, s, &name, &bindings); - if (result != XML_ERROR_NONE) { - freeBindings(parser, bindings); - return result; - } - poolFinish(&parser->m_tempPool); - if (parser->m_startElementHandler) { - parser->m_startElementHandler(parser->m_handlerArg, name.str, (const XML_Char **)parser->m_atts); - noElmHandlers = XML_FALSE; - } - if (parser->m_endElementHandler) { - if (parser->m_startElementHandler) - *eventPP = *eventEndPP; - parser->m_endElementHandler(parser->m_handlerArg, name.str); - noElmHandlers = XML_FALSE; - } - if (noElmHandlers && parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - poolClear(&parser->m_tempPool); + case XML_TOK_EMPTY_ELEMENT_WITH_ATTS: { + const char *rawName = s + enc->minBytesPerChar; + enum XML_Error result; + BINDING *bindings = NULL; + XML_Bool noElmHandlers = XML_TRUE; + TAG_NAME name; + name.str = poolStoreString(&parser->m_tempPool, enc, rawName, + rawName + XmlNameLength(enc, rawName)); + if (! name.str) + return XML_ERROR_NO_MEMORY; + poolFinish(&parser->m_tempPool); + result = storeAtts(parser, enc, s, &name, &bindings); + if (result != XML_ERROR_NONE) { freeBindings(parser, bindings); + return result; + } + poolFinish(&parser->m_tempPool); + if (parser->m_startElementHandler) { + parser->m_startElementHandler(parser->m_handlerArg, name.str, + (const XML_Char **)parser->m_atts); + noElmHandlers = XML_FALSE; + } + if (parser->m_endElementHandler) { + if (parser->m_startElementHandler) + *eventPP = *eventEndPP; + parser->m_endElementHandler(parser->m_handlerArg, name.str); + noElmHandlers = XML_FALSE; } - if ((parser->m_tagLevel == 0) && (parser->m_parsingStatus.parsing != XML_FINISHED)) { + if (noElmHandlers && parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + poolClear(&parser->m_tempPool); + freeBindings(parser, bindings); + } + if ((parser->m_tagLevel == 0) + && (parser->m_parsingStatus.parsing != XML_FINISHED)) { if (parser->m_parsingStatus.parsing == XML_SUSPENDED) parser->m_processor = epilogProcessor; else @@ -2937,7 +2810,7 @@ doContent(XML_Parser parser, parser->m_tagStack = tag->parent; tag->parent = parser->m_freeTagList; parser->m_freeTagList = tag; - rawName = s + enc->minBytesPerChar*2; + rawName = s + enc->minBytesPerChar * 2; len = XmlNameLength(enc, rawName); if (len != tag->rawNameLength || memcmp(tag->rawName, rawName, len) != 0) { @@ -2957,86 +2830,89 @@ doContent(XML_Parser parser, */ uri = (XML_Char *)tag->name.str + tag->name.uriLen; /* don't need to check for space - already done in storeAtts() */ - while (*localPart) *uri++ = *localPart++; + while (*localPart) + *uri++ = *localPart++; prefix = (XML_Char *)tag->name.prefix; if (parser->m_ns_triplets && prefix) { *uri++ = parser->m_namespaceSeparator; - while (*prefix) *uri++ = *prefix++; - } + while (*prefix) + *uri++ = *prefix++; + } *uri = XML_T('\0'); } parser->m_endElementHandler(parser->m_handlerArg, tag->name.str); - } - else if (parser->m_defaultHandler) + } else if (parser->m_defaultHandler) reportDefault(parser, enc, s, next); while (tag->bindings) { BINDING *b = tag->bindings; if (parser->m_endNamespaceDeclHandler) - parser->m_endNamespaceDeclHandler(parser->m_handlerArg, b->prefix->name); + parser->m_endNamespaceDeclHandler(parser->m_handlerArg, + b->prefix->name); tag->bindings = tag->bindings->nextTagBinding; b->nextTagBinding = parser->m_freeBindingList; parser->m_freeBindingList = b; b->prefix->binding = b->prevPrefixBinding; } - if (parser->m_tagLevel == 0) - return epilogProcessor(parser, next, end, nextPtr); - } - break; - case XML_TOK_CHAR_REF: - { - int n = XmlCharRefNumber(enc, s); - if (n < 0) - return XML_ERROR_BAD_CHAR_REF; - if (parser->m_characterDataHandler) { - XML_Char buf[XML_ENCODE_MAX]; - parser->m_characterDataHandler(parser->m_handlerArg, buf, XmlEncode(n, (ICHAR *)buf)); + if ((parser->m_tagLevel == 0) + && (parser->m_parsingStatus.parsing != XML_FINISHED)) { + if (parser->m_parsingStatus.parsing == XML_SUSPENDED) + parser->m_processor = epilogProcessor; + else + return epilogProcessor(parser, next, end, nextPtr); } - else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); } break; + case XML_TOK_CHAR_REF: { + int n = XmlCharRefNumber(enc, s); + if (n < 0) + return XML_ERROR_BAD_CHAR_REF; + if (parser->m_characterDataHandler) { + XML_Char buf[XML_ENCODE_MAX]; + parser->m_characterDataHandler(parser->m_handlerArg, buf, + XmlEncode(n, (ICHAR *)buf)); + } else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + } break; case XML_TOK_XML_DECL: return XML_ERROR_MISPLACED_XML_PI; case XML_TOK_DATA_NEWLINE: if (parser->m_characterDataHandler) { XML_Char c = 0xA; parser->m_characterDataHandler(parser->m_handlerArg, &c, 1); - } - else if (parser->m_defaultHandler) + } else if (parser->m_defaultHandler) reportDefault(parser, enc, s, next); break; - case XML_TOK_CDATA_SECT_OPEN: - { - enum XML_Error result; - if (parser->m_startCdataSectionHandler) - parser->m_startCdataSectionHandler(parser->m_handlerArg); -/* BEGIN disabled code */ - /* Suppose you doing a transformation on a document that involves - changing only the character data. You set up a defaultHandler - and a characterDataHandler. The defaultHandler simply copies - characters through. The characterDataHandler does the - transformation and writes the characters out escaping them as - necessary. This case will fail to work if we leave out the - following two lines (because & and < inside CDATA sections will - be incorrectly escaped). - - However, now we have a start/endCdataSectionHandler, so it seems - easier to let the user deal with this. - */ - else if (0 && parser->m_characterDataHandler) - parser->m_characterDataHandler(parser->m_handlerArg, parser->m_dataBuf, 0); -/* END disabled code */ - else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore); - if (result != XML_ERROR_NONE) - return result; - else if (!next) { - parser->m_processor = cdataSectionProcessor; - return result; - } + case XML_TOK_CDATA_SECT_OPEN: { + enum XML_Error result; + if (parser->m_startCdataSectionHandler) + parser->m_startCdataSectionHandler(parser->m_handlerArg); + /* BEGIN disabled code */ + /* Suppose you doing a transformation on a document that involves + changing only the character data. You set up a defaultHandler + and a characterDataHandler. The defaultHandler simply copies + characters through. The characterDataHandler does the + transformation and writes the characters out escaping them as + necessary. This case will fail to work if we leave out the + following two lines (because & and < inside CDATA sections will + be incorrectly escaped). + + However, now we have a start/endCdataSectionHandler, so it seems + easier to let the user deal with this. + */ + else if (0 && parser->m_characterDataHandler) + parser->m_characterDataHandler(parser->m_handlerArg, parser->m_dataBuf, + 0); + /* END disabled code */ + else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore); + if (result != XML_ERROR_NONE) + return result; + else if (! next) { + parser->m_processor = cdataSectionProcessor; + return result; } - break; + } break; case XML_TOK_TRAILING_RSQB: if (haveMore) { *nextPtr = s; @@ -3046,15 +2922,14 @@ doContent(XML_Parser parser, if (MUST_CONVERT(enc, s)) { ICHAR *dataPtr = (ICHAR *)parser->m_dataBuf; XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)parser->m_dataBufEnd); - parser->m_characterDataHandler(parser->m_handlerArg, parser->m_dataBuf, - (int)(dataPtr - (ICHAR *)parser->m_dataBuf)); - } - else - parser->m_characterDataHandler(parser->m_handlerArg, - (XML_Char *)s, - (int)((XML_Char *)end - (XML_Char *)s)); - } - else if (parser->m_defaultHandler) + parser->m_characterDataHandler( + parser->m_handlerArg, parser->m_dataBuf, + (int)(dataPtr - (ICHAR *)parser->m_dataBuf)); + } else + parser->m_characterDataHandler( + parser->m_handlerArg, (XML_Char *)s, + (int)((XML_Char *)end - (XML_Char *)s)); + } else if (parser->m_defaultHandler) reportDefault(parser, enc, s, end); /* We are at the end of the final buffer, should we check for XML_SUSPENDED, XML_FINISHED? @@ -3069,37 +2944,34 @@ doContent(XML_Parser parser, } *nextPtr = end; return XML_ERROR_NONE; - case XML_TOK_DATA_CHARS: - { - XML_CharacterDataHandler charDataHandler = parser->m_characterDataHandler; - if (charDataHandler) { - if (MUST_CONVERT(enc, s)) { - for (;;) { - ICHAR *dataPtr = (ICHAR *)parser->m_dataBuf; - const enum XML_Convert_Result convert_res = XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)parser->m_dataBufEnd); - *eventEndPP = s; - charDataHandler(parser->m_handlerArg, parser->m_dataBuf, - (int)(dataPtr - (ICHAR *)parser->m_dataBuf)); - if ((convert_res == XML_CONVERT_COMPLETED) || (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) - break; - *eventPP = s; - } + case XML_TOK_DATA_CHARS: { + XML_CharacterDataHandler charDataHandler = parser->m_characterDataHandler; + if (charDataHandler) { + if (MUST_CONVERT(enc, s)) { + for (;;) { + ICHAR *dataPtr = (ICHAR *)parser->m_dataBuf; + const enum XML_Convert_Result convert_res = XmlConvert( + enc, &s, next, &dataPtr, (ICHAR *)parser->m_dataBufEnd); + *eventEndPP = s; + charDataHandler(parser->m_handlerArg, parser->m_dataBuf, + (int)(dataPtr - (ICHAR *)parser->m_dataBuf)); + if ((convert_res == XML_CONVERT_COMPLETED) + || (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) + break; + *eventPP = s; } - else - charDataHandler(parser->m_handlerArg, - (XML_Char *)s, - (int)((XML_Char *)next - (XML_Char *)s)); - } - else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - } - break; + } else + charDataHandler(parser->m_handlerArg, (XML_Char *)s, + (int)((XML_Char *)next - (XML_Char *)s)); + } else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + } break; case XML_TOK_PI: - if (!reportProcessingInstruction(parser, enc, s, next)) + if (! reportProcessingInstruction(parser, enc, s, next)) return XML_ERROR_NO_MEMORY; break; case XML_TOK_COMMENT: - if (!reportComment(parser, enc, s, next)) + if (! reportComment(parser, enc, s, next)) return XML_ERROR_NO_MEMORY; break; default: @@ -3122,7 +2994,7 @@ doContent(XML_Parser parser, return XML_ERROR_NONE; case XML_FINISHED: return XML_ERROR_ABORTED; - default: ; + default:; } } /* not reached */ @@ -3133,8 +3005,7 @@ doContent(XML_Parser parser, * reused as appropriate. */ static void -freeBindings(XML_Parser parser, BINDING *bindings) -{ +freeBindings(XML_Parser parser, BINDING *bindings) { while (bindings) { BINDING *b = bindings; @@ -3142,7 +3013,7 @@ freeBindings(XML_Parser parser, BINDING *bindings) * binding in addBindings(), so call the end handler now. */ if (parser->m_endNamespaceDeclHandler) - parser->m_endNamespaceDeclHandler(parser->m_handlerArg, b->prefix->name); + parser->m_endNamespaceDeclHandler(parser->m_handlerArg, b->prefix->name); bindings = bindings->nextTagBinding; b->nextTagBinding = parser->m_freeBindingList; @@ -3162,14 +3033,12 @@ freeBindings(XML_Parser parser, BINDING *bindings) - generate namespace aware element name (URI, prefix) */ static enum XML_Error -storeAtts(XML_Parser parser, const ENCODING *enc, - const char *attStr, TAG_NAME *tagNamePtr, - BINDING **bindingsPtr) -{ - DTD * const dtd = parser->m_dtd; /* save one level of indirection */ +storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, + TAG_NAME *tagNamePtr, BINDING **bindingsPtr) { + DTD *const dtd = parser->m_dtd; /* save one level of indirection */ ELEMENT_TYPE *elementType; int nDefaultAtts; - const XML_Char **appAtts; /* the attribute list for the application */ + const XML_Char **appAtts; /* the attribute list for the application */ int attIndex = 0; int prefixLen; int i; @@ -3180,16 +3049,17 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const XML_Char *localPart; /* lookup the element type name */ - elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, tagNamePtr->str,0); - if (!elementType) { + elementType + = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, tagNamePtr->str, 0); + if (! elementType) { const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str); - if (!name) + if (! name) return XML_ERROR_NO_MEMORY; elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, name, sizeof(ELEMENT_TYPE)); - if (!elementType) + if (! elementType) return XML_ERROR_NO_MEMORY; - if (parser->m_ns && !setElementTypePrefix(parser, elementType)) + if (parser->m_ns && ! setElementTypePrefix(parser, elementType)) return XML_ERROR_NO_MEMORY; } nDefaultAtts = elementType->nDefaultAtts; @@ -3203,14 +3073,16 @@ storeAtts(XML_Parser parser, const ENCODING *enc, XML_AttrInfo *temp2; #endif parser->m_attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; - temp = (ATTRIBUTE *)REALLOC(parser, (void *)parser->m_atts, parser->m_attsSize * sizeof(ATTRIBUTE)); + temp = (ATTRIBUTE *)REALLOC(parser, (void *)parser->m_atts, + parser->m_attsSize * sizeof(ATTRIBUTE)); if (temp == NULL) { parser->m_attsSize = oldAttsSize; return XML_ERROR_NO_MEMORY; } parser->m_atts = temp; #ifdef XML_ATTR_INFO - temp2 = (XML_AttrInfo *)REALLOC(parser, (void *)parser->m_attInfo, parser->m_attsSize * sizeof(XML_AttrInfo)); + temp2 = (XML_AttrInfo *)REALLOC(parser, (void *)parser->m_attInfo, + parser->m_attsSize * sizeof(XML_AttrInfo)); if (temp2 == NULL) { parser->m_attsSize = oldAttsSize; return XML_ERROR_NO_MEMORY; @@ -3228,18 +3100,20 @@ storeAtts(XML_Parser parser, const ENCODING *enc, XML_AttrInfo *currAttInfo = &parser->m_attInfo[i]; #endif /* add the name and value to the attribute list */ - ATTRIBUTE_ID *attId = getAttributeId(parser, enc, currAtt->name, - currAtt->name - + XmlNameLength(enc, currAtt->name)); - if (!attId) + ATTRIBUTE_ID *attId + = getAttributeId(parser, enc, currAtt->name, + currAtt->name + XmlNameLength(enc, currAtt->name)); + if (! attId) return XML_ERROR_NO_MEMORY; #ifdef XML_ATTR_INFO - currAttInfo->nameStart = parser->m_parseEndByteIndex - (parser->m_parseEndPtr - currAtt->name); - currAttInfo->nameEnd = currAttInfo->nameStart + - XmlNameLength(enc, currAtt->name); - currAttInfo->valueStart = parser->m_parseEndByteIndex - - (parser->m_parseEndPtr - currAtt->valuePtr); - currAttInfo->valueEnd = parser->m_parseEndByteIndex - (parser->m_parseEndPtr - currAtt->valueEnd); + currAttInfo->nameStart + = parser->m_parseEndByteIndex - (parser->m_parseEndPtr - currAtt->name); + currAttInfo->nameEnd + = currAttInfo->nameStart + XmlNameLength(enc, currAtt->name); + currAttInfo->valueStart = parser->m_parseEndByteIndex + - (parser->m_parseEndPtr - currAtt->valuePtr); + currAttInfo->valueEnd = parser->m_parseEndByteIndex + - (parser->m_parseEndPtr - currAtt->valueEnd); #endif /* Detect duplicate attributes by their QNames. This does not work when namespace processing is turned on and different prefixes for the same @@ -3252,7 +3126,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc, } (attId->name)[-1] = 1; appAtts[attIndex++] = attId->name; - if (!parser->m_atts[i].normalized) { + if (! parser->m_atts[i].normalized) { enum XML_Error result; XML_Bool isCdata = XML_TRUE; @@ -3268,17 +3142,17 @@ storeAtts(XML_Parser parser, const ENCODING *enc, } /* normalize the attribute value */ - result = storeAttributeValue(parser, enc, isCdata, - parser->m_atts[i].valuePtr, parser->m_atts[i].valueEnd, - &parser->m_tempPool); + result = storeAttributeValue( + parser, enc, isCdata, parser->m_atts[i].valuePtr, + parser->m_atts[i].valueEnd, &parser->m_tempPool); if (result) return result; appAtts[attIndex] = poolStart(&parser->m_tempPool); poolFinish(&parser->m_tempPool); - } - else { + } else { /* the value did not need normalizing */ - appAtts[attIndex] = poolStoreString(&parser->m_tempPool, enc, parser->m_atts[i].valuePtr, + appAtts[attIndex] = poolStoreString(&parser->m_tempPool, enc, + parser->m_atts[i].valuePtr, parser->m_atts[i].valueEnd); if (appAtts[attIndex] == 0) return XML_ERROR_NO_MEMORY; @@ -3293,15 +3167,13 @@ storeAtts(XML_Parser parser, const ENCODING *enc, if (result) return result; --attIndex; - } - else { + } else { /* deal with other prefixed names later */ attIndex++; nPrefixes++; (attId->name)[-1] = 2; } - } - else + } else attIndex++; } @@ -3313,29 +3185,26 @@ storeAtts(XML_Parser parser, const ENCODING *enc, parser->m_idAttIndex = i; break; } - } - else + } else parser->m_idAttIndex = -1; /* do attribute defaulting */ for (i = 0; i < nDefaultAtts; i++) { const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + i; - if (!(da->id->name)[-1] && da->value) { + if (! (da->id->name)[-1] && da->value) { if (da->id->prefix) { if (da->id->xmlns) { enum XML_Error result = addBinding(parser, da->id->prefix, da->id, da->value, bindingsPtr); if (result) return result; - } - else { + } else { (da->id->name)[-1] = 2; nPrefixes++; appAtts[attIndex++] = da->id->name; appAtts[attIndex++] = da->value; } - } - else { + } else { (da->id->name)[-1] = 1; appAtts[attIndex++] = da->id->name; appAtts[attIndex++] = da->value; @@ -3348,31 +3217,34 @@ storeAtts(XML_Parser parser, const ENCODING *enc, and clear flags that say whether attributes were specified */ i = 0; if (nPrefixes) { - int j; /* hash table index */ + int j; /* hash table index */ unsigned long version = parser->m_nsAttsVersion; int nsAttsSize = (int)1 << parser->m_nsAttsPower; unsigned char oldNsAttsPower = parser->m_nsAttsPower; /* size of hash table must be at least 2 * (# of prefixed attributes) */ - if ((nPrefixes << 1) >> parser->m_nsAttsPower) { /* true for m_nsAttsPower = 0 */ + if ((nPrefixes << 1) + >> parser->m_nsAttsPower) { /* true for m_nsAttsPower = 0 */ NS_ATT *temp; /* hash table size must also be a power of 2 and >= 8 */ - while (nPrefixes >> parser->m_nsAttsPower++); + while (nPrefixes >> parser->m_nsAttsPower++) + ; if (parser->m_nsAttsPower < 3) parser->m_nsAttsPower = 3; nsAttsSize = (int)1 << parser->m_nsAttsPower; - temp = (NS_ATT *)REALLOC(parser, parser->m_nsAtts, nsAttsSize * sizeof(NS_ATT)); - if (!temp) { + temp = (NS_ATT *)REALLOC(parser, parser->m_nsAtts, + nsAttsSize * sizeof(NS_ATT)); + if (! temp) { /* Restore actual size of memory in m_nsAtts */ parser->m_nsAttsPower = oldNsAttsPower; return XML_ERROR_NO_MEMORY; } parser->m_nsAtts = temp; - version = 0; /* force re-initialization of m_nsAtts hash table */ + version = 0; /* force re-initialization of m_nsAtts hash table */ } /* using a version flag saves us from initializing m_nsAtts every time */ - if (!version) { /* initialize version flags when version wraps around */ + if (! version) { /* initialize version flags when version wraps around */ version = INIT_ATTS_VERSION; - for (j = nsAttsSize; j != 0; ) + for (j = nsAttsSize; j != 0;) parser->m_nsAtts[--j].version = version; } parser->m_nsAttsVersion = --version; @@ -3380,7 +3252,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc, /* expand prefixed names and check for duplicates */ for (; i < attIndex; i += 2) { const XML_Char *s = appAtts[i]; - if (s[-1] == 2) { /* prefixed */ + if (s[-1] == 2) { /* prefixed */ ATTRIBUTE_ID *id; const BINDING *b; unsigned long uriHash; @@ -3390,9 +3262,9 @@ storeAtts(XML_Parser parser, const ENCODING *enc, copy_salt_to_sipkey(parser, &sip_key); sip24_init(&sip_state, &sip_key); - ((XML_Char *)s)[-1] = 0; /* clear flag */ + ((XML_Char *)s)[-1] = 0; /* clear flag */ id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, s, 0); - if (!id || !id->prefix) { + if (! id || ! id->prefix) { /* This code is walking through the appAtts array, dealing * with (in this case) a prefixed attribute name. To be in * the array, the attribute must have already been bound, so @@ -3410,12 +3282,12 @@ storeAtts(XML_Parser parser, const ENCODING *enc, return XML_ERROR_NO_MEMORY; /* LCOV_EXCL_LINE */ } b = id->prefix->binding; - if (!b) + if (! b) return XML_ERROR_UNBOUND_PREFIX; for (j = 0; j < b->uriLen; j++) { const XML_Char c = b->uri[j]; - if (!poolAppendChar(&parser->m_tempPool, c)) + if (! poolAppendChar(&parser->m_tempPool, c)) return XML_ERROR_NO_MEMORY; } @@ -3426,8 +3298,8 @@ storeAtts(XML_Parser parser, const ENCODING *enc, sip24_update(&sip_state, s, keylen(s) * sizeof(XML_Char)); - do { /* copies null terminator */ - if (!poolAppendChar(&parser->m_tempPool, *s)) + do { /* copies null terminator */ + if (! poolAppendChar(&parser->m_tempPool, *s)) return XML_ERROR_NO_MEMORY; } while (*s++); @@ -3438,28 +3310,29 @@ storeAtts(XML_Parser parser, const ENCODING *enc, */ unsigned char step = 0; unsigned long mask = nsAttsSize - 1; - j = uriHash & mask; /* index into hash table */ + j = uriHash & mask; /* index into hash table */ while (parser->m_nsAtts[j].version == version) { /* for speed we compare stored hash values first */ if (uriHash == parser->m_nsAtts[j].hash) { const XML_Char *s1 = poolStart(&parser->m_tempPool); const XML_Char *s2 = parser->m_nsAtts[j].uriName; /* s1 is null terminated, but not s2 */ - for (; *s1 == *s2 && *s1 != 0; s1++, s2++); + for (; *s1 == *s2 && *s1 != 0; s1++, s2++) + ; if (*s1 == 0) return XML_ERROR_DUPLICATE_ATTRIBUTE; } - if (!step) + if (! step) step = PROBE_STEP(uriHash, mask, parser->m_nsAttsPower); j < step ? (j += nsAttsSize - step) : (j -= step); } } - if (parser->m_ns_triplets) { /* append namespace separator and prefix */ + if (parser->m_ns_triplets) { /* append namespace separator and prefix */ parser->m_tempPool.ptr[-1] = parser->m_namespaceSeparator; s = b->prefix->name; do { - if (!poolAppendChar(&parser->m_tempPool, *s)) + if (! poolAppendChar(&parser->m_tempPool, *s)) return XML_ERROR_NO_MEMORY; } while (*s++); } @@ -3474,13 +3347,12 @@ storeAtts(XML_Parser parser, const ENCODING *enc, parser->m_nsAtts[j].hash = uriHash; parser->m_nsAtts[j].uriName = s; - if (!--nPrefixes) { + if (! --nPrefixes) { i += 2; break; } - } - else /* not prefixed */ - ((XML_Char *)s)[-1] = 0; /* clear flag */ + } else /* not prefixed */ + ((XML_Char *)s)[-1] = 0; /* clear flag */ } } /* clear flags for the remaining attributes */ @@ -3489,40 +3361,38 @@ storeAtts(XML_Parser parser, const ENCODING *enc, for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding) binding->attId->name[-1] = 0; - if (!parser->m_ns) + if (! parser->m_ns) return XML_ERROR_NONE; /* expand the element type name */ if (elementType->prefix) { binding = elementType->prefix->binding; - if (!binding) + if (! binding) return XML_ERROR_UNBOUND_PREFIX; localPart = tagNamePtr->str; while (*localPart++ != XML_T(ASCII_COLON)) ; - } - else if (dtd->defaultPrefix.binding) { + } else if (dtd->defaultPrefix.binding) { binding = dtd->defaultPrefix.binding; localPart = tagNamePtr->str; - } - else + } else return XML_ERROR_NONE; prefixLen = 0; if (parser->m_ns_triplets && binding->prefix->name) { for (; binding->prefix->name[prefixLen++];) - ; /* prefixLen includes null terminator */ + ; /* prefixLen includes null terminator */ } tagNamePtr->localPart = localPart; tagNamePtr->uriLen = binding->uriLen; tagNamePtr->prefix = binding->prefix->name; tagNamePtr->prefixLen = prefixLen; for (i = 0; localPart[i++];) - ; /* i includes null terminator */ + ; /* i includes null terminator */ n = i + binding->uriLen + prefixLen; if (n > binding->uriAlloc) { TAG *p; uri = (XML_Char *)MALLOC(parser, (n + EXPAND_SPARE) * sizeof(XML_Char)); - if (!uri) + if (! uri) return XML_ERROR_NO_MEMORY; binding->uriAlloc = n + EXPAND_SPARE; memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char)); @@ -3538,7 +3408,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc, /* we always have a namespace separator between localPart and prefix */ if (prefixLen) { uri += i - 1; - *uri = parser->m_namespaceSeparator; /* replace null terminator */ + *uri = parser->m_namespaceSeparator; /* replace null terminator */ memcpy(uri + 1, binding->prefix->name, prefixLen * sizeof(XML_Char)); } tagNamePtr->str = binding->uri; @@ -3550,27 +3420,25 @@ storeAtts(XML_Parser parser, const ENCODING *enc, */ static enum XML_Error addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, - const XML_Char *uri, BINDING **bindingsPtr) -{ - static const XML_Char xmlNamespace[] = { - ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH, - ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, - ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, - ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, ASCII_8, ASCII_SLASH, - ASCII_n, ASCII_a, ASCII_m, ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c, - ASCII_e, '\0' - }; - static const int xmlLen = - (int)sizeof(xmlNamespace)/sizeof(XML_Char) - 1; - static const XML_Char xmlnsNamespace[] = { - ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH, - ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, - ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_2, ASCII_0, ASCII_0, - ASCII_0, ASCII_SLASH, ASCII_x, ASCII_m, ASCII_l, ASCII_n, ASCII_s, - ASCII_SLASH, '\0' - }; - static const int xmlnsLen = - (int)sizeof(xmlnsNamespace)/sizeof(XML_Char) - 1; + const XML_Char *uri, BINDING **bindingsPtr) { + static const XML_Char xmlNamespace[] + = {ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, + ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, + ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, + ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, + ASCII_L, ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, + ASCII_8, ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, + ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c, + ASCII_e, '\0'}; + static const int xmlLen = (int)sizeof(xmlNamespace) / sizeof(XML_Char) - 1; + static const XML_Char xmlnsNamespace[] + = {ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, + ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, + ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, + ASCII_2, ASCII_0, ASCII_0, ASCII_0, ASCII_SLASH, ASCII_x, + ASCII_m, ASCII_l, ASCII_n, ASCII_s, ASCII_SLASH, '\0'}; + static const int xmlnsLen + = (int)sizeof(xmlnsNamespace) / sizeof(XML_Char) - 1; XML_Bool mustBeXML = XML_FALSE; XML_Bool isXML = XML_TRUE; @@ -3583,14 +3451,11 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, if (*uri == XML_T('\0') && prefix->name) return XML_ERROR_UNDECLARING_PREFIX; - if (prefix->name - && prefix->name[0] == XML_T(ASCII_x) + if (prefix->name && prefix->name[0] == XML_T(ASCII_x) && prefix->name[1] == XML_T(ASCII_m) && prefix->name[2] == XML_T(ASCII_l)) { - /* Not allowed to bind xmlns */ - if (prefix->name[3] == XML_T(ASCII_n) - && prefix->name[4] == XML_T(ASCII_s) + if (prefix->name[3] == XML_T(ASCII_n) && prefix->name[4] == XML_T(ASCII_s) && prefix->name[5] == XML_T('\0')) return XML_ERROR_RESERVED_PREFIX_XMLNS; @@ -3602,7 +3467,7 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, if (isXML && (len > xmlLen || uri[len] != xmlNamespace[len])) isXML = XML_FALSE; - if (!mustBeXML && isXMLNS + if (! mustBeXML && isXMLNS && (len > xmlnsLen || uri[len] != xmlnsNamespace[len])) isXMLNS = XML_FALSE; } @@ -3621,21 +3486,21 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, if (parser->m_freeBindingList) { b = parser->m_freeBindingList; if (len > b->uriAlloc) { - XML_Char *temp = (XML_Char *)REALLOC(parser, b->uri, - sizeof(XML_Char) * (len + EXPAND_SPARE)); + XML_Char *temp = (XML_Char *)REALLOC( + parser, b->uri, sizeof(XML_Char) * (len + EXPAND_SPARE)); if (temp == NULL) return XML_ERROR_NO_MEMORY; b->uri = temp; b->uriAlloc = len + EXPAND_SPARE; } parser->m_freeBindingList = b->nextTagBinding; - } - else { + } else { b = (BINDING *)MALLOC(parser, sizeof(BINDING)); - if (!b) + if (! b) return XML_ERROR_NO_MEMORY; - b->uri = (XML_Char *)MALLOC(parser, sizeof(XML_Char) * (len + EXPAND_SPARE)); - if (!b->uri) { + b->uri + = (XML_Char *)MALLOC(parser, sizeof(XML_Char) * (len + EXPAND_SPARE)); + if (! b->uri) { FREE(parser, b); return XML_ERROR_NO_MEMORY; } @@ -3658,7 +3523,7 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, /* if attId == NULL then we are not starting a namespace scope */ if (attId && parser->m_startNamespaceDeclHandler) parser->m_startNamespaceDeclHandler(parser->m_handlerArg, prefix->name, - prefix->binding ? uri : 0); + prefix->binding ? uri : 0); return XML_ERROR_NONE; } @@ -3666,21 +3531,18 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, the whole file is parsed with one call. */ static enum XML_Error PTRCALL -cdataSectionProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doCdataSection(parser, parser->m_encoding, &start, end, - endPtr, (XML_Bool)!parser->m_parsingStatus.finalBuffer); +cdataSectionProcessor(XML_Parser parser, const char *start, const char *end, + const char **endPtr) { + enum XML_Error result + = doCdataSection(parser, parser->m_encoding, &start, end, endPtr, + (XML_Bool)! parser->m_parsingStatus.finalBuffer); if (result != XML_ERROR_NONE) return result; if (start) { - if (parser->m_parentParser) { /* we are parsing an external entity */ + if (parser->m_parentParser) { /* we are parsing an external entity */ parser->m_processor = externalEntityContentProcessor; return externalEntityContentProcessor(parser, start, end, endPtr); - } - else { + } else { parser->m_processor = contentProcessor; return contentProcessor(parser, start, end, endPtr); } @@ -3692,13 +3554,8 @@ cdataSectionProcessor(XML_Parser parser, the section is not yet closed. */ static enum XML_Error -doCdataSection(XML_Parser parser, - const ENCODING *enc, - const char **startPtr, - const char *end, - const char **nextPtr, - XML_Bool haveMore) -{ +doCdataSection(XML_Parser parser, const ENCODING *enc, const char **startPtr, + const char *end, const char **nextPtr, XML_Bool haveMore) { const char *s = *startPtr; const char **eventPP; const char **eventEndPP; @@ -3706,8 +3563,7 @@ doCdataSection(XML_Parser parser, eventPP = &parser->m_eventPtr; *eventPP = s; eventEndPP = &parser->m_eventEndPtr; - } - else { + } else { eventPP = &(parser->m_openInternalEntities->internalEventPtr); eventEndPP = &(parser->m_openInternalEntities->internalEventEndPtr); } @@ -3722,11 +3578,12 @@ doCdataSection(XML_Parser parser, case XML_TOK_CDATA_SECT_CLOSE: if (parser->m_endCdataSectionHandler) parser->m_endCdataSectionHandler(parser->m_handlerArg); -/* BEGIN disabled code */ + /* BEGIN disabled code */ /* see comment under XML_TOK_CDATA_SECT_OPEN */ else if (0 && parser->m_characterDataHandler) - parser->m_characterDataHandler(parser->m_handlerArg, parser->m_dataBuf, 0); -/* END disabled code */ + parser->m_characterDataHandler(parser->m_handlerArg, parser->m_dataBuf, + 0); + /* END disabled code */ else if (parser->m_defaultHandler) reportDefault(parser, enc, s, next); *startPtr = next; @@ -3739,35 +3596,31 @@ doCdataSection(XML_Parser parser, if (parser->m_characterDataHandler) { XML_Char c = 0xA; parser->m_characterDataHandler(parser->m_handlerArg, &c, 1); - } - else if (parser->m_defaultHandler) + } else if (parser->m_defaultHandler) reportDefault(parser, enc, s, next); break; - case XML_TOK_DATA_CHARS: - { - XML_CharacterDataHandler charDataHandler = parser->m_characterDataHandler; - if (charDataHandler) { - if (MUST_CONVERT(enc, s)) { - for (;;) { - ICHAR *dataPtr = (ICHAR *)parser->m_dataBuf; - const enum XML_Convert_Result convert_res = XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)parser->m_dataBufEnd); - *eventEndPP = next; - charDataHandler(parser->m_handlerArg, parser->m_dataBuf, - (int)(dataPtr - (ICHAR *)parser->m_dataBuf)); - if ((convert_res == XML_CONVERT_COMPLETED) || (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) - break; - *eventPP = s; - } + case XML_TOK_DATA_CHARS: { + XML_CharacterDataHandler charDataHandler = parser->m_characterDataHandler; + if (charDataHandler) { + if (MUST_CONVERT(enc, s)) { + for (;;) { + ICHAR *dataPtr = (ICHAR *)parser->m_dataBuf; + const enum XML_Convert_Result convert_res = XmlConvert( + enc, &s, next, &dataPtr, (ICHAR *)parser->m_dataBufEnd); + *eventEndPP = next; + charDataHandler(parser->m_handlerArg, parser->m_dataBuf, + (int)(dataPtr - (ICHAR *)parser->m_dataBuf)); + if ((convert_res == XML_CONVERT_COMPLETED) + || (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) + break; + *eventPP = s; } - else - charDataHandler(parser->m_handlerArg, - (XML_Char *)s, - (int)((XML_Char *)next - (XML_Char *)s)); - } - else if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - } - break; + } else + charDataHandler(parser->m_handlerArg, (XML_Char *)s, + (int)((XML_Char *)next - (XML_Char *)s)); + } else if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + } break; case XML_TOK_INVALID: *eventPP = next; return XML_ERROR_INVALID_TOKEN; @@ -3791,7 +3644,7 @@ doCdataSection(XML_Parser parser, * statistics. * * LCOV_EXCL_START - */ + */ *eventPP = next; return XML_ERROR_UNEXPECTED_STATE; /* LCOV_EXCL_STOP */ @@ -3804,7 +3657,7 @@ doCdataSection(XML_Parser parser, return XML_ERROR_NONE; case XML_FINISHED: return XML_ERROR_ABORTED; - default: ; + default:; } } /* not reached */ @@ -3816,13 +3669,11 @@ doCdataSection(XML_Parser parser, the whole file is parsed with one call. */ static enum XML_Error PTRCALL -ignoreSectionProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doIgnoreSection(parser, parser->m_encoding, &start, end, - endPtr, (XML_Bool)!parser->m_parsingStatus.finalBuffer); +ignoreSectionProcessor(XML_Parser parser, const char *start, const char *end, + const char **endPtr) { + enum XML_Error result + = doIgnoreSection(parser, parser->m_encoding, &start, end, endPtr, + (XML_Bool)! parser->m_parsingStatus.finalBuffer); if (result != XML_ERROR_NONE) return result; if (start) { @@ -3836,13 +3687,8 @@ ignoreSectionProcessor(XML_Parser parser, if the section is not yet closed. */ static enum XML_Error -doIgnoreSection(XML_Parser parser, - const ENCODING *enc, - const char **startPtr, - const char *end, - const char **nextPtr, - XML_Bool haveMore) -{ +doIgnoreSection(XML_Parser parser, const ENCODING *enc, const char **startPtr, + const char *end, const char **nextPtr, XML_Bool haveMore) { const char *next; int tok; const char *s = *startPtr; @@ -3852,8 +3698,7 @@ doIgnoreSection(XML_Parser parser, eventPP = &parser->m_eventPtr; *eventPP = s; eventEndPP = &parser->m_eventEndPtr; - } - else { + } else { /* It's not entirely clear, but it seems the following two lines * of code cannot be executed. The only occasions on which 'enc' * is not 'encoding' are when this function is called @@ -3917,13 +3762,12 @@ doIgnoreSection(XML_Parser parser, #endif /* XML_DTD */ static enum XML_Error -initializeEncoding(XML_Parser parser) -{ +initializeEncoding(XML_Parser parser) { const char *s; #ifdef XML_UNICODE char encodingBuf[128]; /* See comments abount `protoclEncodingName` in parserInit() */ - if (!parser->m_protocolEncodingName) + if (! parser->m_protocolEncodingName) s = NULL; else { int i; @@ -3941,15 +3785,15 @@ initializeEncoding(XML_Parser parser) #else s = parser->m_protocolEncodingName; #endif - if ((parser->m_ns ? XmlInitEncodingNS : XmlInitEncoding)(&parser->m_initEncoding, &parser->m_encoding, s)) + if ((parser->m_ns ? XmlInitEncodingNS : XmlInitEncoding)( + &parser->m_initEncoding, &parser->m_encoding, s)) return XML_ERROR_NONE; return handleUnknownEncoding(parser, parser->m_protocolEncodingName); } static enum XML_Error -processXmlDecl(XML_Parser parser, int isGeneralTextEntity, - const char *s, const char *next) -{ +processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *s, + const char *next) { const char *encodingName = NULL; const XML_Char *storedEncName = NULL; const ENCODING *newEncoding = NULL; @@ -3957,52 +3801,41 @@ processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *versionend; const XML_Char *storedversion = NULL; int standalone = -1; - if (!(parser->m_ns - ? XmlParseXmlDeclNS - : XmlParseXmlDecl)(isGeneralTextEntity, - parser->m_encoding, - s, - next, - &parser->m_eventPtr, - &version, - &versionend, - &encodingName, - &newEncoding, - &standalone)) { + if (! (parser->m_ns ? XmlParseXmlDeclNS : XmlParseXmlDecl)( + isGeneralTextEntity, parser->m_encoding, s, next, &parser->m_eventPtr, + &version, &versionend, &encodingName, &newEncoding, &standalone)) { if (isGeneralTextEntity) return XML_ERROR_TEXT_DECL; else return XML_ERROR_XML_DECL; } - if (!isGeneralTextEntity && standalone == 1) { + if (! isGeneralTextEntity && standalone == 1) { parser->m_dtd->standalone = XML_TRUE; #ifdef XML_DTD - if (parser->m_paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE) + if (parser->m_paramEntityParsing + == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE) parser->m_paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; #endif /* XML_DTD */ } if (parser->m_xmlDeclHandler) { if (encodingName != NULL) { - storedEncName = poolStoreString(&parser->m_temp2Pool, - parser->m_encoding, - encodingName, - encodingName - + XmlNameLength(parser->m_encoding, encodingName)); - if (!storedEncName) - return XML_ERROR_NO_MEMORY; + storedEncName = poolStoreString( + &parser->m_temp2Pool, parser->m_encoding, encodingName, + encodingName + XmlNameLength(parser->m_encoding, encodingName)); + if (! storedEncName) + return XML_ERROR_NO_MEMORY; poolFinish(&parser->m_temp2Pool); } if (version) { - storedversion = poolStoreString(&parser->m_temp2Pool, - parser->m_encoding, - version, - versionend - parser->m_encoding->minBytesPerChar); - if (!storedversion) + storedversion + = poolStoreString(&parser->m_temp2Pool, parser->m_encoding, version, + versionend - parser->m_encoding->minBytesPerChar); + if (! storedversion) return XML_ERROR_NO_MEMORY; } - parser->m_xmlDeclHandler(parser->m_handlerArg, storedversion, storedEncName, standalone); - } - else if (parser->m_defaultHandler) + parser->m_xmlDeclHandler(parser->m_handlerArg, storedversion, storedEncName, + standalone); + } else if (parser->m_defaultHandler) reportDefault(parser, parser->m_encoding, s, next); if (parser->m_protocolEncodingName == NULL) { if (newEncoding) { @@ -4012,20 +3845,19 @@ processXmlDecl(XML_Parser parser, int isGeneralTextEntity, * this is UTF-16, is it the same endianness? */ if (newEncoding->minBytesPerChar != parser->m_encoding->minBytesPerChar - || (newEncoding->minBytesPerChar == 2 && - newEncoding != parser->m_encoding)) { + || (newEncoding->minBytesPerChar == 2 + && newEncoding != parser->m_encoding)) { parser->m_eventPtr = encodingName; return XML_ERROR_INCORRECT_ENCODING; } parser->m_encoding = newEncoding; - } - else if (encodingName) { + } else if (encodingName) { enum XML_Error result; - if (!storedEncName) { + if (! storedEncName) { storedEncName = poolStoreString( - &parser->m_temp2Pool, parser->m_encoding, encodingName, - encodingName + XmlNameLength(parser->m_encoding, encodingName)); - if (!storedEncName) + &parser->m_temp2Pool, parser->m_encoding, encodingName, + encodingName + XmlNameLength(parser->m_encoding, encodingName)); + if (! storedEncName) return XML_ERROR_NO_MEMORY; } result = handleUnknownEncoding(parser, storedEncName); @@ -4043,8 +3875,7 @@ processXmlDecl(XML_Parser parser, int isGeneralTextEntity, } static enum XML_Error -handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) -{ +handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) { if (parser->m_unknownEncodingHandler) { XML_Encoding info; int i; @@ -4053,21 +3884,17 @@ handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) info.convert = NULL; info.data = NULL; info.release = NULL; - if (parser->m_unknownEncodingHandler(parser->m_unknownEncodingHandlerData, encodingName, - &info)) { + if (parser->m_unknownEncodingHandler(parser->m_unknownEncodingHandlerData, + encodingName, &info)) { ENCODING *enc; parser->m_unknownEncodingMem = MALLOC(parser, XmlSizeOfUnknownEncoding()); - if (!parser->m_unknownEncodingMem) { + if (! parser->m_unknownEncodingMem) { if (info.release) info.release(info.data); return XML_ERROR_NO_MEMORY; } - enc = (parser->m_ns - ? XmlInitUnknownEncodingNS - : XmlInitUnknownEncoding)(parser->m_unknownEncodingMem, - info.map, - info.convert, - info.data); + enc = (parser->m_ns ? XmlInitUnknownEncodingNS : XmlInitUnknownEncoding)( + parser->m_unknownEncodingMem, info.map, info.convert, info.data); if (enc) { parser->m_unknownEncodingData = info.data; parser->m_unknownEncodingRelease = info.release; @@ -4082,11 +3909,8 @@ handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) } static enum XML_Error PTRCALL -prologInitProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ +prologInitProcessor(XML_Parser parser, const char *s, const char *end, + const char **nextPtr) { enum XML_Error result = initializeEncoding(parser); if (result != XML_ERROR_NONE) return result; @@ -4097,11 +3921,8 @@ prologInitProcessor(XML_Parser parser, #ifdef XML_DTD static enum XML_Error PTRCALL -externalParEntInitProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ +externalParEntInitProcessor(XML_Parser parser, const char *s, const char *end, + const char **nextPtr) { enum XML_Error result = initializeEncoding(parser); if (result != XML_ERROR_NONE) return result; @@ -4113,19 +3934,15 @@ externalParEntInitProcessor(XML_Parser parser, if (parser->m_prologState.inEntityValue) { parser->m_processor = entityValueInitProcessor; return entityValueInitProcessor(parser, s, end, nextPtr); - } - else { + } else { parser->m_processor = externalParEntProcessor; return externalParEntProcessor(parser, s, end, nextPtr); } } static enum XML_Error PTRCALL -entityValueInitProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ +entityValueInitProcessor(XML_Parser parser, const char *s, const char *end, + const char **nextPtr) { int tok; const char *start = s; const char *next = start; @@ -4135,7 +3952,7 @@ entityValueInitProcessor(XML_Parser parser, tok = XmlPrologTok(parser->m_encoding, start, end, &next); parser->m_eventEndPtr = next; if (tok <= 0) { - if (!parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) { + if (! parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) { *nextPtr = s; return XML_ERROR_NONE; } @@ -4146,22 +3963,21 @@ entityValueInitProcessor(XML_Parser parser, return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: /* start == end */ + case XML_TOK_NONE: /* start == end */ default: break; } /* found end of entity value - can store it now */ return storeEntityValue(parser, parser->m_encoding, s, end); - } - else if (tok == XML_TOK_XML_DECL) { + } else if (tok == XML_TOK_XML_DECL) { enum XML_Error result; result = processXmlDecl(parser, 0, start, next); if (result != XML_ERROR_NONE) return result; - /* At this point, m_parsingStatus.parsing cannot be XML_SUSPENDED. For that - * to happen, a parameter entity parsing handler must have - * attempted to suspend the parser, which fails and raises an - * error. The parser can be aborted, but can't be suspended. + /* At this point, m_parsingStatus.parsing cannot be XML_SUSPENDED. For + * that to happen, a parameter entity parsing handler must have attempted + * to suspend the parser, which fails and raises an error. The parser can + * be aborted, but can't be suspended. */ if (parser->m_parsingStatus.parsing == XML_FINISHED) return XML_ERROR_ABORTED; @@ -4177,7 +3993,8 @@ entityValueInitProcessor(XML_Parser parser, then, when this routine is entered the next time, XmlPrologTok will return XML_TOK_INVALID, since the BOM is still in the buffer */ - else if (tok == XML_TOK_BOM && next == end && !parser->m_parsingStatus.finalBuffer) { + else if (tok == XML_TOK_BOM && next == end + && ! parser->m_parsingStatus.finalBuffer) { *nextPtr = next; return XML_ERROR_NONE; } @@ -4195,17 +4012,14 @@ entityValueInitProcessor(XML_Parser parser, } static enum XML_Error PTRCALL -externalParEntProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ +externalParEntProcessor(XML_Parser parser, const char *s, const char *end, + const char **nextPtr) { const char *next = s; int tok; tok = XmlPrologTok(parser->m_encoding, s, end, &next); if (tok <= 0) { - if (!parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) { + if (! parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) { *nextPtr = s; return XML_ERROR_NONE; } @@ -4216,7 +4030,7 @@ externalParEntProcessor(XML_Parser parser, return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: /* start == end */ + case XML_TOK_NONE: /* start == end */ default: break; } @@ -4231,16 +4045,13 @@ externalParEntProcessor(XML_Parser parser, } parser->m_processor = prologProcessor; - return doProlog(parser, parser->m_encoding, s, end, tok, next, - nextPtr, (XML_Bool)!parser->m_parsingStatus.finalBuffer); + return doProlog(parser, parser->m_encoding, s, end, tok, next, nextPtr, + (XML_Bool)! parser->m_parsingStatus.finalBuffer, XML_TRUE); } static enum XML_Error PTRCALL -entityValueProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ +entityValueProcessor(XML_Parser parser, const char *s, const char *end, + const char **nextPtr) { const char *start = s; const char *next = s; const ENCODING *enc = parser->m_encoding; @@ -4249,7 +4060,7 @@ entityValueProcessor(XML_Parser parser, for (;;) { tok = XmlPrologTok(enc, start, end, &next); if (tok <= 0) { - if (!parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) { + if (! parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) { *nextPtr = s; return XML_ERROR_NONE; } @@ -4260,7 +4071,7 @@ entityValueProcessor(XML_Parser parser, return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: /* start == end */ + case XML_TOK_NONE: /* start == end */ default: break; } @@ -4274,52 +4085,46 @@ entityValueProcessor(XML_Parser parser, #endif /* XML_DTD */ static enum XML_Error PTRCALL -prologProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ +prologProcessor(XML_Parser parser, const char *s, const char *end, + const char **nextPtr) { const char *next = s; int tok = XmlPrologTok(parser->m_encoding, s, end, &next); - return doProlog(parser, parser->m_encoding, s, end, tok, next, - nextPtr, (XML_Bool)!parser->m_parsingStatus.finalBuffer); + return doProlog(parser, parser->m_encoding, s, end, tok, next, nextPtr, + (XML_Bool)! parser->m_parsingStatus.finalBuffer, XML_TRUE); } static enum XML_Error -doProlog(XML_Parser parser, - const ENCODING *enc, - const char *s, - const char *end, - int tok, - const char *next, - const char **nextPtr, - XML_Bool haveMore) -{ +doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end, + int tok, const char *next, const char **nextPtr, XML_Bool haveMore, + XML_Bool allowClosingDoctype) { #ifdef XML_DTD - static const XML_Char externalSubsetName[] = { ASCII_HASH , '\0' }; + static const XML_Char externalSubsetName[] = {ASCII_HASH, '\0'}; #endif /* XML_DTD */ - static const XML_Char atypeCDATA[] = - { ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; - static const XML_Char atypeID[] = { ASCII_I, ASCII_D, '\0' }; - static const XML_Char atypeIDREF[] = - { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; - static const XML_Char atypeIDREFS[] = - { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; - static const XML_Char atypeENTITY[] = - { ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; - static const XML_Char atypeENTITIES[] = { ASCII_E, ASCII_N, - ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, '\0' }; - static const XML_Char atypeNMTOKEN[] = { - ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; - static const XML_Char atypeNMTOKENS[] = { ASCII_N, ASCII_M, ASCII_T, - ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, '\0' }; - static const XML_Char notationPrefix[] = { ASCII_N, ASCII_O, ASCII_T, - ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, ASCII_LPAREN, '\0' }; - static const XML_Char enumValueSep[] = { ASCII_PIPE, '\0' }; - static const XML_Char enumValueStart[] = { ASCII_LPAREN, '\0' }; + static const XML_Char atypeCDATA[] + = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'}; + static const XML_Char atypeID[] = {ASCII_I, ASCII_D, '\0'}; + static const XML_Char atypeIDREF[] + = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0'}; + static const XML_Char atypeIDREFS[] + = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0'}; + static const XML_Char atypeENTITY[] + = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0'}; + static const XML_Char atypeENTITIES[] + = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, + ASCII_I, ASCII_E, ASCII_S, '\0'}; + static const XML_Char atypeNMTOKEN[] + = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0'}; + static const XML_Char atypeNMTOKENS[] + = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, + ASCII_E, ASCII_N, ASCII_S, '\0'}; + static const XML_Char notationPrefix[] + = {ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, + ASCII_I, ASCII_O, ASCII_N, ASCII_LPAREN, '\0'}; + static const XML_Char enumValueSep[] = {ASCII_PIPE, '\0'}; + static const XML_Char enumValueStart[] = {ASCII_LPAREN, '\0'}; /* save one level of indirection */ - DTD * const dtd = parser->m_dtd; + DTD *const dtd = parser->m_dtd; const char **eventPP; const char **eventEndPP; @@ -4328,8 +4133,7 @@ doProlog(XML_Parser parser, if (enc == parser->m_encoding) { eventPP = &parser->m_eventPtr; eventEndPP = &parser->m_eventEndPtr; - } - else { + } else { eventPP = &(parser->m_openInternalEntities->internalEventPtr); eventEndPP = &(parser->m_openInternalEntities->internalEventEndPtr); } @@ -4358,7 +4162,8 @@ doProlog(XML_Parser parser, case XML_TOK_NONE: #ifdef XML_DTD /* for internal PE NOT referenced between declarations */ - if (enc != parser->m_encoding && !parser->m_openInternalEntities->betweenDecl) { + if (enc != parser->m_encoding + && ! parser->m_openInternalEntities->betweenDecl) { *nextPtr = s; return XML_ERROR_NONE; } @@ -4383,19 +4188,18 @@ doProlog(XML_Parser parser, } role = XmlTokenRole(&parser->m_prologState, tok, s, next, enc); switch (role) { - case XML_ROLE_XML_DECL: - { - enum XML_Error result = processXmlDecl(parser, 0, s, next); - if (result != XML_ERROR_NONE) - return result; - enc = parser->m_encoding; - handleDefault = XML_FALSE; - } - break; + case XML_ROLE_XML_DECL: { + enum XML_Error result = processXmlDecl(parser, 0, s, next); + if (result != XML_ERROR_NONE) + return result; + enc = parser->m_encoding; + handleDefault = XML_FALSE; + } break; case XML_ROLE_DOCTYPE_NAME: if (parser->m_startDoctypeDeclHandler) { - parser->m_doctypeName = poolStoreString(&parser->m_tempPool, enc, s, next); - if (!parser->m_doctypeName) + parser->m_doctypeName + = poolStoreString(&parser->m_tempPool, enc, s, next); + if (! parser->m_doctypeName) return XML_ERROR_NO_MEMORY; poolFinish(&parser->m_tempPool); parser->m_doctypePubid = NULL; @@ -4405,43 +4209,40 @@ doProlog(XML_Parser parser, break; case XML_ROLE_DOCTYPE_INTERNAL_SUBSET: if (parser->m_startDoctypeDeclHandler) { - parser->m_startDoctypeDeclHandler(parser->m_handlerArg, parser->m_doctypeName, parser->m_doctypeSysid, - parser->m_doctypePubid, 1); + parser->m_startDoctypeDeclHandler( + parser->m_handlerArg, parser->m_doctypeName, parser->m_doctypeSysid, + parser->m_doctypePubid, 1); parser->m_doctypeName = NULL; poolClear(&parser->m_tempPool); handleDefault = XML_FALSE; } break; #ifdef XML_DTD - case XML_ROLE_TEXT_DECL: - { - enum XML_Error result = processXmlDecl(parser, 1, s, next); - if (result != XML_ERROR_NONE) - return result; - enc = parser->m_encoding; - handleDefault = XML_FALSE; - } - break; + case XML_ROLE_TEXT_DECL: { + enum XML_Error result = processXmlDecl(parser, 1, s, next); + if (result != XML_ERROR_NONE) + return result; + enc = parser->m_encoding; + handleDefault = XML_FALSE; + } break; #endif /* XML_DTD */ case XML_ROLE_DOCTYPE_PUBLIC_ID: #ifdef XML_DTD parser->m_useForeignDTD = XML_FALSE; - parser->m_declEntity = (ENTITY *)lookup(parser, - &dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!parser->m_declEntity) + parser->m_declEntity = (ENTITY *)lookup( + parser, &dtd->paramEntities, externalSubsetName, sizeof(ENTITY)); + if (! parser->m_declEntity) return XML_ERROR_NO_MEMORY; #endif /* XML_DTD */ dtd->hasParamEntityRefs = XML_TRUE; if (parser->m_startDoctypeDeclHandler) { XML_Char *pubId; - if (!XmlIsPublicId(enc, s, next, eventPP)) + if (! XmlIsPublicId(enc, s, next, eventPP)) return XML_ERROR_PUBLICID; pubId = poolStoreString(&parser->m_tempPool, enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); - if (!pubId) + if (! pubId) return XML_ERROR_NO_MEMORY; normalizePublicId(pubId); poolFinish(&parser->m_tempPool); @@ -4451,15 +4252,14 @@ doProlog(XML_Parser parser, } /* fall through */ case XML_ROLE_ENTITY_PUBLIC_ID: - if (!XmlIsPublicId(enc, s, next, eventPP)) + if (! XmlIsPublicId(enc, s, next, eventPP)) return XML_ERROR_PUBLICID; alreadyChecked: if (dtd->keepProcessing && parser->m_declEntity) { - XML_Char *tem = poolStoreString(&dtd->pool, - enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!tem) + XML_Char *tem + = poolStoreString(&dtd->pool, enc, s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (! tem) return XML_ERROR_NO_MEMORY; normalizePublicId(tem); parser->m_declEntity->publicId = tem; @@ -4472,9 +4272,15 @@ doProlog(XML_Parser parser, } break; case XML_ROLE_DOCTYPE_CLOSE: + if (allowClosingDoctype != XML_TRUE) { + /* Must not close doctype from within expanded parameter entities */ + return XML_ERROR_INVALID_TOKEN; + } + if (parser->m_doctypeName) { - parser->m_startDoctypeDeclHandler(parser->m_handlerArg, parser->m_doctypeName, - parser->m_doctypeSysid, parser->m_doctypePubid, 0); + parser->m_startDoctypeDeclHandler( + parser->m_handlerArg, parser->m_doctypeName, parser->m_doctypeSysid, + parser->m_doctypePubid, 0); poolClear(&parser->m_tempPool); handleDefault = XML_FALSE; } @@ -4486,12 +4292,11 @@ doProlog(XML_Parser parser, if (parser->m_doctypeSysid || parser->m_useForeignDTD) { XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; dtd->hasParamEntityRefs = XML_TRUE; - if (parser->m_paramEntityParsing && parser->m_externalEntityRefHandler) { - ENTITY *entity = (ENTITY *)lookup(parser, - &dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!entity) { + if (parser->m_paramEntityParsing + && parser->m_externalEntityRefHandler) { + ENTITY *entity = (ENTITY *)lookup(parser, &dtd->paramEntities, + externalSubsetName, sizeof(ENTITY)); + if (! entity) { /* The external subset name "#" will have already been * inserted into the hash table at the start of the * external entity parsing, so no allocation will happen @@ -4502,22 +4307,19 @@ doProlog(XML_Parser parser, if (parser->m_useForeignDTD) entity->base = parser->m_curBase; dtd->paramEntityRead = XML_FALSE; - if (!parser->m_externalEntityRefHandler(parser->m_externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) + if (! parser->m_externalEntityRefHandler( + parser->m_externalEntityRefHandlerArg, 0, entity->base, + entity->systemId, entity->publicId)) return XML_ERROR_EXTERNAL_ENTITY_HANDLING; if (dtd->paramEntityRead) { - if (!dtd->standalone && - parser->m_notStandaloneHandler && - !parser->m_notStandaloneHandler(parser->m_handlerArg)) + if (! dtd->standalone && parser->m_notStandaloneHandler + && ! parser->m_notStandaloneHandler(parser->m_handlerArg)) return XML_ERROR_NOT_STANDALONE; } /* if we didn't read the foreign DTD then this means that there is no external subset and we must reset dtd->hasParamEntityRefs */ - else if (!parser->m_doctypeSysid) + else if (! parser->m_doctypeSysid) dtd->hasParamEntityRefs = hadParamEntityRefs; /* end of DTD - no need to update dtd->keepProcessing */ } @@ -4537,24 +4339,21 @@ doProlog(XML_Parser parser, if (parser->m_useForeignDTD) { XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; dtd->hasParamEntityRefs = XML_TRUE; - if (parser->m_paramEntityParsing && parser->m_externalEntityRefHandler) { + if (parser->m_paramEntityParsing + && parser->m_externalEntityRefHandler) { ENTITY *entity = (ENTITY *)lookup(parser, &dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!entity) + externalSubsetName, sizeof(ENTITY)); + if (! entity) return XML_ERROR_NO_MEMORY; entity->base = parser->m_curBase; dtd->paramEntityRead = XML_FALSE; - if (!parser->m_externalEntityRefHandler(parser->m_externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) + if (! parser->m_externalEntityRefHandler( + parser->m_externalEntityRefHandlerArg, 0, entity->base, + entity->systemId, entity->publicId)) return XML_ERROR_EXTERNAL_ENTITY_HANDLING; if (dtd->paramEntityRead) { - if (!dtd->standalone && - parser->m_notStandaloneHandler && - !parser->m_notStandaloneHandler(parser->m_handlerArg)) + if (! dtd->standalone && parser->m_notStandaloneHandler + && ! parser->m_notStandaloneHandler(parser->m_handlerArg)) return XML_ERROR_NOT_STANDALONE; } /* if we didn't read the foreign DTD then this means that there @@ -4570,12 +4369,12 @@ doProlog(XML_Parser parser, return contentProcessor(parser, s, end, nextPtr); case XML_ROLE_ATTLIST_ELEMENT_NAME: parser->m_declElementType = getElementType(parser, enc, s, next); - if (!parser->m_declElementType) + if (! parser->m_declElementType) return XML_ERROR_NO_MEMORY; goto checkAttListDeclHandler; case XML_ROLE_ATTRIBUTE_NAME: parser->m_declAttributeId = getAttributeId(parser, enc, s, next); - if (!parser->m_declAttributeId) + if (! parser->m_declAttributeId) return XML_ERROR_NO_MEMORY; parser->m_declAttributeIsCdata = XML_FALSE; parser->m_declAttributeType = NULL; @@ -4616,15 +4415,13 @@ doProlog(XML_Parser parser, const XML_Char *prefix; if (parser->m_declAttributeType) { prefix = enumValueSep; + } else { + prefix = (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE ? notationPrefix + : enumValueStart); } - else { - prefix = (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE - ? notationPrefix - : enumValueStart); - } - if (!poolAppendString(&parser->m_tempPool, prefix)) + if (! poolAppendString(&parser->m_tempPool, prefix)) return XML_ERROR_NO_MEMORY; - if (!poolAppend(&parser->m_tempPool, enc, s, next)) + if (! poolAppend(&parser->m_tempPool, enc, s, next)) return XML_ERROR_NO_MEMORY; parser->m_declAttributeType = parser->m_tempPool.start; handleDefault = XML_FALSE; @@ -4633,25 +4430,27 @@ doProlog(XML_Parser parser, case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE: case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE: if (dtd->keepProcessing) { - if (!defineAttribute(parser->m_declElementType, parser->m_declAttributeId, - parser->m_declAttributeIsCdata, parser->m_declAttributeIsId, - 0, parser)) + if (! defineAttribute(parser->m_declElementType, + parser->m_declAttributeId, + parser->m_declAttributeIsCdata, + parser->m_declAttributeIsId, 0, parser)) return XML_ERROR_NO_MEMORY; if (parser->m_attlistDeclHandler && parser->m_declAttributeType) { if (*parser->m_declAttributeType == XML_T(ASCII_LPAREN) || (*parser->m_declAttributeType == XML_T(ASCII_N) && parser->m_declAttributeType[1] == XML_T(ASCII_O))) { /* Enumerated or Notation type */ - if (!poolAppendChar(&parser->m_tempPool, XML_T(ASCII_RPAREN)) - || !poolAppendChar(&parser->m_tempPool, XML_T('\0'))) + if (! poolAppendChar(&parser->m_tempPool, XML_T(ASCII_RPAREN)) + || ! poolAppendChar(&parser->m_tempPool, XML_T('\0'))) return XML_ERROR_NO_MEMORY; parser->m_declAttributeType = parser->m_tempPool.start; poolFinish(&parser->m_tempPool); } *eventEndPP = s; - parser->m_attlistDeclHandler(parser->m_handlerArg, parser->m_declElementType->name, - parser->m_declAttributeId->name, parser->m_declAttributeType, - 0, role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE); + parser->m_attlistDeclHandler( + parser->m_handlerArg, parser->m_declElementType->name, + parser->m_declAttributeId->name, parser->m_declAttributeType, 0, + role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE); poolClear(&parser->m_tempPool); handleDefault = XML_FALSE; } @@ -4661,35 +4460,34 @@ doProlog(XML_Parser parser, case XML_ROLE_FIXED_ATTRIBUTE_VALUE: if (dtd->keepProcessing) { const XML_Char *attVal; - enum XML_Error result = - storeAttributeValue(parser, enc, parser->m_declAttributeIsCdata, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar, - &dtd->pool); + enum XML_Error result = storeAttributeValue( + parser, enc, parser->m_declAttributeIsCdata, + s + enc->minBytesPerChar, next - enc->minBytesPerChar, &dtd->pool); if (result) return result; attVal = poolStart(&dtd->pool); poolFinish(&dtd->pool); /* ID attributes aren't allowed to have a default */ - if (!defineAttribute(parser->m_declElementType, parser->m_declAttributeId, - parser->m_declAttributeIsCdata, XML_FALSE, attVal, parser)) + if (! defineAttribute( + parser->m_declElementType, parser->m_declAttributeId, + parser->m_declAttributeIsCdata, XML_FALSE, attVal, parser)) return XML_ERROR_NO_MEMORY; if (parser->m_attlistDeclHandler && parser->m_declAttributeType) { if (*parser->m_declAttributeType == XML_T(ASCII_LPAREN) || (*parser->m_declAttributeType == XML_T(ASCII_N) && parser->m_declAttributeType[1] == XML_T(ASCII_O))) { /* Enumerated or Notation type */ - if (!poolAppendChar(&parser->m_tempPool, XML_T(ASCII_RPAREN)) - || !poolAppendChar(&parser->m_tempPool, XML_T('\0'))) + if (! poolAppendChar(&parser->m_tempPool, XML_T(ASCII_RPAREN)) + || ! poolAppendChar(&parser->m_tempPool, XML_T('\0'))) return XML_ERROR_NO_MEMORY; parser->m_declAttributeType = parser->m_tempPool.start; poolFinish(&parser->m_tempPool); } *eventEndPP = s; - parser->m_attlistDeclHandler(parser->m_handlerArg, parser->m_declElementType->name, - parser->m_declAttributeId->name, parser->m_declAttributeType, - attVal, - role == XML_ROLE_FIXED_ATTRIBUTE_VALUE); + parser->m_attlistDeclHandler( + parser->m_handlerArg, parser->m_declElementType->name, + parser->m_declAttributeId->name, parser->m_declAttributeType, + attVal, role == XML_ROLE_FIXED_ATTRIBUTE_VALUE); poolClear(&parser->m_tempPool); handleDefault = XML_FALSE; } @@ -4697,25 +4495,22 @@ doProlog(XML_Parser parser, break; case XML_ROLE_ENTITY_VALUE: if (dtd->keepProcessing) { - enum XML_Error result = storeEntityValue(parser, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); + enum XML_Error result = storeEntityValue( + parser, enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); if (parser->m_declEntity) { parser->m_declEntity->textPtr = poolStart(&dtd->entityValuePool); - parser->m_declEntity->textLen = (int)(poolLength(&dtd->entityValuePool)); + parser->m_declEntity->textLen + = (int)(poolLength(&dtd->entityValuePool)); poolFinish(&dtd->entityValuePool); if (parser->m_entityDeclHandler) { *eventEndPP = s; - parser->m_entityDeclHandler(parser->m_handlerArg, - parser->m_declEntity->name, - parser->m_declEntity->is_param, - parser->m_declEntity->textPtr, - parser->m_declEntity->textLen, - parser->m_curBase, 0, 0, 0); + parser->m_entityDeclHandler( + parser->m_handlerArg, parser->m_declEntity->name, + parser->m_declEntity->is_param, parser->m_declEntity->textPtr, + parser->m_declEntity->textLen, parser->m_curBase, 0, 0, 0); handleDefault = XML_FALSE; } - } - else + } else poolDiscard(&dtd->entityValuePool); if (result != XML_ERROR_NONE) return result; @@ -4728,8 +4523,8 @@ doProlog(XML_Parser parser, dtd->hasParamEntityRefs = XML_TRUE; if (parser->m_startDoctypeDeclHandler) { parser->m_doctypeSysid = poolStoreString(&parser->m_tempPool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); if (parser->m_doctypeSysid == NULL) return XML_ERROR_NO_MEMORY; poolFinish(&parser->m_tempPool); @@ -4741,22 +4536,20 @@ doProlog(XML_Parser parser, for the case where no parser->m_startDoctypeDeclHandler is set */ parser->m_doctypeSysid = externalSubsetName; #endif /* XML_DTD */ - if (!dtd->standalone + if (! dtd->standalone #ifdef XML_DTD - && !parser->m_paramEntityParsing + && ! parser->m_paramEntityParsing #endif /* XML_DTD */ && parser->m_notStandaloneHandler - && !parser->m_notStandaloneHandler(parser->m_handlerArg)) + && ! parser->m_notStandaloneHandler(parser->m_handlerArg)) return XML_ERROR_NOT_STANDALONE; #ifndef XML_DTD break; -#else /* XML_DTD */ - if (!parser->m_declEntity) { - parser->m_declEntity = (ENTITY *)lookup(parser, - &dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!parser->m_declEntity) +#else /* XML_DTD */ + if (! parser->m_declEntity) { + parser->m_declEntity = (ENTITY *)lookup( + parser, &dtd->paramEntities, externalSubsetName, sizeof(ENTITY)); + if (! parser->m_declEntity) return XML_ERROR_NO_MEMORY; parser->m_declEntity->publicId = NULL; } @@ -4764,10 +4557,10 @@ doProlog(XML_Parser parser, /* fall through */ case XML_ROLE_ENTITY_SYSTEM_ID: if (dtd->keepProcessing && parser->m_declEntity) { - parser->m_declEntity->systemId = poolStoreString(&dtd->pool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!parser->m_declEntity->systemId) + parser->m_declEntity->systemId + = poolStoreString(&dtd->pool, enc, s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (! parser->m_declEntity->systemId) return XML_ERROR_NO_MEMORY; parser->m_declEntity->base = parser->m_curBase; poolFinish(&dtd->pool); @@ -4779,115 +4572,103 @@ doProlog(XML_Parser parser, } break; case XML_ROLE_ENTITY_COMPLETE: - if (dtd->keepProcessing && parser->m_declEntity && parser->m_entityDeclHandler) { + if (dtd->keepProcessing && parser->m_declEntity + && parser->m_entityDeclHandler) { *eventEndPP = s; - parser->m_entityDeclHandler(parser->m_handlerArg, - parser->m_declEntity->name, - parser->m_declEntity->is_param, - 0,0, - parser->m_declEntity->base, - parser->m_declEntity->systemId, - parser->m_declEntity->publicId, - 0); + parser->m_entityDeclHandler( + parser->m_handlerArg, parser->m_declEntity->name, + parser->m_declEntity->is_param, 0, 0, parser->m_declEntity->base, + parser->m_declEntity->systemId, parser->m_declEntity->publicId, 0); handleDefault = XML_FALSE; } break; case XML_ROLE_ENTITY_NOTATION_NAME: if (dtd->keepProcessing && parser->m_declEntity) { - parser->m_declEntity->notation = poolStoreString(&dtd->pool, enc, s, next); - if (!parser->m_declEntity->notation) + parser->m_declEntity->notation + = poolStoreString(&dtd->pool, enc, s, next); + if (! parser->m_declEntity->notation) return XML_ERROR_NO_MEMORY; poolFinish(&dtd->pool); if (parser->m_unparsedEntityDeclHandler) { *eventEndPP = s; - parser->m_unparsedEntityDeclHandler(parser->m_handlerArg, - parser->m_declEntity->name, - parser->m_declEntity->base, - parser->m_declEntity->systemId, - parser->m_declEntity->publicId, - parser->m_declEntity->notation); + parser->m_unparsedEntityDeclHandler( + parser->m_handlerArg, parser->m_declEntity->name, + parser->m_declEntity->base, parser->m_declEntity->systemId, + parser->m_declEntity->publicId, parser->m_declEntity->notation); handleDefault = XML_FALSE; - } - else if (parser->m_entityDeclHandler) { + } else if (parser->m_entityDeclHandler) { *eventEndPP = s; - parser->m_entityDeclHandler(parser->m_handlerArg, - parser->m_declEntity->name, - 0,0,0, - parser->m_declEntity->base, - parser->m_declEntity->systemId, - parser->m_declEntity->publicId, - parser->m_declEntity->notation); + parser->m_entityDeclHandler( + parser->m_handlerArg, parser->m_declEntity->name, 0, 0, 0, + parser->m_declEntity->base, parser->m_declEntity->systemId, + parser->m_declEntity->publicId, parser->m_declEntity->notation); handleDefault = XML_FALSE; } } break; - case XML_ROLE_GENERAL_ENTITY_NAME: - { - if (XmlPredefinedEntityName(enc, s, next)) { - parser->m_declEntity = NULL; - break; - } - if (dtd->keepProcessing) { - const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); - if (!name) - return XML_ERROR_NO_MEMORY; - parser->m_declEntity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, - sizeof(ENTITY)); - if (!parser->m_declEntity) - return XML_ERROR_NO_MEMORY; - if (parser->m_declEntity->name != name) { - poolDiscard(&dtd->pool); - parser->m_declEntity = NULL; - } - else { - poolFinish(&dtd->pool); - parser->m_declEntity->publicId = NULL; - parser->m_declEntity->is_param = XML_FALSE; - /* if we have a parent parser or are reading an internal parameter - entity, then the entity declaration is not considered "internal" - */ - parser->m_declEntity->is_internal = !(parser->m_parentParser || parser->m_openInternalEntities); - if (parser->m_entityDeclHandler) - handleDefault = XML_FALSE; - } - } - else { + case XML_ROLE_GENERAL_ENTITY_NAME: { + if (XmlPredefinedEntityName(enc, s, next)) { + parser->m_declEntity = NULL; + break; + } + if (dtd->keepProcessing) { + const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); + if (! name) + return XML_ERROR_NO_MEMORY; + parser->m_declEntity = (ENTITY *)lookup(parser, &dtd->generalEntities, + name, sizeof(ENTITY)); + if (! parser->m_declEntity) + return XML_ERROR_NO_MEMORY; + if (parser->m_declEntity->name != name) { poolDiscard(&dtd->pool); parser->m_declEntity = NULL; + } else { + poolFinish(&dtd->pool); + parser->m_declEntity->publicId = NULL; + parser->m_declEntity->is_param = XML_FALSE; + /* if we have a parent parser or are reading an internal parameter + entity, then the entity declaration is not considered "internal" + */ + parser->m_declEntity->is_internal + = ! (parser->m_parentParser || parser->m_openInternalEntities); + if (parser->m_entityDeclHandler) + handleDefault = XML_FALSE; } + } else { + poolDiscard(&dtd->pool); + parser->m_declEntity = NULL; } - break; + } break; case XML_ROLE_PARAM_ENTITY_NAME: #ifdef XML_DTD if (dtd->keepProcessing) { const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); - if (!name) + if (! name) return XML_ERROR_NO_MEMORY; parser->m_declEntity = (ENTITY *)lookup(parser, &dtd->paramEntities, - name, sizeof(ENTITY)); - if (!parser->m_declEntity) + name, sizeof(ENTITY)); + if (! parser->m_declEntity) return XML_ERROR_NO_MEMORY; if (parser->m_declEntity->name != name) { poolDiscard(&dtd->pool); parser->m_declEntity = NULL; - } - else { + } else { poolFinish(&dtd->pool); parser->m_declEntity->publicId = NULL; parser->m_declEntity->is_param = XML_TRUE; /* if we have a parent parser or are reading an internal parameter entity, then the entity declaration is not considered "internal" */ - parser->m_declEntity->is_internal = !(parser->m_parentParser || parser->m_openInternalEntities); + parser->m_declEntity->is_internal + = ! (parser->m_parentParser || parser->m_openInternalEntities); if (parser->m_entityDeclHandler) handleDefault = XML_FALSE; } - } - else { + } else { poolDiscard(&dtd->pool); parser->m_declEntity = NULL; } -#else /* not XML_DTD */ +#else /* not XML_DTD */ parser->m_declEntity = NULL; #endif /* XML_DTD */ break; @@ -4895,22 +4676,23 @@ doProlog(XML_Parser parser, parser->m_declNotationPublicId = NULL; parser->m_declNotationName = NULL; if (parser->m_notationDeclHandler) { - parser->m_declNotationName = poolStoreString(&parser->m_tempPool, enc, s, next); - if (!parser->m_declNotationName) + parser->m_declNotationName + = poolStoreString(&parser->m_tempPool, enc, s, next); + if (! parser->m_declNotationName) return XML_ERROR_NO_MEMORY; poolFinish(&parser->m_tempPool); handleDefault = XML_FALSE; } break; case XML_ROLE_NOTATION_PUBLIC_ID: - if (!XmlIsPublicId(enc, s, next, eventPP)) + if (! XmlIsPublicId(enc, s, next, eventPP)) return XML_ERROR_PUBLICID; - if (parser->m_declNotationName) { /* means m_notationDeclHandler != NULL */ - XML_Char *tem = poolStoreString(&parser->m_tempPool, - enc, + if (parser + ->m_declNotationName) { /* means m_notationDeclHandler != NULL */ + XML_Char *tem = poolStoreString(&parser->m_tempPool, enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); - if (!tem) + if (! tem) return XML_ERROR_NO_MEMORY; normalizePublicId(tem); parser->m_declNotationPublicId = tem; @@ -4920,18 +4702,15 @@ doProlog(XML_Parser parser, break; case XML_ROLE_NOTATION_SYSTEM_ID: if (parser->m_declNotationName && parser->m_notationDeclHandler) { - const XML_Char *systemId - = poolStoreString(&parser->m_tempPool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!systemId) + const XML_Char *systemId = poolStoreString(&parser->m_tempPool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (! systemId) return XML_ERROR_NO_MEMORY; *eventEndPP = s; - parser->m_notationDeclHandler(parser->m_handlerArg, - parser->m_declNotationName, - parser->m_curBase, - systemId, - parser->m_declNotationPublicId); + parser->m_notationDeclHandler( + parser->m_handlerArg, parser->m_declNotationName, parser->m_curBase, + systemId, parser->m_declNotationPublicId); handleDefault = XML_FALSE; } poolClear(&parser->m_tempPool); @@ -4939,11 +4718,9 @@ doProlog(XML_Parser parser, case XML_ROLE_NOTATION_NO_SYSTEM_ID: if (parser->m_declNotationPublicId && parser->m_notationDeclHandler) { *eventEndPP = s; - parser->m_notationDeclHandler(parser->m_handlerArg, - parser->m_declNotationName, - parser->m_curBase, - 0, - parser->m_declNotationPublicId); + parser->m_notationDeclHandler( + parser->m_handlerArg, parser->m_declNotationName, parser->m_curBase, + 0, parser->m_declNotationPublicId); handleDefault = XML_FALSE; } poolClear(&parser->m_tempPool); @@ -4960,42 +4737,44 @@ doProlog(XML_Parser parser, return XML_ERROR_SYNTAX; } #ifdef XML_DTD - case XML_ROLE_IGNORE_SECT: - { - enum XML_Error result; - if (parser->m_defaultHandler) - reportDefault(parser, enc, s, next); - handleDefault = XML_FALSE; - result = doIgnoreSection(parser, enc, &next, end, nextPtr, haveMore); - if (result != XML_ERROR_NONE) - return result; - else if (!next) { - parser->m_processor = ignoreSectionProcessor; - return result; - } + case XML_ROLE_IGNORE_SECT: { + enum XML_Error result; + if (parser->m_defaultHandler) + reportDefault(parser, enc, s, next); + handleDefault = XML_FALSE; + result = doIgnoreSection(parser, enc, &next, end, nextPtr, haveMore); + if (result != XML_ERROR_NONE) + return result; + else if (! next) { + parser->m_processor = ignoreSectionProcessor; + return result; } - break; + } break; #endif /* XML_DTD */ case XML_ROLE_GROUP_OPEN: if (parser->m_prologState.level >= parser->m_groupSize) { if (parser->m_groupSize) { - char *temp = (char *)REALLOC(parser, parser->m_groupConnector, parser->m_groupSize *= 2); - if (temp == NULL) { - parser->m_groupSize /= 2; - return XML_ERROR_NO_MEMORY; + { + char *const new_connector = (char *)REALLOC( + parser, parser->m_groupConnector, parser->m_groupSize *= 2); + if (new_connector == NULL) { + parser->m_groupSize /= 2; + return XML_ERROR_NO_MEMORY; + } + parser->m_groupConnector = new_connector; } - parser->m_groupConnector = temp; + if (dtd->scaffIndex) { - int *temp = (int *)REALLOC(parser, dtd->scaffIndex, - parser->m_groupSize * sizeof(int)); - if (temp == NULL) + int *const new_scaff_index = (int *)REALLOC( + parser, dtd->scaffIndex, parser->m_groupSize * sizeof(int)); + if (new_scaff_index == NULL) return XML_ERROR_NO_MEMORY; - dtd->scaffIndex = temp; + dtd->scaffIndex = new_scaff_index; } - } - else { - parser->m_groupConnector = (char *)MALLOC(parser, parser->m_groupSize = 32); - if (!parser->m_groupConnector) { + } else { + parser->m_groupConnector + = (char *)MALLOC(parser, parser->m_groupSize = 32); + if (! parser->m_groupConnector) { parser->m_groupSize = 0; return XML_ERROR_NO_MEMORY; } @@ -5006,6 +4785,7 @@ doProlog(XML_Parser parser, int myindex = nextScaffoldPart(parser); if (myindex < 0) return XML_ERROR_NO_MEMORY; + assert(dtd->scaffIndex != NULL); dtd->scaffIndex[dtd->scaffLevel] = myindex; dtd->scaffLevel++; dtd->scaffold[myindex].type = XML_CTYPE_SEQ; @@ -5024,10 +4804,9 @@ doProlog(XML_Parser parser, if (parser->m_groupConnector[parser->m_prologState.level] == ASCII_COMMA) return XML_ERROR_SYNTAX; if (dtd->in_eldecl - && !parser->m_groupConnector[parser->m_prologState.level] + && ! parser->m_groupConnector[parser->m_prologState.level] && (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type - != XML_CTYPE_MIXED) - ) { + != XML_CTYPE_MIXED)) { dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type = XML_CTYPE_CHOICE; if (parser->m_elementDeclHandler) @@ -5039,15 +4818,14 @@ doProlog(XML_Parser parser, #ifdef XML_DTD case XML_ROLE_INNER_PARAM_ENTITY_REF: dtd->hasParamEntityRefs = XML_TRUE; - if (!parser->m_paramEntityParsing) + if (! parser->m_paramEntityParsing) dtd->keepProcessing = dtd->standalone; else { const XML_Char *name; ENTITY *entity; - name = poolStoreString(&dtd->pool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) + name = poolStoreString(&dtd->pool, enc, s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (! name) return XML_ERROR_NO_MEMORY; entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0); poolDiscard(&dtd->pool); @@ -5055,13 +4833,12 @@ doProlog(XML_Parser parser, if yes, check that the entity exists, and that it is internal, otherwise call the skipped entity handler */ - if (parser->m_prologState.documentEntity && - (dtd->standalone - ? !parser->m_openInternalEntities - : !dtd->hasParamEntityRefs)) { - if (!entity) + if (parser->m_prologState.documentEntity + && (dtd->standalone ? ! parser->m_openInternalEntities + : ! dtd->hasParamEntityRefs)) { + if (! entity) return XML_ERROR_UNDEFINED_ENTITY; - else if (!entity->is_internal) { + else if (! entity->is_internal) { /* It's hard to exhaustively search the code to be sure, * but there doesn't seem to be a way of executing the * following line. There are two cases: @@ -5084,11 +4861,11 @@ doProlog(XML_Parser parser, */ return XML_ERROR_ENTITY_DECLARED_IN_PE; /* LCOV_EXCL_LINE */ } - } - else if (!entity) { + } else if (! entity) { dtd->keepProcessing = dtd->standalone; /* cannot report skipped entities in declarations */ - if ((role == XML_ROLE_PARAM_ENTITY_REF) && parser->m_skippedEntityHandler) { + if ((role == XML_ROLE_PARAM_ENTITY_REF) + && parser->m_skippedEntityHandler) { parser->m_skippedEntityHandler(parser->m_handlerArg, name, 1); handleDefault = XML_FALSE; } @@ -5098,8 +4875,8 @@ doProlog(XML_Parser parser, return XML_ERROR_RECURSIVE_ENTITY_REF; if (entity->textPtr) { enum XML_Error result; - XML_Bool betweenDecl = - (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE); + XML_Bool betweenDecl + = (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE); result = processInternalEntity(parser, entity, betweenDecl); if (result != XML_ERROR_NONE) return result; @@ -5109,39 +4886,35 @@ doProlog(XML_Parser parser, if (parser->m_externalEntityRefHandler) { dtd->paramEntityRead = XML_FALSE; entity->open = XML_TRUE; - if (!parser->m_externalEntityRefHandler(parser->m_externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) { + if (! parser->m_externalEntityRefHandler( + parser->m_externalEntityRefHandlerArg, 0, entity->base, + entity->systemId, entity->publicId)) { entity->open = XML_FALSE; return XML_ERROR_EXTERNAL_ENTITY_HANDLING; } entity->open = XML_FALSE; handleDefault = XML_FALSE; - if (!dtd->paramEntityRead) { + if (! dtd->paramEntityRead) { dtd->keepProcessing = dtd->standalone; break; } - } - else { + } else { dtd->keepProcessing = dtd->standalone; break; } } #endif /* XML_DTD */ - if (!dtd->standalone && - parser->m_notStandaloneHandler && - !parser->m_notStandaloneHandler(parser->m_handlerArg)) + if (! dtd->standalone && parser->m_notStandaloneHandler + && ! parser->m_notStandaloneHandler(parser->m_handlerArg)) return XML_ERROR_NOT_STANDALONE; break; - /* Element declaration stuff */ + /* Element declaration stuff */ case XML_ROLE_ELEMENT_NAME: if (parser->m_elementDeclHandler) { parser->m_declElementType = getElementType(parser, enc, s, next); - if (!parser->m_declElementType) + if (! parser->m_declElementType) return XML_ERROR_NO_MEMORY; dtd->scaffLevel = 0; dtd->scaffCount = 0; @@ -5154,18 +4927,19 @@ doProlog(XML_Parser parser, case XML_ROLE_CONTENT_EMPTY: if (dtd->in_eldecl) { if (parser->m_elementDeclHandler) { - XML_Content * content = (XML_Content *) MALLOC(parser, sizeof(XML_Content)); - if (!content) + XML_Content *content + = (XML_Content *)MALLOC(parser, sizeof(XML_Content)); + if (! content) return XML_ERROR_NO_MEMORY; content->quant = XML_CQUANT_NONE; content->name = NULL; content->numchildren = 0; content->children = NULL; - content->type = ((role == XML_ROLE_CONTENT_ANY) ? - XML_CTYPE_ANY : - XML_CTYPE_EMPTY); + content->type = ((role == XML_ROLE_CONTENT_ANY) ? XML_CTYPE_ANY + : XML_CTYPE_EMPTY); *eventEndPP = s; - parser->m_elementDeclHandler(parser->m_handlerArg, parser->m_declElementType->name, content); + parser->m_elementDeclHandler( + parser->m_handlerArg, parser->m_declElementType->name, content); handleDefault = XML_FALSE; } dtd->in_eldecl = XML_FALSE; @@ -5197,22 +4971,22 @@ doProlog(XML_Parser parser, ELEMENT_TYPE *el; const XML_Char *name; int nameLen; - const char *nxt = (quant == XML_CQUANT_NONE - ? next - : next - enc->minBytesPerChar); + const char *nxt + = (quant == XML_CQUANT_NONE ? next : next - enc->minBytesPerChar); int myindex = nextScaffoldPart(parser); if (myindex < 0) return XML_ERROR_NO_MEMORY; dtd->scaffold[myindex].type = XML_CTYPE_NAME; dtd->scaffold[myindex].quant = quant; el = getElementType(parser, enc, s, nxt); - if (!el) + if (! el) return XML_ERROR_NO_MEMORY; name = el->name; dtd->scaffold[myindex].name = name; nameLen = 0; - for (; name[nameLen++]; ); - dtd->contentStringLen += nameLen; + for (; name[nameLen++];) + ; + dtd->contentStringLen += nameLen; if (parser->m_elementDeclHandler) handleDefault = XML_FALSE; } @@ -5236,12 +5010,13 @@ doProlog(XML_Parser parser, dtd->scaffLevel--; dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant; if (dtd->scaffLevel == 0) { - if (!handleDefault) { + if (! handleDefault) { XML_Content *model = build_model(parser); - if (!model) + if (! model) return XML_ERROR_NO_MEMORY; *eventEndPP = s; - parser->m_elementDeclHandler(parser->m_handlerArg, parser->m_declElementType->name, model); + parser->m_elementDeclHandler( + parser->m_handlerArg, parser->m_declElementType->name, model); } dtd->in_eldecl = XML_FALSE; dtd->contentStringLen = 0; @@ -5251,12 +5026,12 @@ doProlog(XML_Parser parser, /* End element declaration stuff */ case XML_ROLE_PI: - if (!reportProcessingInstruction(parser, enc, s, next)) + if (! reportProcessingInstruction(parser, enc, s, next)) return XML_ERROR_NO_MEMORY; handleDefault = XML_FALSE; break; case XML_ROLE_COMMENT: - if (!reportComment(parser, enc, s, next)) + if (! reportComment(parser, enc, s, next)) return XML_ERROR_NO_MEMORY; handleDefault = XML_FALSE; break; @@ -5307,11 +5082,8 @@ doProlog(XML_Parser parser, } static enum XML_Error PTRCALL -epilogProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ +epilogProcessor(XML_Parser parser, const char *s, const char *end, + const char **nextPtr) { parser->m_processor = epilogProcessor; parser->m_eventPtr = s; for (;;) { @@ -5336,24 +5108,24 @@ epilogProcessor(XML_Parser parser, reportDefault(parser, parser->m_encoding, s, next); break; case XML_TOK_PI: - if (!reportProcessingInstruction(parser, parser->m_encoding, s, next)) + if (! reportProcessingInstruction(parser, parser->m_encoding, s, next)) return XML_ERROR_NO_MEMORY; break; case XML_TOK_COMMENT: - if (!reportComment(parser, parser->m_encoding, s, next)) + if (! reportComment(parser, parser->m_encoding, s, next)) return XML_ERROR_NO_MEMORY; break; case XML_TOK_INVALID: parser->m_eventPtr = next; return XML_ERROR_INVALID_TOKEN; case XML_TOK_PARTIAL: - if (!parser->m_parsingStatus.finalBuffer) { + if (! parser->m_parsingStatus.finalBuffer) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: - if (!parser->m_parsingStatus.finalBuffer) { + if (! parser->m_parsingStatus.finalBuffer) { *nextPtr = s; return XML_ERROR_NONE; } @@ -5368,15 +5140,13 @@ epilogProcessor(XML_Parser parser, return XML_ERROR_NONE; case XML_FINISHED: return XML_ERROR_ABORTED; - default: ; + default:; } } } static enum XML_Error -processInternalEntity(XML_Parser parser, ENTITY *entity, - XML_Bool betweenDecl) -{ +processInternalEntity(XML_Parser parser, ENTITY *entity, XML_Bool betweenDecl) { const char *textStart, *textEnd; const char *next; enum XML_Error result; @@ -5385,10 +5155,10 @@ processInternalEntity(XML_Parser parser, ENTITY *entity, if (parser->m_freeInternalEntities) { openEntity = parser->m_freeInternalEntities; parser->m_freeInternalEntities = openEntity->next; - } - else { - openEntity = (OPEN_INTERNAL_ENTITY *)MALLOC(parser, sizeof(OPEN_INTERNAL_ENTITY)); - if (!openEntity) + } else { + openEntity + = (OPEN_INTERNAL_ENTITY *)MALLOC(parser, sizeof(OPEN_INTERNAL_ENTITY)); + if (! openEntity) return XML_ERROR_NO_MEMORY; } entity->open = XML_TRUE; @@ -5407,21 +5177,20 @@ processInternalEntity(XML_Parser parser, ENTITY *entity, #ifdef XML_DTD if (entity->is_param) { - int tok = XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next); - result = doProlog(parser, parser->m_internalEncoding, textStart, textEnd, tok, - next, &next, XML_FALSE); - } - else + int tok + = XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next); + result = doProlog(parser, parser->m_internalEncoding, textStart, textEnd, + tok, next, &next, XML_FALSE, XML_FALSE); + } else #endif /* XML_DTD */ - result = doContent(parser, parser->m_tagLevel, parser->m_internalEncoding, textStart, - textEnd, &next, XML_FALSE); + result = doContent(parser, parser->m_tagLevel, parser->m_internalEncoding, + textStart, textEnd, &next, XML_FALSE); if (result == XML_ERROR_NONE) { if (textEnd != next && parser->m_parsingStatus.parsing == XML_SUSPENDED) { entity->processed = (int)(next - textStart); parser->m_processor = internalEntityProcessor; - } - else { + } else { entity->open = XML_FALSE; parser->m_openInternalEntities = openEntity->next; /* put openEntity back in list of free instances */ @@ -5433,17 +5202,14 @@ processInternalEntity(XML_Parser parser, ENTITY *entity, } static enum XML_Error PTRCALL -internalEntityProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ +internalEntityProcessor(XML_Parser parser, const char *s, const char *end, + const char **nextPtr) { ENTITY *entity; const char *textStart, *textEnd; const char *next; enum XML_Error result; OPEN_INTERNAL_ENTITY *openEntity = parser->m_openInternalEntities; - if (!openEntity) + if (! openEntity) return XML_ERROR_UNEXPECTED_STATE; entity = openEntity->entity; @@ -5454,22 +5220,23 @@ internalEntityProcessor(XML_Parser parser, #ifdef XML_DTD if (entity->is_param) { - int tok = XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next); - result = doProlog(parser, parser->m_internalEncoding, textStart, textEnd, tok, - next, &next, XML_FALSE); - } - else + int tok + = XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next); + result = doProlog(parser, parser->m_internalEncoding, textStart, textEnd, + tok, next, &next, XML_FALSE, XML_TRUE); + } else #endif /* XML_DTD */ - result = doContent(parser, openEntity->startTagLevel, parser->m_internalEncoding, - textStart, textEnd, &next, XML_FALSE); + result = doContent(parser, openEntity->startTagLevel, + parser->m_internalEncoding, textStart, textEnd, &next, + XML_FALSE); if (result != XML_ERROR_NONE) return result; - else if (textEnd != next && parser->m_parsingStatus.parsing == XML_SUSPENDED) { + else if (textEnd != next + && parser->m_parsingStatus.parsing == XML_SUSPENDED) { entity->processed = (int)(next - (char *)entity->textPtr); return result; - } - else { + } else { entity->open = XML_FALSE; parser->m_openInternalEntities = openEntity->next; /* put openEntity back in list of free instances */ @@ -5483,49 +5250,45 @@ internalEntityProcessor(XML_Parser parser, parser->m_processor = prologProcessor; tok = XmlPrologTok(parser->m_encoding, s, end, &next); return doProlog(parser, parser->m_encoding, s, end, tok, next, nextPtr, - (XML_Bool)!parser->m_parsingStatus.finalBuffer); - } - else + (XML_Bool)! parser->m_parsingStatus.finalBuffer, XML_TRUE); + } else #endif /* XML_DTD */ { parser->m_processor = contentProcessor; /* see externalEntityContentProcessor vs contentProcessor */ - return doContent(parser, parser->m_parentParser ? 1 : 0, parser->m_encoding, s, end, - nextPtr, (XML_Bool)!parser->m_parsingStatus.finalBuffer); + return doContent(parser, parser->m_parentParser ? 1 : 0, parser->m_encoding, + s, end, nextPtr, + (XML_Bool)! parser->m_parsingStatus.finalBuffer); } } static enum XML_Error PTRCALL -errorProcessor(XML_Parser parser, - const char *UNUSED_P(s), - const char *UNUSED_P(end), - const char **UNUSED_P(nextPtr)) -{ +errorProcessor(XML_Parser parser, const char *s, const char *end, + const char **nextPtr) { + UNUSED_P(s); + UNUSED_P(end); + UNUSED_P(nextPtr); return parser->m_errorCode; } static enum XML_Error storeAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, - const char *ptr, const char *end, - STRING_POOL *pool) -{ - enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr, - end, pool); + const char *ptr, const char *end, STRING_POOL *pool) { + enum XML_Error result + = appendAttributeValue(parser, enc, isCdata, ptr, end, pool); if (result) return result; - if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20) + if (! isCdata && poolLength(pool) && poolLastChar(pool) == 0x20) poolChop(pool); - if (!poolAppendChar(pool, XML_T('\0'))) + if (! poolAppendChar(pool, XML_T('\0'))) return XML_ERROR_NO_MEMORY; return XML_ERROR_NONE; } static enum XML_Error appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, - const char *ptr, const char *end, - STRING_POOL *pool) -{ - DTD * const dtd = parser->m_dtd; /* save one level of indirection */ + const char *ptr, const char *end, STRING_POOL *pool) { + DTD *const dtd = parser->m_dtd; /* save one level of indirection */ for (;;) { const char *next; int tok = XmlAttributeValueTok(enc, ptr, end, &next); @@ -5540,38 +5303,35 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, if (enc == parser->m_encoding) parser->m_eventPtr = ptr; return XML_ERROR_INVALID_TOKEN; - case XML_TOK_CHAR_REF: - { - XML_Char buf[XML_ENCODE_MAX]; - int i; - int n = XmlCharRefNumber(enc, ptr); - if (n < 0) { - if (enc == parser->m_encoding) - parser->m_eventPtr = ptr; - return XML_ERROR_BAD_CHAR_REF; - } - if (!isCdata - && n == 0x20 /* space */ - && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) - break; - n = XmlEncode(n, (ICHAR *)buf); - /* The XmlEncode() functions can never return 0 here. That - * error return happens if the code point passed in is either - * negative or greater than or equal to 0x110000. The - * XmlCharRefNumber() functions will all return a number - * strictly less than 0x110000 or a negative value if an error - * occurred. The negative value is intercepted above, so - * XmlEncode() is never passed a value it might return an - * error for. - */ - for (i = 0; i < n; i++) { - if (!poolAppendChar(pool, buf[i])) - return XML_ERROR_NO_MEMORY; - } + case XML_TOK_CHAR_REF: { + XML_Char buf[XML_ENCODE_MAX]; + int i; + int n = XmlCharRefNumber(enc, ptr); + if (n < 0) { + if (enc == parser->m_encoding) + parser->m_eventPtr = ptr; + return XML_ERROR_BAD_CHAR_REF; } - break; + if (! isCdata && n == 0x20 /* space */ + && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) + break; + n = XmlEncode(n, (ICHAR *)buf); + /* The XmlEncode() functions can never return 0 here. That + * error return happens if the code point passed in is either + * negative or greater than or equal to 0x110000. The + * XmlCharRefNumber() functions will all return a number + * strictly less than 0x110000 or a negative value if an error + * occurred. The negative value is intercepted above, so + * XmlEncode() is never passed a value it might return an + * error for. + */ + for (i = 0; i < n; i++) { + if (! poolAppendChar(pool, buf[i])) + return XML_ERROR_NO_MEMORY; + } + } break; case XML_TOK_DATA_CHARS: - if (!poolAppend(pool, enc, ptr, next)) + if (! poolAppend(pool, enc, ptr, next)) return XML_ERROR_NO_MEMORY; break; case XML_TOK_TRAILING_CR: @@ -5579,109 +5339,103 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, /* fall through */ case XML_TOK_ATTRIBUTE_VALUE_S: case XML_TOK_DATA_NEWLINE: - if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) + if (! isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) break; - if (!poolAppendChar(pool, 0x20)) + if (! poolAppendChar(pool, 0x20)) return XML_ERROR_NO_MEMORY; break; - case XML_TOK_ENTITY_REF: - { - const XML_Char *name; - ENTITY *entity; - char checkEntityDecl; - XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, - ptr + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (ch) { - if (!poolAppendChar(pool, ch)) - return XML_ERROR_NO_MEMORY; - break; - } - name = poolStoreString(&parser->m_temp2Pool, enc, - ptr + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) + case XML_TOK_ENTITY_REF: { + const XML_Char *name; + ENTITY *entity; + char checkEntityDecl; + XML_Char ch = (XML_Char)XmlPredefinedEntityName( + enc, ptr + enc->minBytesPerChar, next - enc->minBytesPerChar); + if (ch) { + if (! poolAppendChar(pool, ch)) return XML_ERROR_NO_MEMORY; - entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); - poolDiscard(&parser->m_temp2Pool); - /* First, determine if a check for an existing declaration is needed; - if yes, check that the entity exists, and that it is internal. - */ - if (pool == &dtd->pool) /* are we called from prolog? */ - checkEntityDecl = + break; + } + name = poolStoreString(&parser->m_temp2Pool, enc, + ptr + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (! name) + return XML_ERROR_NO_MEMORY; + entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); + poolDiscard(&parser->m_temp2Pool); + /* First, determine if a check for an existing declaration is needed; + if yes, check that the entity exists, and that it is internal. + */ + if (pool == &dtd->pool) /* are we called from prolog? */ + checkEntityDecl = #ifdef XML_DTD - parser->m_prologState.documentEntity && + parser->m_prologState.documentEntity && #endif /* XML_DTD */ - (dtd->standalone - ? !parser->m_openInternalEntities - : !dtd->hasParamEntityRefs); - else /* if (pool == &parser->m_tempPool): we are called from content */ - checkEntityDecl = !dtd->hasParamEntityRefs || dtd->standalone; - if (checkEntityDecl) { - if (!entity) - return XML_ERROR_UNDEFINED_ENTITY; - else if (!entity->is_internal) - return XML_ERROR_ENTITY_DECLARED_IN_PE; - } - else if (!entity) { - /* Cannot report skipped entity here - see comments on - parser->m_skippedEntityHandler. - if (parser->m_skippedEntityHandler) - parser->m_skippedEntityHandler(parser->m_handlerArg, name, 0); - */ - /* Cannot call the default handler because this would be - out of sync with the call to the startElementHandler. - if ((pool == &parser->m_tempPool) && parser->m_defaultHandler) - reportDefault(parser, enc, ptr, next); - */ - break; - } - if (entity->open) { - if (enc == parser->m_encoding) { - /* It does not appear that this line can be executed. - * - * The "if (entity->open)" check catches recursive entity - * definitions. In order to be called with an open - * entity, it must have gone through this code before and - * been through the recursive call to - * appendAttributeValue() some lines below. That call - * sets the local encoding ("enc") to the parser's - * internal encoding (internal_utf8 or internal_utf16), - * which can never be the same as the principle encoding. - * It doesn't appear there is another code path that gets - * here with entity->open being TRUE. - * - * Since it is not certain that this logic is watertight, - * we keep the line and merely exclude it from coverage - * tests. - */ - parser->m_eventPtr = ptr; /* LCOV_EXCL_LINE */ - } - return XML_ERROR_RECURSIVE_ENTITY_REF; - } - if (entity->notation) { - if (enc == parser->m_encoding) - parser->m_eventPtr = ptr; - return XML_ERROR_BINARY_ENTITY_REF; - } - if (!entity->textPtr) { - if (enc == parser->m_encoding) - parser->m_eventPtr = ptr; - return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; - } - else { - enum XML_Error result; - const XML_Char *textEnd = entity->textPtr + entity->textLen; - entity->open = XML_TRUE; - result = appendAttributeValue(parser, parser->m_internalEncoding, isCdata, - (char *)entity->textPtr, - (char *)textEnd, pool); - entity->open = XML_FALSE; - if (result) - return result; + (dtd->standalone ? ! parser->m_openInternalEntities + : ! dtd->hasParamEntityRefs); + else /* if (pool == &parser->m_tempPool): we are called from content */ + checkEntityDecl = ! dtd->hasParamEntityRefs || dtd->standalone; + if (checkEntityDecl) { + if (! entity) + return XML_ERROR_UNDEFINED_ENTITY; + else if (! entity->is_internal) + return XML_ERROR_ENTITY_DECLARED_IN_PE; + } else if (! entity) { + /* Cannot report skipped entity here - see comments on + parser->m_skippedEntityHandler. + if (parser->m_skippedEntityHandler) + parser->m_skippedEntityHandler(parser->m_handlerArg, name, 0); + */ + /* Cannot call the default handler because this would be + out of sync with the call to the startElementHandler. + if ((pool == &parser->m_tempPool) && parser->m_defaultHandler) + reportDefault(parser, enc, ptr, next); + */ + break; + } + if (entity->open) { + if (enc == parser->m_encoding) { + /* It does not appear that this line can be executed. + * + * The "if (entity->open)" check catches recursive entity + * definitions. In order to be called with an open + * entity, it must have gone through this code before and + * been through the recursive call to + * appendAttributeValue() some lines below. That call + * sets the local encoding ("enc") to the parser's + * internal encoding (internal_utf8 or internal_utf16), + * which can never be the same as the principle encoding. + * It doesn't appear there is another code path that gets + * here with entity->open being TRUE. + * + * Since it is not certain that this logic is watertight, + * we keep the line and merely exclude it from coverage + * tests. + */ + parser->m_eventPtr = ptr; /* LCOV_EXCL_LINE */ } + return XML_ERROR_RECURSIVE_ENTITY_REF; } - break; + if (entity->notation) { + if (enc == parser->m_encoding) + parser->m_eventPtr = ptr; + return XML_ERROR_BINARY_ENTITY_REF; + } + if (! entity->textPtr) { + if (enc == parser->m_encoding) + parser->m_eventPtr = ptr; + return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; + } else { + enum XML_Error result; + const XML_Char *textEnd = entity->textPtr + entity->textLen; + entity->open = XML_TRUE; + result = appendAttributeValue(parser, parser->m_internalEncoding, + isCdata, (char *)entity->textPtr, + (char *)textEnd, pool); + entity->open = XML_FALSE; + if (result) + return result; + } + } break; default: /* The only token returned by XmlAttributeValueTok() that does * not have an explicit case here is XML_TOK_PARTIAL_CHAR. @@ -5705,12 +5459,9 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, } static enum XML_Error -storeEntityValue(XML_Parser parser, - const ENCODING *enc, - const char *entityTextPtr, - const char *entityTextEnd) -{ - DTD * const dtd = parser->m_dtd; /* save one level of indirection */ +storeEntityValue(XML_Parser parser, const ENCODING *enc, + const char *entityTextPtr, const char *entityTextEnd) { + DTD *const dtd = parser->m_dtd; /* save one level of indirection */ STRING_POOL *pool = &(dtd->entityValuePool); enum XML_Error result = XML_ERROR_NONE; #ifdef XML_DTD @@ -5720,8 +5471,8 @@ storeEntityValue(XML_Parser parser, /* never return Null for the value argument in EntityDeclHandler, since this would indicate an external entity; therefore we have to make sure that entityValuePool.start is not null */ - if (!pool->blocks) { - if (!poolGrow(pool)) + if (! pool->blocks) { + if (! poolGrow(pool)) return XML_ERROR_NO_MEMORY; } @@ -5737,13 +5488,13 @@ storeEntityValue(XML_Parser parser, name = poolStoreString(&parser->m_tempPool, enc, entityTextPtr + enc->minBytesPerChar, next - enc->minBytesPerChar); - if (!name) { + if (! name) { result = XML_ERROR_NO_MEMORY; goto endEntityValue; } entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0); poolDiscard(&parser->m_tempPool); - if (!entity) { + if (! entity) { /* not a well-formedness error - see XML 1.0: WFC Entity Declared */ /* cannot report skipped entity here - see comments on parser->m_skippedEntityHandler @@ -5763,29 +5514,23 @@ storeEntityValue(XML_Parser parser, if (parser->m_externalEntityRefHandler) { dtd->paramEntityRead = XML_FALSE; entity->open = XML_TRUE; - if (!parser->m_externalEntityRefHandler(parser->m_externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) { + if (! parser->m_externalEntityRefHandler( + parser->m_externalEntityRefHandlerArg, 0, entity->base, + entity->systemId, entity->publicId)) { entity->open = XML_FALSE; result = XML_ERROR_EXTERNAL_ENTITY_HANDLING; goto endEntityValue; } entity->open = XML_FALSE; - if (!dtd->paramEntityRead) + if (! dtd->paramEntityRead) dtd->keepProcessing = dtd->standalone; - } - else + } else dtd->keepProcessing = dtd->standalone; - } - else { + } else { entity->open = XML_TRUE; - result = storeEntityValue(parser, - parser->m_internalEncoding, - (char *)entity->textPtr, - (char *)(entity->textPtr - + entity->textLen)); + result = storeEntityValue( + parser, parser->m_internalEncoding, (char *)entity->textPtr, + (char *)(entity->textPtr + entity->textLen)); entity->open = XML_FALSE; if (result) goto endEntityValue; @@ -5803,7 +5548,7 @@ storeEntityValue(XML_Parser parser, goto endEntityValue; case XML_TOK_ENTITY_REF: case XML_TOK_DATA_CHARS: - if (!poolAppend(pool, enc, entityTextPtr, next)) { + if (! poolAppend(pool, enc, entityTextPtr, next)) { result = XML_ERROR_NO_MEMORY; goto endEntityValue; } @@ -5812,42 +5557,40 @@ storeEntityValue(XML_Parser parser, next = entityTextPtr + enc->minBytesPerChar; /* fall through */ case XML_TOK_DATA_NEWLINE: - if (pool->end == pool->ptr && !poolGrow(pool)) { - result = XML_ERROR_NO_MEMORY; + if (pool->end == pool->ptr && ! poolGrow(pool)) { + result = XML_ERROR_NO_MEMORY; goto endEntityValue; } *(pool->ptr)++ = 0xA; break; - case XML_TOK_CHAR_REF: - { - XML_Char buf[XML_ENCODE_MAX]; - int i; - int n = XmlCharRefNumber(enc, entityTextPtr); - if (n < 0) { - if (enc == parser->m_encoding) - parser->m_eventPtr = entityTextPtr; - result = XML_ERROR_BAD_CHAR_REF; + case XML_TOK_CHAR_REF: { + XML_Char buf[XML_ENCODE_MAX]; + int i; + int n = XmlCharRefNumber(enc, entityTextPtr); + if (n < 0) { + if (enc == parser->m_encoding) + parser->m_eventPtr = entityTextPtr; + result = XML_ERROR_BAD_CHAR_REF; + goto endEntityValue; + } + n = XmlEncode(n, (ICHAR *)buf); + /* The XmlEncode() functions can never return 0 here. That + * error return happens if the code point passed in is either + * negative or greater than or equal to 0x110000. The + * XmlCharRefNumber() functions will all return a number + * strictly less than 0x110000 or a negative value if an error + * occurred. The negative value is intercepted above, so + * XmlEncode() is never passed a value it might return an + * error for. + */ + for (i = 0; i < n; i++) { + if (pool->end == pool->ptr && ! poolGrow(pool)) { + result = XML_ERROR_NO_MEMORY; goto endEntityValue; } - n = XmlEncode(n, (ICHAR *)buf); - /* The XmlEncode() functions can never return 0 here. That - * error return happens if the code point passed in is either - * negative or greater than or equal to 0x110000. The - * XmlCharRefNumber() functions will all return a number - * strictly less than 0x110000 or a negative value if an error - * occurred. The negative value is intercepted above, so - * XmlEncode() is never passed a value it might return an - * error for. - */ - for (i = 0; i < n; i++) { - if (pool->end == pool->ptr && !poolGrow(pool)) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - *(pool->ptr)++ = buf[i]; - } + *(pool->ptr)++ = buf[i]; } - break; + } break; case XML_TOK_PARTIAL: if (enc == parser->m_encoding) parser->m_eventPtr = entityTextPtr; @@ -5882,8 +5625,7 @@ storeEntityValue(XML_Parser parser, } static void FASTCALL -normalizeLines(XML_Char *s) -{ +normalizeLines(XML_Char *s) { XML_Char *p; for (;; s++) { if (*s == XML_T('\0')) @@ -5897,8 +5639,7 @@ normalizeLines(XML_Char *s) *p++ = 0xA; if (*++s == 0xA) s++; - } - else + } else *p++ = *s++; } while (*s); *p = XML_T('\0'); @@ -5906,12 +5647,11 @@ normalizeLines(XML_Char *s) static int reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end) -{ + const char *start, const char *end) { const XML_Char *target; XML_Char *data; const char *tem; - if (!parser->m_processingInstructionHandler) { + if (! parser->m_processingInstructionHandler) { if (parser->m_defaultHandler) reportDefault(parser, enc, start, end); return 1; @@ -5919,13 +5659,12 @@ reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, start += enc->minBytesPerChar * 2; tem = start + XmlNameLength(enc, start); target = poolStoreString(&parser->m_tempPool, enc, start, tem); - if (!target) + if (! target) return 0; poolFinish(&parser->m_tempPool); - data = poolStoreString(&parser->m_tempPool, enc, - XmlSkipS(enc, tem), - end - enc->minBytesPerChar*2); - if (!data) + data = poolStoreString(&parser->m_tempPool, enc, XmlSkipS(enc, tem), + end - enc->minBytesPerChar * 2); + if (! data) return 0; normalizeLines(data); parser->m_processingInstructionHandler(parser->m_handlerArg, target, data); @@ -5934,20 +5673,18 @@ reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, } static int -reportComment(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end) -{ +reportComment(XML_Parser parser, const ENCODING *enc, const char *start, + const char *end) { XML_Char *data; - if (!parser->m_commentHandler) { + if (! parser->m_commentHandler) { if (parser->m_defaultHandler) reportDefault(parser, enc, start, end); return 1; } - data = poolStoreString(&parser->m_tempPool, - enc, + data = poolStoreString(&parser->m_tempPool, enc, start + enc->minBytesPerChar * 4, end - enc->minBytesPerChar * 3); - if (!data) + if (! data) return 0; normalizeLines(data); parser->m_commentHandler(parser->m_handlerArg, data); @@ -5956,9 +5693,8 @@ reportComment(XML_Parser parser, const ENCODING *enc, } static void -reportDefault(XML_Parser parser, const ENCODING *enc, - const char *s, const char *end) -{ +reportDefault(XML_Parser parser, const ENCODING *enc, const char *s, + const char *end) { if (MUST_CONVERT(enc, s)) { enum XML_Convert_Result convert_res; const char **eventPP; @@ -5966,8 +5702,7 @@ reportDefault(XML_Parser parser, const ENCODING *enc, if (enc == parser->m_encoding) { eventPP = &parser->m_eventPtr; eventEndPP = &parser->m_eventEndPtr; - } - else { + } else { /* To get here, two things must be true; the parser must be * using a character encoding that is not the same as the * encoding passed in, and the encoding passed in must need @@ -5990,21 +5725,22 @@ reportDefault(XML_Parser parser, const ENCODING *enc, } do { ICHAR *dataPtr = (ICHAR *)parser->m_dataBuf; - convert_res = XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)parser->m_dataBufEnd); + convert_res + = XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)parser->m_dataBufEnd); *eventEndPP = s; - parser->m_defaultHandler(parser->m_handlerArg, parser->m_dataBuf, (int)(dataPtr - (ICHAR *)parser->m_dataBuf)); + parser->m_defaultHandler(parser->m_handlerArg, parser->m_dataBuf, + (int)(dataPtr - (ICHAR *)parser->m_dataBuf)); *eventPP = s; - } while ((convert_res != XML_CONVERT_COMPLETED) && (convert_res != XML_CONVERT_INPUT_INCOMPLETE)); - } - else - parser->m_defaultHandler(parser->m_handlerArg, (XML_Char *)s, (int)((XML_Char *)end - (XML_Char *)s)); + } while ((convert_res != XML_CONVERT_COMPLETED) + && (convert_res != XML_CONVERT_INPUT_INCOMPLETE)); + } else + parser->m_defaultHandler(parser->m_handlerArg, (XML_Char *)s, + (int)((XML_Char *)end - (XML_Char *)s)); } - static int defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, - XML_Bool isId, const XML_Char *value, XML_Parser parser) -{ + XML_Bool isId, const XML_Char *value, XML_Parser parser) { DEFAULT_ATTRIBUTE *att; if (value || isId) { /* The handling of default attributes gets messed up if we have @@ -6013,24 +5749,23 @@ defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, for (i = 0; i < type->nDefaultAtts; i++) if (attId == type->defaultAtts[i].id) return 1; - if (isId && !type->idAtt && !attId->xmlns) + if (isId && ! type->idAtt && ! attId->xmlns) type->idAtt = attId; } if (type->nDefaultAtts == type->allocDefaultAtts) { if (type->allocDefaultAtts == 0) { type->allocDefaultAtts = 8; - type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(parser, type->allocDefaultAtts - * sizeof(DEFAULT_ATTRIBUTE)); - if (!type->defaultAtts) { + type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC( + parser, type->allocDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); + if (! type->defaultAtts) { type->allocDefaultAtts = 0; return 0; } - } - else { + } else { DEFAULT_ATTRIBUTE *temp; int count = type->allocDefaultAtts * 2; - temp = (DEFAULT_ATTRIBUTE *) - REALLOC(parser, type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE))); + temp = (DEFAULT_ATTRIBUTE *)REALLOC(parser, type->defaultAtts, + (count * sizeof(DEFAULT_ATTRIBUTE))); if (temp == NULL) return 0; type->allocDefaultAtts = count; @@ -6041,30 +5776,29 @@ defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, att->id = attId; att->value = value; att->isCdata = isCdata; - if (!isCdata) + if (! isCdata) attId->maybeTokenized = XML_TRUE; type->nDefaultAtts += 1; return 1; } static int -setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) -{ - DTD * const dtd = parser->m_dtd; /* save one level of indirection */ +setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) { + DTD *const dtd = parser->m_dtd; /* save one level of indirection */ const XML_Char *name; for (name = elementType->name; *name; name++) { if (*name == XML_T(ASCII_COLON)) { PREFIX *prefix; const XML_Char *s; for (s = elementType->name; s != name; s++) { - if (!poolAppendChar(&dtd->pool, *s)) + if (! poolAppendChar(&dtd->pool, *s)) return 0; } - if (!poolAppendChar(&dtd->pool, XML_T('\0'))) + if (! poolAppendChar(&dtd->pool, XML_T('\0'))) return 0; prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool), sizeof(PREFIX)); - if (!prefix) + if (! prefix) return 0; if (prefix->name == poolStart(&dtd->pool)) poolFinish(&dtd->pool); @@ -6078,55 +5812,53 @@ setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) } static ATTRIBUTE_ID * -getAttributeId(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end) -{ - DTD * const dtd = parser->m_dtd; /* save one level of indirection */ +getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, + const char *end) { + DTD *const dtd = parser->m_dtd; /* save one level of indirection */ ATTRIBUTE_ID *id; const XML_Char *name; - if (!poolAppendChar(&dtd->pool, XML_T('\0'))) + if (! poolAppendChar(&dtd->pool, XML_T('\0'))) return NULL; name = poolStoreString(&dtd->pool, enc, start, end); - if (!name) + if (! name) return NULL; /* skip quotation mark - its storage will be re-used (like in name[-1]) */ ++name; - id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, name, sizeof(ATTRIBUTE_ID)); - if (!id) + id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, name, + sizeof(ATTRIBUTE_ID)); + if (! id) return NULL; if (id->name != name) poolDiscard(&dtd->pool); else { poolFinish(&dtd->pool); - if (!parser->m_ns) + if (! parser->m_ns) ; - else if (name[0] == XML_T(ASCII_x) - && name[1] == XML_T(ASCII_m) - && name[2] == XML_T(ASCII_l) - && name[3] == XML_T(ASCII_n) - && name[4] == XML_T(ASCII_s) - && (name[5] == XML_T('\0') || name[5] == XML_T(ASCII_COLON))) { + else if (name[0] == XML_T(ASCII_x) && name[1] == XML_T(ASCII_m) + && name[2] == XML_T(ASCII_l) && name[3] == XML_T(ASCII_n) + && name[4] == XML_T(ASCII_s) + && (name[5] == XML_T('\0') || name[5] == XML_T(ASCII_COLON))) { if (name[5] == XML_T('\0')) id->prefix = &dtd->defaultPrefix; else - id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, name + 6, sizeof(PREFIX)); + id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, name + 6, + sizeof(PREFIX)); id->xmlns = XML_TRUE; - } - else { + } else { int i; for (i = 0; name[i]; i++) { /* attributes without prefix are *not* in the default namespace */ if (name[i] == XML_T(ASCII_COLON)) { int j; for (j = 0; j < i; j++) { - if (!poolAppendChar(&dtd->pool, name[j])) + if (! poolAppendChar(&dtd->pool, name[j])) return NULL; } - if (!poolAppendChar(&dtd->pool, XML_T('\0'))) + if (! poolAppendChar(&dtd->pool, XML_T('\0'))) return NULL; - id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool), - sizeof(PREFIX)); - if (!id->prefix) + id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, + poolStart(&dtd->pool), sizeof(PREFIX)); + if (! id->prefix) return NULL; if (id->prefix->name == poolStart(&dtd->pool)) poolFinish(&dtd->pool); @@ -6143,22 +5875,22 @@ getAttributeId(XML_Parser parser, const ENCODING *enc, #define CONTEXT_SEP XML_T(ASCII_FF) static const XML_Char * -getContext(XML_Parser parser) -{ - DTD * const dtd = parser->m_dtd; /* save one level of indirection */ +getContext(XML_Parser parser) { + DTD *const dtd = parser->m_dtd; /* save one level of indirection */ HASH_TABLE_ITER iter; XML_Bool needSep = XML_FALSE; if (dtd->defaultPrefix.binding) { int i; int len; - if (!poolAppendChar(&parser->m_tempPool, XML_T(ASCII_EQUALS))) + if (! poolAppendChar(&parser->m_tempPool, XML_T(ASCII_EQUALS))) return NULL; len = dtd->defaultPrefix.binding->uriLen; if (parser->m_namespaceSeparator) len--; for (i = 0; i < len; i++) { - if (!poolAppendChar(&parser->m_tempPool, dtd->defaultPrefix.binding->uri[i])) { + if (! poolAppendChar(&parser->m_tempPool, + dtd->defaultPrefix.binding->uri[i])) { /* Because of memory caching, I don't believe this line can be * executed. * @@ -6190,9 +5922,9 @@ getContext(XML_Parser parser) int len; const XML_Char *s; PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter); - if (!prefix) + if (! prefix) break; - if (!prefix->binding) { + if (! prefix->binding) { /* This test appears to be (justifiable) paranoia. There does * not seem to be a way of injecting a prefix without a binding * that doesn't get errored long before this function is called. @@ -6201,98 +5933,96 @@ getContext(XML_Parser parser) */ continue; /* LCOV_EXCL_LINE */ } - if (needSep && !poolAppendChar(&parser->m_tempPool, CONTEXT_SEP)) + if (needSep && ! poolAppendChar(&parser->m_tempPool, CONTEXT_SEP)) return NULL; for (s = prefix->name; *s; s++) - if (!poolAppendChar(&parser->m_tempPool, *s)) + if (! poolAppendChar(&parser->m_tempPool, *s)) return NULL; - if (!poolAppendChar(&parser->m_tempPool, XML_T(ASCII_EQUALS))) + if (! poolAppendChar(&parser->m_tempPool, XML_T(ASCII_EQUALS))) return NULL; len = prefix->binding->uriLen; if (parser->m_namespaceSeparator) len--; for (i = 0; i < len; i++) - if (!poolAppendChar(&parser->m_tempPool, prefix->binding->uri[i])) + if (! poolAppendChar(&parser->m_tempPool, prefix->binding->uri[i])) return NULL; needSep = XML_TRUE; } - hashTableIterInit(&iter, &(dtd->generalEntities)); for (;;) { const XML_Char *s; ENTITY *e = (ENTITY *)hashTableIterNext(&iter); - if (!e) + if (! e) break; - if (!e->open) + if (! e->open) continue; - if (needSep && !poolAppendChar(&parser->m_tempPool, CONTEXT_SEP)) + if (needSep && ! poolAppendChar(&parser->m_tempPool, CONTEXT_SEP)) return NULL; for (s = e->name; *s; s++) - if (!poolAppendChar(&parser->m_tempPool, *s)) + if (! poolAppendChar(&parser->m_tempPool, *s)) return 0; needSep = XML_TRUE; } - if (!poolAppendChar(&parser->m_tempPool, XML_T('\0'))) + if (! poolAppendChar(&parser->m_tempPool, XML_T('\0'))) return NULL; return parser->m_tempPool.start; } static XML_Bool -setContext(XML_Parser parser, const XML_Char *context) -{ - DTD * const dtd = parser->m_dtd; /* save one level of indirection */ +setContext(XML_Parser parser, const XML_Char *context) { + DTD *const dtd = parser->m_dtd; /* save one level of indirection */ const XML_Char *s = context; while (*context != XML_T('\0')) { if (*s == CONTEXT_SEP || *s == XML_T('\0')) { ENTITY *e; - if (!poolAppendChar(&parser->m_tempPool, XML_T('\0'))) + if (! poolAppendChar(&parser->m_tempPool, XML_T('\0'))) return XML_FALSE; - e = (ENTITY *)lookup(parser, &dtd->generalEntities, poolStart(&parser->m_tempPool), 0); + e = (ENTITY *)lookup(parser, &dtd->generalEntities, + poolStart(&parser->m_tempPool), 0); if (e) e->open = XML_TRUE; if (*s != XML_T('\0')) s++; context = s; poolDiscard(&parser->m_tempPool); - } - else if (*s == XML_T(ASCII_EQUALS)) { + } else if (*s == XML_T(ASCII_EQUALS)) { PREFIX *prefix; if (poolLength(&parser->m_tempPool) == 0) prefix = &dtd->defaultPrefix; else { - if (!poolAppendChar(&parser->m_tempPool, XML_T('\0'))) + if (! poolAppendChar(&parser->m_tempPool, XML_T('\0'))) return XML_FALSE; - prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&parser->m_tempPool), - sizeof(PREFIX)); - if (!prefix) + prefix + = (PREFIX *)lookup(parser, &dtd->prefixes, + poolStart(&parser->m_tempPool), sizeof(PREFIX)); + if (! prefix) return XML_FALSE; if (prefix->name == poolStart(&parser->m_tempPool)) { prefix->name = poolCopyString(&dtd->pool, prefix->name); - if (!prefix->name) + if (! prefix->name) return XML_FALSE; } poolDiscard(&parser->m_tempPool); } - for (context = s + 1; - *context != CONTEXT_SEP && *context != XML_T('\0'); + for (context = s + 1; *context != CONTEXT_SEP && *context != XML_T('\0'); context++) - if (!poolAppendChar(&parser->m_tempPool, *context)) + if (! poolAppendChar(&parser->m_tempPool, *context)) return XML_FALSE; - if (!poolAppendChar(&parser->m_tempPool, XML_T('\0'))) + if (! poolAppendChar(&parser->m_tempPool, XML_T('\0'))) return XML_FALSE; if (addBinding(parser, prefix, NULL, poolStart(&parser->m_tempPool), - &parser->m_inheritedBindings) != XML_ERROR_NONE) + &parser->m_inheritedBindings) + != XML_ERROR_NONE) return XML_FALSE; poolDiscard(&parser->m_tempPool); if (*context != XML_T('\0')) ++context; s = context; - } - else { - if (!poolAppendChar(&parser->m_tempPool, *s)) + } else { + if (! poolAppendChar(&parser->m_tempPool, *s)) return XML_FALSE; s++; } @@ -6301,8 +6031,7 @@ setContext(XML_Parser parser, const XML_Char *context) } static void FASTCALL -normalizePublicId(XML_Char *publicId) -{ +normalizePublicId(XML_Char *publicId) { XML_Char *p = publicId; XML_Char *s; for (s = publicId; *s; s++) { @@ -6323,8 +6052,7 @@ normalizePublicId(XML_Char *publicId) } static DTD * -dtdCreate(const XML_Memory_Handling_Suite *ms) -{ +dtdCreate(const XML_Memory_Handling_Suite *ms) { DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD)); if (p == NULL) return p; @@ -6356,13 +6084,12 @@ dtdCreate(const XML_Memory_Handling_Suite *ms) } static void -dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) -{ +dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) { HASH_TABLE_ITER iter; hashTableIterInit(&iter, &(p->elementTypes)); for (;;) { ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); - if (!e) + if (! e) break; if (e->allocDefaultAtts != 0) ms->free_fcn(e->defaultAtts); @@ -6398,13 +6125,12 @@ dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) } static void -dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) -{ +dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) { HASH_TABLE_ITER iter; hashTableIterInit(&iter, &(p->elementTypes)); for (;;) { ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); - if (!e) + if (! e) break; if (e->allocDefaultAtts != 0) ms->free_fcn(e->defaultAtts); @@ -6429,8 +6155,8 @@ dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) The new DTD has already been initialized. */ static int -dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) -{ +dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, + const XML_Memory_Handling_Suite *ms) { HASH_TABLE_ITER iter; /* Copy the prefix table. */ @@ -6439,12 +6165,12 @@ dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, const XML_Memory_H for (;;) { const XML_Char *name; const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter); - if (!oldP) + if (! oldP) break; name = poolCopyString(&(newDtd->pool), oldP->name); - if (!name) + if (! name) return 0; - if (!lookup(oldParser, &(newDtd->prefixes), name, sizeof(PREFIX))) + if (! lookup(oldParser, &(newDtd->prefixes), name, sizeof(PREFIX))) return 0; } @@ -6457,18 +6183,18 @@ dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, const XML_Memory_H const XML_Char *name; const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter); - if (!oldA) + if (! oldA) break; /* Remember to allocate the scratch byte before the name. */ - if (!poolAppendChar(&(newDtd->pool), XML_T('\0'))) + if (! poolAppendChar(&(newDtd->pool), XML_T('\0'))) return 0; name = poolCopyString(&(newDtd->pool), oldA->name); - if (!name) + if (! name) return 0; ++name; newA = (ATTRIBUTE_ID *)lookup(oldParser, &(newDtd->attributeIds), name, sizeof(ATTRIBUTE_ID)); - if (!newA) + if (! newA) return 0; newA->maybeTokenized = oldA->maybeTokenized; if (oldA->prefix) { @@ -6490,57 +6216,52 @@ dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, const XML_Memory_H ELEMENT_TYPE *newE; const XML_Char *name; const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter); - if (!oldE) + if (! oldE) break; name = poolCopyString(&(newDtd->pool), oldE->name); - if (!name) + if (! name) return 0; newE = (ELEMENT_TYPE *)lookup(oldParser, &(newDtd->elementTypes), name, sizeof(ELEMENT_TYPE)); - if (!newE) + if (! newE) return 0; if (oldE->nDefaultAtts) { - newE->defaultAtts = (DEFAULT_ATTRIBUTE *) - ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); - if (!newE->defaultAtts) { + newE->defaultAtts = (DEFAULT_ATTRIBUTE *)ms->malloc_fcn( + oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); + if (! newE->defaultAtts) { return 0; } } if (oldE->idAtt) - newE->idAtt = (ATTRIBUTE_ID *) - lookup(oldParser, &(newDtd->attributeIds), oldE->idAtt->name, 0); + newE->idAtt = (ATTRIBUTE_ID *)lookup(oldParser, &(newDtd->attributeIds), + oldE->idAtt->name, 0); newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts; if (oldE->prefix) newE->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes), oldE->prefix->name, 0); for (i = 0; i < newE->nDefaultAtts; i++) { - newE->defaultAtts[i].id = (ATTRIBUTE_ID *) - lookup(oldParser, &(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); + newE->defaultAtts[i].id = (ATTRIBUTE_ID *)lookup( + oldParser, &(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; if (oldE->defaultAtts[i].value) { newE->defaultAtts[i].value = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value); - if (!newE->defaultAtts[i].value) + if (! newE->defaultAtts[i].value) return 0; - } - else + } else newE->defaultAtts[i].value = NULL; } } /* Copy the entity tables. */ - if (!copyEntityTable(oldParser, - &(newDtd->generalEntities), - &(newDtd->pool), - &(oldDtd->generalEntities))) - return 0; + if (! copyEntityTable(oldParser, &(newDtd->generalEntities), &(newDtd->pool), + &(oldDtd->generalEntities))) + return 0; #ifdef XML_DTD - if (!copyEntityTable(oldParser, - &(newDtd->paramEntities), - &(newDtd->pool), - &(oldDtd->paramEntities))) - return 0; + if (! copyEntityTable(oldParser, &(newDtd->paramEntities), &(newDtd->pool), + &(oldDtd->paramEntities))) + return 0; newDtd->paramEntityRead = oldDtd->paramEntityRead; #endif /* XML_DTD */ @@ -6557,14 +6278,11 @@ dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, const XML_Memory_H newDtd->scaffIndex = oldDtd->scaffIndex; return 1; -} /* End dtdCopy */ +} /* End dtdCopy */ static int -copyEntityTable(XML_Parser oldParser, - HASH_TABLE *newTable, - STRING_POOL *newPool, - const HASH_TABLE *oldTable) -{ +copyEntityTable(XML_Parser oldParser, HASH_TABLE *newTable, + STRING_POOL *newPool, const HASH_TABLE *oldTable) { HASH_TABLE_ITER iter; const XML_Char *cachedOldBase = NULL; const XML_Char *cachedNewBase = NULL; @@ -6575,17 +6293,17 @@ copyEntityTable(XML_Parser oldParser, ENTITY *newE; const XML_Char *name; const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter); - if (!oldE) + if (! oldE) break; name = poolCopyString(newPool, oldE->name); - if (!name) + if (! name) return 0; newE = (ENTITY *)lookup(oldParser, newTable, name, sizeof(ENTITY)); - if (!newE) + if (! newE) return 0; if (oldE->systemId) { const XML_Char *tem = poolCopyString(newPool, oldE->systemId); - if (!tem) + if (! tem) return 0; newE->systemId = tem; if (oldE->base) { @@ -6594,29 +6312,28 @@ copyEntityTable(XML_Parser oldParser, else { cachedOldBase = oldE->base; tem = poolCopyString(newPool, cachedOldBase); - if (!tem) + if (! tem) return 0; cachedNewBase = newE->base = tem; } } if (oldE->publicId) { tem = poolCopyString(newPool, oldE->publicId); - if (!tem) + if (! tem) return 0; newE->publicId = tem; } - } - else { - const XML_Char *tem = poolCopyStringN(newPool, oldE->textPtr, - oldE->textLen); - if (!tem) + } else { + const XML_Char *tem + = poolCopyStringN(newPool, oldE->textPtr, oldE->textLen); + if (! tem) return 0; newE->textPtr = tem; newE->textLen = oldE->textLen; } if (oldE->notation) { const XML_Char *tem = poolCopyString(newPool, oldE->notation); - if (!tem) + if (! tem) return 0; newE->notation = tem; } @@ -6629,8 +6346,7 @@ copyEntityTable(XML_Parser oldParser, #define INIT_POWER 6 static XML_Bool FASTCALL -keyeq(KEY s1, KEY s2) -{ +keyeq(KEY s1, KEY s2) { for (; *s1 == *s2; s1++, s2++) if (*s1 == 0) return XML_TRUE; @@ -6638,23 +6354,21 @@ keyeq(KEY s1, KEY s2) } static size_t -keylen(KEY s) -{ +keylen(KEY s) { size_t len = 0; - for (; *s; s++, len++); + for (; *s; s++, len++) + ; return len; } static void -copy_salt_to_sipkey(XML_Parser parser, struct sipkey * key) -{ +copy_salt_to_sipkey(XML_Parser parser, struct sipkey *key) { key->k[0] = 0; key->k[1] = get_hash_secret_salt(parser); } static unsigned long FASTCALL -hash(XML_Parser parser, KEY s) -{ +hash(XML_Parser parser, KEY s) { struct siphash state; struct sipkey key; (void)sip24_valid; @@ -6665,26 +6379,24 @@ hash(XML_Parser parser, KEY s) } static NAMED * -lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) -{ +lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) { size_t i; if (table->size == 0) { size_t tsize; - if (!createSize) + if (! createSize) return NULL; table->power = INIT_POWER; /* table->size is a power of 2 */ table->size = (size_t)1 << INIT_POWER; tsize = table->size * sizeof(NAMED *); table->v = (NAMED **)table->mem->malloc_fcn(tsize); - if (!table->v) { + if (! table->v) { table->size = 0; return NULL; } memset(table->v, 0, tsize); i = hash(parser, name) & ((unsigned long)table->size - 1); - } - else { + } else { unsigned long h = hash(parser, name); unsigned long mask = (unsigned long)table->size - 1; unsigned char step = 0; @@ -6692,11 +6404,11 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) while (table->v[i]) { if (keyeq(name, table->v[i]->name)) return table->v[i]; - if (!step) + if (! step) step = PROBE_STEP(h, mask, table->power); i < step ? (i += table->size - step) : (i -= step); } - if (!createSize) + if (! createSize) return NULL; /* check for overflow (table is half full) */ @@ -6706,7 +6418,7 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) unsigned long newMask = (unsigned long)newSize - 1; size_t tsize = newSize * sizeof(NAMED *); NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize); - if (!newV) + if (! newV) return NULL; memset(newV, 0, tsize); for (i = 0; i < table->size; i++) @@ -6715,7 +6427,7 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) size_t j = newHash & newMask; step = 0; while (newV[j]) { - if (!step) + if (! step) step = PROBE_STEP(newHash, newMask, newPower); j < step ? (j += newSize - step) : (j -= step); } @@ -6728,14 +6440,14 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) i = h & newMask; step = 0; while (table->v[i]) { - if (!step) + if (! step) step = PROBE_STEP(h, newMask, newPower); i < step ? (i += newSize - step) : (i -= step); } } } table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize); - if (!table->v[i]) + if (! table->v[i]) return NULL; memset(table->v[i], 0, createSize); table->v[i]->name = name; @@ -6744,8 +6456,7 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) } static void FASTCALL -hashTableClear(HASH_TABLE *table) -{ +hashTableClear(HASH_TABLE *table) { size_t i; for (i = 0; i < table->size; i++) { table->mem->free_fcn(table->v[i]); @@ -6755,8 +6466,7 @@ hashTableClear(HASH_TABLE *table) } static void FASTCALL -hashTableDestroy(HASH_TABLE *table) -{ +hashTableDestroy(HASH_TABLE *table) { size_t i; for (i = 0; i < table->size; i++) table->mem->free_fcn(table->v[i]); @@ -6764,8 +6474,7 @@ hashTableDestroy(HASH_TABLE *table) } static void FASTCALL -hashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms) -{ +hashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms) { p->power = 0; p->size = 0; p->used = 0; @@ -6774,15 +6483,13 @@ hashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms) } static void FASTCALL -hashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table) -{ +hashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table) { iter->p = table->v; iter->end = iter->p + table->size; } -static NAMED * FASTCALL -hashTableIterNext(HASH_TABLE_ITER *iter) -{ +static NAMED *FASTCALL +hashTableIterNext(HASH_TABLE_ITER *iter) { while (iter->p != iter->end) { NAMED *tem = *(iter->p)++; if (tem) @@ -6792,8 +6499,7 @@ hashTableIterNext(HASH_TABLE_ITER *iter) } static void FASTCALL -poolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms) -{ +poolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms) { pool->blocks = NULL; pool->freeBlocks = NULL; pool->start = NULL; @@ -6803,9 +6509,8 @@ poolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms) } static void FASTCALL -poolClear(STRING_POOL *pool) -{ - if (!pool->freeBlocks) +poolClear(STRING_POOL *pool) { + if (! pool->freeBlocks) pool->freeBlocks = pool->blocks; else { BLOCK *p = pool->blocks; @@ -6823,8 +6528,7 @@ poolClear(STRING_POOL *pool) } static void FASTCALL -poolDestroy(STRING_POOL *pool) -{ +poolDestroy(STRING_POOL *pool) { BLOCK *p = pool->blocks; while (p) { BLOCK *tem = p->next; @@ -6840,26 +6544,26 @@ poolDestroy(STRING_POOL *pool) } static XML_Char * -poolAppend(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end) -{ - if (!pool->ptr && !poolGrow(pool)) +poolAppend(STRING_POOL *pool, const ENCODING *enc, const char *ptr, + const char *end) { + if (! pool->ptr && ! poolGrow(pool)) return NULL; for (;;) { - const enum XML_Convert_Result convert_res = XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); - if ((convert_res == XML_CONVERT_COMPLETED) || (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) + const enum XML_Convert_Result convert_res = XmlConvert( + enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); + if ((convert_res == XML_CONVERT_COMPLETED) + || (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) break; - if (!poolGrow(pool)) + if (! poolGrow(pool)) return NULL; } return pool->start; } -static const XML_Char * FASTCALL -poolCopyString(STRING_POOL *pool, const XML_Char *s) -{ +static const XML_Char *FASTCALL +poolCopyString(STRING_POOL *pool, const XML_Char *s) { do { - if (!poolAppendChar(pool, *s)) + if (! poolAppendChar(pool, *s)) return NULL; } while (*s++); s = pool->start; @@ -6868,9 +6572,8 @@ poolCopyString(STRING_POOL *pool, const XML_Char *s) } static const XML_Char * -poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) -{ - if (!pool->ptr && !poolGrow(pool)) { +poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) { + if (! pool->ptr && ! poolGrow(pool)) { /* The following line is unreachable given the current usage of * poolCopyStringN(). Currently it is called from exactly one * place to copy the text of a simple general entity. By that @@ -6885,7 +6588,7 @@ poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) return NULL; /* LCOV_EXCL_LINE */ } for (; n > 0; --n, s++) { - if (!poolAppendChar(pool, *s)) + if (! poolAppendChar(pool, *s)) return NULL; } s = pool->start; @@ -6893,11 +6596,10 @@ poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) return s; } -static const XML_Char * FASTCALL -poolAppendString(STRING_POOL *pool, const XML_Char *s) -{ +static const XML_Char *FASTCALL +poolAppendString(STRING_POOL *pool, const XML_Char *s) { while (*s) { - if (!poolAppendChar(pool, *s)) + if (! poolAppendChar(pool, *s)) return NULL; s++; } @@ -6905,20 +6607,18 @@ poolAppendString(STRING_POOL *pool, const XML_Char *s) } static XML_Char * -poolStoreString(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end) -{ - if (!poolAppend(pool, enc, ptr, end)) +poolStoreString(STRING_POOL *pool, const ENCODING *enc, const char *ptr, + const char *end) { + if (! poolAppend(pool, enc, ptr, end)) return NULL; - if (pool->ptr == pool->end && !poolGrow(pool)) + if (pool->ptr == pool->end && ! poolGrow(pool)) return NULL; *(pool->ptr)++ = 0; return pool->start; } static size_t -poolBytesToAllocateFor(int blockSize) -{ +poolBytesToAllocateFor(int blockSize) { /* Unprotected math would be: ** return offsetof(BLOCK, s) + blockSize * sizeof(XML_Char); ** @@ -6926,7 +6626,7 @@ poolBytesToAllocateFor(int blockSize) ** For a + b * c we check b * c in isolation first, so that addition of a ** on top has no chance of making us accept a small non-negative number */ - const size_t stretch = sizeof(XML_Char); /* can be 4 bytes */ + const size_t stretch = sizeof(XML_Char); /* can be 4 bytes */ if (blockSize <= 0) return 0; @@ -6936,8 +6636,8 @@ poolBytesToAllocateFor(int blockSize) { const int stretchedBlockSize = blockSize * (int)stretch; - const int bytesToAllocate = (int)( - offsetof(BLOCK, s) + (unsigned)stretchedBlockSize); + const int bytesToAllocate + = (int)(offsetof(BLOCK, s) + (unsigned)stretchedBlockSize); if (bytesToAllocate < 0) return 0; @@ -6946,8 +6646,7 @@ poolBytesToAllocateFor(int blockSize) } static XML_Bool FASTCALL -poolGrow(STRING_POOL *pool) -{ +poolGrow(STRING_POOL *pool) { if (pool->freeBlocks) { if (pool->start == 0) { pool->blocks = pool->freeBlocks; @@ -6973,7 +6672,7 @@ poolGrow(STRING_POOL *pool) } if (pool->blocks && pool->start == pool->blocks->s) { BLOCK *temp; - int blockSize = (int)((unsigned)(pool->end - pool->start)*2U); + int blockSize = (int)((unsigned)(pool->end - pool->start) * 2U); size_t bytesToAllocate; /* NOTE: Needs to be calculated prior to calling `realloc` @@ -6994,8 +6693,8 @@ poolGrow(STRING_POOL *pool) if (bytesToAllocate == 0) return XML_FALSE; - temp = (BLOCK *) - pool->mem->realloc_fcn(pool->blocks, (unsigned)bytesToAllocate); + temp = (BLOCK *)pool->mem->realloc_fcn(pool->blocks, + (unsigned)bytesToAllocate); if (temp == NULL) return XML_FALSE; pool->blocks = temp; @@ -7003,8 +6702,7 @@ poolGrow(STRING_POOL *pool) pool->ptr = pool->blocks->s + offsetInsideBlock; pool->start = pool->blocks->s; pool->end = pool->start + blockSize; - } - else { + } else { BLOCK *tem; int blockSize = (int)(pool->end - pool->start); size_t bytesToAllocate; @@ -7019,7 +6717,7 @@ poolGrow(STRING_POOL *pool) * function). Either way it isn't readily testable, so we * exclude it from the coverage statistics. */ - return XML_FALSE; /* LCOV_EXCL_LINE */ + return XML_FALSE; /* LCOV_EXCL_LINE */ } if (blockSize < INIT_BLOCK_SIZE) @@ -7037,14 +6735,13 @@ poolGrow(STRING_POOL *pool) return XML_FALSE; tem = (BLOCK *)pool->mem->malloc_fcn(bytesToAllocate); - if (!tem) + if (! tem) return XML_FALSE; tem->size = blockSize; tem->next = pool->blocks; pool->blocks = tem; if (pool->ptr != pool->start) - memcpy(tem->s, pool->start, - (pool->ptr - pool->start) * sizeof(XML_Char)); + memcpy(tem->s, pool->start, (pool->ptr - pool->start) * sizeof(XML_Char)); pool->ptr = tem->s + (pool->ptr - pool->start); pool->start = tem->s; pool->end = tem->s + blockSize; @@ -7053,15 +6750,14 @@ poolGrow(STRING_POOL *pool) } static int FASTCALL -nextScaffoldPart(XML_Parser parser) -{ - DTD * const dtd = parser->m_dtd; /* save one level of indirection */ - CONTENT_SCAFFOLD * me; +nextScaffoldPart(XML_Parser parser) { + DTD *const dtd = parser->m_dtd; /* save one level of indirection */ + CONTENT_SCAFFOLD *me; int next; - if (!dtd->scaffIndex) { + if (! dtd->scaffIndex) { dtd->scaffIndex = (int *)MALLOC(parser, parser->m_groupSize * sizeof(int)); - if (!dtd->scaffIndex) + if (! dtd->scaffIndex) return -1; dtd->scaffIndex[0] = 0; } @@ -7069,15 +6765,14 @@ nextScaffoldPart(XML_Parser parser) if (dtd->scaffCount >= dtd->scaffSize) { CONTENT_SCAFFOLD *temp; if (dtd->scaffold) { - temp = (CONTENT_SCAFFOLD *) - REALLOC(parser, dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD)); + temp = (CONTENT_SCAFFOLD *)REALLOC( + parser, dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD)); if (temp == NULL) return -1; dtd->scaffSize *= 2; - } - else { + } else { temp = (CONTENT_SCAFFOLD *)MALLOC(parser, INIT_SCAFFOLD_ELEMENTS - * sizeof(CONTENT_SCAFFOLD)); + * sizeof(CONTENT_SCAFFOLD)); if (temp == NULL) return -1; dtd->scaffSize = INIT_SCAFFOLD_ELEMENTS; @@ -7087,11 +6782,12 @@ nextScaffoldPart(XML_Parser parser) next = dtd->scaffCount++; me = &dtd->scaffold[next]; if (dtd->scaffLevel) { - CONTENT_SCAFFOLD *parent = &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel-1]]; + CONTENT_SCAFFOLD *parent + = &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]]; if (parent->lastchild) { dtd->scaffold[parent->lastchild].nextsib = next; } - if (!parent->childcnt) + if (! parent->childcnt) parent->firstchild = next; parent->lastchild = next; parent->childcnt++; @@ -7101,13 +6797,9 @@ nextScaffoldPart(XML_Parser parser) } static void -build_node(XML_Parser parser, - int src_node, - XML_Content *dest, - XML_Content **contpos, - XML_Char **strpos) -{ - DTD * const dtd = parser->m_dtd; /* save one level of indirection */ +build_node(XML_Parser parser, int src_node, XML_Content *dest, + XML_Content **contpos, XML_Char **strpos) { + DTD *const dtd = parser->m_dtd; /* save one level of indirection */ dest->type = dtd->scaffold[src_node].type; dest->quant = dtd->scaffold[src_node].quant; if (dest->type == XML_CTYPE_NAME) { @@ -7116,21 +6808,19 @@ build_node(XML_Parser parser, src = dtd->scaffold[src_node].name; for (;;) { *(*strpos)++ = *src; - if (!*src) + if (! *src) break; src++; } dest->numchildren = 0; dest->children = NULL; - } - else { + } else { unsigned int i; int cn; dest->numchildren = dtd->scaffold[src_node].childcnt; dest->children = *contpos; *contpos += dest->numchildren; - for (i = 0, cn = dtd->scaffold[src_node].firstchild; - i < dest->numchildren; + for (i = 0, cn = dtd->scaffold[src_node].firstchild; i < dest->numchildren; i++, cn = dtd->scaffold[cn].nextsib) { build_node(parser, cn, &(dest->children[i]), contpos, strpos); } @@ -7139,20 +6829,19 @@ build_node(XML_Parser parser, } static XML_Content * -build_model (XML_Parser parser) -{ - DTD * const dtd = parser->m_dtd; /* save one level of indirection */ +build_model(XML_Parser parser) { + DTD *const dtd = parser->m_dtd; /* save one level of indirection */ XML_Content *ret; XML_Content *cpos; - XML_Char * str; + XML_Char *str; int allocsize = (dtd->scaffCount * sizeof(XML_Content) + (dtd->contentStringLen * sizeof(XML_Char))); ret = (XML_Content *)MALLOC(parser, allocsize); - if (!ret) + if (! ret) return NULL; - str = (XML_Char *) (&ret[dtd->scaffCount]); + str = (XML_Char *)(&ret[dtd->scaffCount]); cpos = &ret[1]; build_node(parser, 0, ret, &cpos, &str); @@ -7160,49 +6849,45 @@ build_model (XML_Parser parser) } static ELEMENT_TYPE * -getElementType(XML_Parser parser, - const ENCODING *enc, - const char *ptr, - const char *end) -{ - DTD * const dtd = parser->m_dtd; /* save one level of indirection */ +getElementType(XML_Parser parser, const ENCODING *enc, const char *ptr, + const char *end) { + DTD *const dtd = parser->m_dtd; /* save one level of indirection */ const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end); ELEMENT_TYPE *ret; - if (!name) + if (! name) return NULL; - ret = (ELEMENT_TYPE *) lookup(parser, &dtd->elementTypes, name, sizeof(ELEMENT_TYPE)); - if (!ret) + ret = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, name, + sizeof(ELEMENT_TYPE)); + if (! ret) return NULL; if (ret->name != name) poolDiscard(&dtd->pool); else { poolFinish(&dtd->pool); - if (!setElementTypePrefix(parser, ret)) + if (! setElementTypePrefix(parser, ret)) return NULL; } return ret; } static XML_Char * -copyString(const XML_Char *s, - const XML_Memory_Handling_Suite *memsuite) -{ - int charsRequired = 0; - XML_Char *result; - - /* First determine how long the string is */ - while (s[charsRequired] != 0) { - charsRequired++; - } - /* Include the terminator */ +copyString(const XML_Char *s, const XML_Memory_Handling_Suite *memsuite) { + int charsRequired = 0; + XML_Char *result; + + /* First determine how long the string is */ + while (s[charsRequired] != 0) { charsRequired++; + } + /* Include the terminator */ + charsRequired++; - /* Now allocate space for the copy */ - result = memsuite->malloc_fcn(charsRequired * sizeof(XML_Char)); - if (result == NULL) - return NULL; - /* Copy the original into place */ - memcpy(result, s, charsRequired * sizeof(XML_Char)); - return result; + /* Now allocate space for the copy */ + result = memsuite->malloc_fcn(charsRequired * sizeof(XML_Char)); + if (result == NULL) + return NULL; + /* Copy the original into place */ + memcpy(result, s, charsRequired * sizeof(XML_Char)); + return result; } diff --git a/Modules/expat/xmlrole.c b/Modules/expat/xmlrole.c index 708507d575be84..4d3e3e86e9e864 100644 --- a/Modules/expat/xmlrole.c +++ b/Modules/expat/xmlrole.c @@ -33,11 +33,11 @@ #include #ifdef _WIN32 -#include "winconfig.h" +# include "winconfig.h" #else -#ifdef HAVE_EXPAT_CONFIG_H -#include -#endif +# ifdef HAVE_EXPAT_CONFIG_H +# include +# endif #endif /* ndef _WIN32 */ #include "expat_external.h" @@ -52,107 +52,88 @@ */ -static const char KW_ANY[] = { - ASCII_A, ASCII_N, ASCII_Y, '\0' }; -static const char KW_ATTLIST[] = { - ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' }; -static const char KW_CDATA[] = { - ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; -static const char KW_DOCTYPE[] = { - ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' }; -static const char KW_ELEMENT[] = { - ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' }; -static const char KW_EMPTY[] = { - ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' }; -static const char KW_ENTITIES[] = { - ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, - '\0' }; -static const char KW_ENTITY[] = { - ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; -static const char KW_FIXED[] = { - ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' }; -static const char KW_ID[] = { - ASCII_I, ASCII_D, '\0' }; -static const char KW_IDREF[] = { - ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; -static const char KW_IDREFS[] = { - ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; +static const char KW_ANY[] = {ASCII_A, ASCII_N, ASCII_Y, '\0'}; +static const char KW_ATTLIST[] + = {ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0'}; +static const char KW_CDATA[] + = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'}; +static const char KW_DOCTYPE[] + = {ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0'}; +static const char KW_ELEMENT[] + = {ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0'}; +static const char KW_EMPTY[] + = {ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0'}; +static const char KW_ENTITIES[] = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, + ASCII_I, ASCII_E, ASCII_S, '\0'}; +static const char KW_ENTITY[] + = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0'}; +static const char KW_FIXED[] + = {ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0'}; +static const char KW_ID[] = {ASCII_I, ASCII_D, '\0'}; +static const char KW_IDREF[] + = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0'}; +static const char KW_IDREFS[] + = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0'}; #ifdef XML_DTD -static const char KW_IGNORE[] = { - ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' }; +static const char KW_IGNORE[] + = {ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0'}; #endif -static const char KW_IMPLIED[] = { - ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' }; +static const char KW_IMPLIED[] + = {ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0'}; #ifdef XML_DTD -static const char KW_INCLUDE[] = { - ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' }; +static const char KW_INCLUDE[] + = {ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0'}; #endif -static const char KW_NDATA[] = { - ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; -static const char KW_NMTOKEN[] = { - ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; -static const char KW_NMTOKENS[] = { - ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, - '\0' }; -static const char KW_NOTATION[] = - { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, - '\0' }; -static const char KW_PCDATA[] = { - ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; -static const char KW_PUBLIC[] = { - ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' }; -static const char KW_REQUIRED[] = { - ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D, - '\0' }; -static const char KW_SYSTEM[] = { - ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' }; +static const char KW_NDATA[] + = {ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'}; +static const char KW_NMTOKEN[] + = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0'}; +static const char KW_NMTOKENS[] = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, + ASCII_E, ASCII_N, ASCII_S, '\0'}; +static const char KW_NOTATION[] = {ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, + ASCII_I, ASCII_O, ASCII_N, '\0'}; +static const char KW_PCDATA[] + = {ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'}; +static const char KW_PUBLIC[] + = {ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0'}; +static const char KW_REQUIRED[] = {ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, + ASCII_R, ASCII_E, ASCII_D, '\0'}; +static const char KW_SYSTEM[] + = {ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0'}; #ifndef MIN_BYTES_PER_CHAR -#define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar) +# define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar) #endif #ifdef XML_DTD -#define setTopLevel(state) \ - ((state)->handler = ((state)->documentEntity \ - ? internalSubset \ - : externalSubset1)) +# define setTopLevel(state) \ + ((state)->handler \ + = ((state)->documentEntity ? internalSubset : externalSubset1)) #else /* not XML_DTD */ -#define setTopLevel(state) ((state)->handler = internalSubset) +# define setTopLevel(state) ((state)->handler = internalSubset) #endif /* not XML_DTD */ -typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, +typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state, int tok, + const char *ptr, const char *end, const ENCODING *enc); -static PROLOG_HANDLER - prolog0, prolog1, prolog2, - doctype0, doctype1, doctype2, doctype3, doctype4, doctype5, - internalSubset, - entity0, entity1, entity2, entity3, entity4, entity5, entity6, - entity7, entity8, entity9, entity10, - notation0, notation1, notation2, notation3, notation4, - attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6, - attlist7, attlist8, attlist9, - element0, element1, element2, element3, element4, element5, element6, - element7, +static PROLOG_HANDLER prolog0, prolog1, prolog2, doctype0, doctype1, doctype2, + doctype3, doctype4, doctype5, internalSubset, entity0, entity1, entity2, + entity3, entity4, entity5, entity6, entity7, entity8, entity9, entity10, + notation0, notation1, notation2, notation3, notation4, attlist0, attlist1, + attlist2, attlist3, attlist4, attlist5, attlist6, attlist7, attlist8, + attlist9, element0, element1, element2, element3, element4, element5, + element6, element7, #ifdef XML_DTD - externalSubset0, externalSubset1, - condSect0, condSect1, condSect2, + externalSubset0, externalSubset1, condSect0, condSect1, condSect2, #endif /* XML_DTD */ - declClose, - error; + declClose, error; static int FASTCALL common(PROLOG_STATE *state, int tok); static int PTRCALL -prolog0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ +prolog0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: state->handler = prolog1; @@ -169,10 +150,8 @@ prolog0(PROLOG_STATE *state, case XML_TOK_BOM: return XML_ROLE_NONE; case XML_TOK_DECL_OPEN: - if (!XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_DOCTYPE)) + if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end, + KW_DOCTYPE)) break; state->handler = doctype0; return XML_ROLE_DOCTYPE_NONE; @@ -184,12 +163,8 @@ prolog0(PROLOG_STATE *state, } static int PTRCALL -prolog1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ +prolog1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; @@ -207,10 +182,8 @@ prolog1(PROLOG_STATE *state, */ return XML_ROLE_NONE; /* LCOV_EXCL_LINE */ case XML_TOK_DECL_OPEN: - if (!XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_DOCTYPE)) + if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end, + KW_DOCTYPE)) break; state->handler = doctype0; return XML_ROLE_DOCTYPE_NONE; @@ -222,12 +195,11 @@ prolog1(PROLOG_STATE *state, } static int PTRCALL -prolog2(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +prolog2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; @@ -243,12 +215,11 @@ prolog2(PROLOG_STATE *state, } static int PTRCALL -doctype0(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +doctype0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_DOCTYPE_NONE; @@ -261,12 +232,8 @@ doctype0(PROLOG_STATE *state, } static int PTRCALL -doctype1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ +doctype1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_DOCTYPE_NONE; @@ -291,12 +258,11 @@ doctype1(PROLOG_STATE *state, } static int PTRCALL -doctype2(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +doctype2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_DOCTYPE_NONE; @@ -308,12 +274,11 @@ doctype2(PROLOG_STATE *state, } static int PTRCALL -doctype3(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +doctype3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_DOCTYPE_NONE; @@ -325,12 +290,11 @@ doctype3(PROLOG_STATE *state, } static int PTRCALL -doctype4(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +doctype4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_DOCTYPE_NONE; @@ -345,12 +309,11 @@ doctype4(PROLOG_STATE *state, } static int PTRCALL -doctype5(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +doctype5(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_DOCTYPE_NONE; @@ -362,40 +325,28 @@ doctype5(PROLOG_STATE *state, } static int PTRCALL -internalSubset(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ +internalSubset(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_DECL_OPEN: - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, + if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end, KW_ENTITY)) { state->handler = entity0; return XML_ROLE_ENTITY_NONE; } - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, + if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end, KW_ATTLIST)) { state->handler = attlist0; return XML_ROLE_ATTLIST_NONE; } - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, + if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end, KW_ELEMENT)) { state->handler = element0; return XML_ROLE_ELEMENT_NONE; } - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, + if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end, KW_NOTATION)) { state->handler = notation0; return XML_ROLE_NOTATION_NONE; @@ -419,12 +370,8 @@ internalSubset(PROLOG_STATE *state, #ifdef XML_DTD static int PTRCALL -externalSubset0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ +externalSubset0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { state->handler = externalSubset1; if (tok == XML_TOK_XML_DECL) return XML_ROLE_TEXT_DECL; @@ -432,12 +379,8 @@ externalSubset0(PROLOG_STATE *state, } static int PTRCALL -externalSubset1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ +externalSubset1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { switch (tok) { case XML_TOK_COND_SECT_OPEN: state->handler = condSect0; @@ -464,12 +407,11 @@ externalSubset1(PROLOG_STATE *state, #endif /* XML_DTD */ static int PTRCALL -entity0(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +entity0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ENTITY_NONE; @@ -484,12 +426,11 @@ entity0(PROLOG_STATE *state, } static int PTRCALL -entity1(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +entity1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ENTITY_NONE; @@ -501,12 +442,8 @@ entity1(PROLOG_STATE *state, } static int PTRCALL -entity2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ +entity2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ENTITY_NONE; @@ -529,12 +466,11 @@ entity2(PROLOG_STATE *state, } static int PTRCALL -entity3(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +entity3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ENTITY_NONE; @@ -546,12 +482,11 @@ entity3(PROLOG_STATE *state, } static int PTRCALL -entity4(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +entity4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ENTITY_NONE; @@ -563,12 +498,8 @@ entity4(PROLOG_STATE *state, } static int PTRCALL -entity5(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ +entity5(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ENTITY_NONE; @@ -586,12 +517,11 @@ entity5(PROLOG_STATE *state, } static int PTRCALL -entity6(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +entity6(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ENTITY_NONE; @@ -604,12 +534,8 @@ entity6(PROLOG_STATE *state, } static int PTRCALL -entity7(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ +entity7(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ENTITY_NONE; @@ -632,12 +558,11 @@ entity7(PROLOG_STATE *state, } static int PTRCALL -entity8(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +entity8(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ENTITY_NONE; @@ -649,12 +574,11 @@ entity8(PROLOG_STATE *state, } static int PTRCALL -entity9(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +entity9(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ENTITY_NONE; @@ -666,12 +590,11 @@ entity9(PROLOG_STATE *state, } static int PTRCALL -entity10(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +entity10(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ENTITY_NONE; @@ -683,12 +606,11 @@ entity10(PROLOG_STATE *state, } static int PTRCALL -notation0(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +notation0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NOTATION_NONE; @@ -700,12 +622,8 @@ notation0(PROLOG_STATE *state, } static int PTRCALL -notation1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ +notation1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NOTATION_NONE; @@ -724,12 +642,11 @@ notation1(PROLOG_STATE *state, } static int PTRCALL -notation2(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +notation2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NOTATION_NONE; @@ -741,12 +658,11 @@ notation2(PROLOG_STATE *state, } static int PTRCALL -notation3(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +notation3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NOTATION_NONE; @@ -759,12 +675,11 @@ notation3(PROLOG_STATE *state, } static int PTRCALL -notation4(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +notation4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NOTATION_NONE; @@ -780,12 +695,11 @@ notation4(PROLOG_STATE *state, } static int PTRCALL -attlist0(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +attlist0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ATTLIST_NONE; @@ -798,12 +712,11 @@ attlist0(PROLOG_STATE *state, } static int PTRCALL -attlist1(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +attlist1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ATTLIST_NONE; @@ -819,34 +732,23 @@ attlist1(PROLOG_STATE *state, } static int PTRCALL -attlist2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ +attlist2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NAME: - { - static const char * const types[] = { - KW_CDATA, - KW_ID, - KW_IDREF, - KW_IDREFS, - KW_ENTITY, - KW_ENTITIES, - KW_NMTOKEN, - KW_NMTOKENS, - }; - int i; - for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++) - if (XmlNameMatchesAscii(enc, ptr, end, types[i])) { - state->handler = attlist8; - return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i; - } - } + case XML_TOK_NAME: { + static const char *const types[] = { + KW_CDATA, KW_ID, KW_IDREF, KW_IDREFS, + KW_ENTITY, KW_ENTITIES, KW_NMTOKEN, KW_NMTOKENS, + }; + int i; + for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i++) + if (XmlNameMatchesAscii(enc, ptr, end, types[i])) { + state->handler = attlist8; + return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i; + } + } if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) { state->handler = attlist5; return XML_ROLE_ATTLIST_NONE; @@ -860,12 +762,11 @@ attlist2(PROLOG_STATE *state, } static int PTRCALL -attlist3(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +attlist3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ATTLIST_NONE; @@ -879,12 +780,11 @@ attlist3(PROLOG_STATE *state, } static int PTRCALL -attlist4(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +attlist4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ATTLIST_NONE; @@ -899,12 +799,11 @@ attlist4(PROLOG_STATE *state, } static int PTRCALL -attlist5(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +attlist5(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ATTLIST_NONE; @@ -916,12 +815,11 @@ attlist5(PROLOG_STATE *state, } static int PTRCALL -attlist6(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +attlist6(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ATTLIST_NONE; @@ -933,12 +831,11 @@ attlist6(PROLOG_STATE *state, } static int PTRCALL -attlist7(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +attlist7(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ATTLIST_NONE; @@ -954,33 +851,23 @@ attlist7(PROLOG_STATE *state, /* default value */ static int PTRCALL -attlist8(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ +attlist8(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ATTLIST_NONE; case XML_TOK_POUND_NAME: - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, + if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end, KW_IMPLIED)) { state->handler = attlist1; return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE; } - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, + if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end, KW_REQUIRED)) { state->handler = attlist1; return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE; } - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, + if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end, KW_FIXED)) { state->handler = attlist9; return XML_ROLE_ATTLIST_NONE; @@ -994,12 +881,11 @@ attlist8(PROLOG_STATE *state, } static int PTRCALL -attlist9(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +attlist9(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ATTLIST_NONE; @@ -1011,12 +897,11 @@ attlist9(PROLOG_STATE *state, } static int PTRCALL -element0(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +element0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ELEMENT_NONE; @@ -1029,12 +914,8 @@ element0(PROLOG_STATE *state, } static int PTRCALL -element1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ +element1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ELEMENT_NONE; @@ -1059,19 +940,13 @@ element1(PROLOG_STATE *state, } static int PTRCALL -element2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ +element2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ELEMENT_NONE; case XML_TOK_POUND_NAME: - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, + if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end, KW_PCDATA)) { state->handler = element3; return XML_ROLE_CONTENT_PCDATA; @@ -1099,12 +974,11 @@ element2(PROLOG_STATE *state, } static int PTRCALL -element3(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +element3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ELEMENT_NONE; @@ -1124,12 +998,11 @@ element3(PROLOG_STATE *state, } static int PTRCALL -element4(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +element4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ELEMENT_NONE; @@ -1142,12 +1015,11 @@ element4(PROLOG_STATE *state, } static int PTRCALL -element5(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +element5(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ELEMENT_NONE; @@ -1163,12 +1035,11 @@ element5(PROLOG_STATE *state, } static int PTRCALL -element6(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +element6(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ELEMENT_NONE; @@ -1193,12 +1064,11 @@ element6(PROLOG_STATE *state, } static int PTRCALL -element7(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +element7(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_ELEMENT_NONE; @@ -1243,12 +1113,8 @@ element7(PROLOG_STATE *state, #ifdef XML_DTD static int PTRCALL -condSect0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ +condSect0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; @@ -1267,12 +1133,11 @@ condSect0(PROLOG_STATE *state, } static int PTRCALL -condSect1(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +condSect1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; @@ -1285,12 +1150,11 @@ condSect1(PROLOG_STATE *state, } static int PTRCALL -condSect2(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +condSect2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; @@ -1304,12 +1168,11 @@ condSect2(PROLOG_STATE *state, #endif /* XML_DTD */ static int PTRCALL -declClose(PROLOG_STATE *state, - int tok, - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +declClose(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); switch (tok) { case XML_TOK_PROLOG_S: return state->role_none; @@ -1341,21 +1204,21 @@ declClose(PROLOG_STATE *state, * LCOV_EXCL_START */ static int PTRCALL -error(PROLOG_STATE *UNUSED_P(state), - int UNUSED_P(tok), - const char *UNUSED_P(ptr), - const char *UNUSED_P(end), - const ENCODING *UNUSED_P(enc)) -{ +error(PROLOG_STATE *state, int tok, const char *ptr, const char *end, + const ENCODING *enc) { + UNUSED_P(state); + UNUSED_P(tok); + UNUSED_P(ptr); + UNUSED_P(end); + UNUSED_P(enc); return XML_ROLE_NONE; } /* LCOV_EXCL_STOP */ static int FASTCALL -common(PROLOG_STATE *state, int tok) -{ +common(PROLOG_STATE *state, int tok) { #ifdef XML_DTD - if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF) + if (! state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF) return XML_ROLE_INNER_PARAM_ENTITY_REF; #endif state->handler = error; @@ -1363,8 +1226,7 @@ common(PROLOG_STATE *state, int tok) } void -XmlPrologStateInit(PROLOG_STATE *state) -{ +XmlPrologStateInit(PROLOG_STATE *state) { state->handler = prolog0; #ifdef XML_DTD state->documentEntity = 1; @@ -1376,8 +1238,7 @@ XmlPrologStateInit(PROLOG_STATE *state) #ifdef XML_DTD void -XmlPrologStateInitExternalEntity(PROLOG_STATE *state) -{ +XmlPrologStateInitExternalEntity(PROLOG_STATE *state) { state->handler = externalSubset0; state->documentEntity = 0; state->includeLevel = 0; diff --git a/Modules/expat/xmlrole.h b/Modules/expat/xmlrole.h index e5f048eab55c6e..036aba64fd29c6 100644 --- a/Modules/expat/xmlrole.h +++ b/Modules/expat/xmlrole.h @@ -36,7 +36,7 @@ #ifdef __VMS /* 0 1 2 3 0 1 2 3 1234567890123456789012345678901 1234567890123456789012345678901 */ -#define XmlPrologStateInitExternalEntity XmlPrologStateInitExternalEnt +# define XmlPrologStateInitExternalEntity XmlPrologStateInitExternalEnt #endif #include "xmltok.h" @@ -113,11 +113,8 @@ enum { }; typedef struct prolog_state { - int (PTRCALL *handler) (struct prolog_state *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc); + int(PTRCALL *handler)(struct prolog_state *state, int tok, const char *ptr, + const char *end, const ENCODING *enc); unsigned level; int role_none; #ifdef XML_DTD @@ -132,8 +129,8 @@ void XmlPrologStateInit(PROLOG_STATE *); void XmlPrologStateInitExternalEntity(PROLOG_STATE *); #endif /* XML_DTD */ -#define XmlTokenRole(state, tok, ptr, end, enc) \ - (((state)->handler)(state, tok, ptr, end, enc)) +#define XmlTokenRole(state, tok, ptr, end, enc) \ + (((state)->handler)(state, tok, ptr, end, enc)) #ifdef __cplusplus } diff --git a/Modules/expat/xmltok.c b/Modules/expat/xmltok.c index 6b415d83972ca6..11e9d1ccdad423 100644 --- a/Modules/expat/xmltok.c +++ b/Modules/expat/xmltok.c @@ -31,24 +31,23 @@ */ #include -#include /* memcpy */ +#include /* memcpy */ #if defined(_MSC_VER) && (_MSC_VER <= 1700) - /* for vs2012/11.0/1700 and earlier Visual Studio compilers */ -# define bool int -# define false 0 -# define true 1 +/* for vs2012/11.0/1700 and earlier Visual Studio compilers */ +# define bool int +# define false 0 +# define true 1 #else -# include +# include #endif - #ifdef _WIN32 -#include "winconfig.h" +# include "winconfig.h" #else -#ifdef HAVE_EXPAT_CONFIG_H -#include -#endif +# ifdef HAVE_EXPAT_CONFIG_H +# include +# endif #endif /* ndef _WIN32 */ #include "expat_external.h" @@ -57,58 +56,49 @@ #include "nametab.h" #ifdef XML_DTD -#define IGNORE_SECTION_TOK_VTABLE , PREFIX(ignoreSectionTok) +# define IGNORE_SECTION_TOK_VTABLE , PREFIX(ignoreSectionTok) #else -#define IGNORE_SECTION_TOK_VTABLE /* as nothing */ +# define IGNORE_SECTION_TOK_VTABLE /* as nothing */ #endif -#define VTABLE1 \ - { PREFIX(prologTok), PREFIX(contentTok), \ - PREFIX(cdataSectionTok) IGNORE_SECTION_TOK_VTABLE }, \ - { PREFIX(attributeValueTok), PREFIX(entityValueTok) }, \ - PREFIX(nameMatchesAscii), \ - PREFIX(nameLength), \ - PREFIX(skipS), \ - PREFIX(getAtts), \ - PREFIX(charRefNumber), \ - PREFIX(predefinedEntityName), \ - PREFIX(updatePosition), \ - PREFIX(isPublicId) +#define VTABLE1 \ + {PREFIX(prologTok), PREFIX(contentTok), \ + PREFIX(cdataSectionTok) IGNORE_SECTION_TOK_VTABLE}, \ + {PREFIX(attributeValueTok), PREFIX(entityValueTok)}, \ + PREFIX(nameMatchesAscii), PREFIX(nameLength), PREFIX(skipS), \ + PREFIX(getAtts), PREFIX(charRefNumber), PREFIX(predefinedEntityName), \ + PREFIX(updatePosition), PREFIX(isPublicId) #define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16) -#define UCS2_GET_NAMING(pages, hi, lo) \ - (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1u << ((lo) & 0x1F))) +#define UCS2_GET_NAMING(pages, hi, lo) \ + (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1u << ((lo)&0x1F))) /* A 2 byte UTF-8 representation splits the characters 11 bits between the bottom 5 and 6 bits of the bytes. We need 8 bits to index into pages, 3 bits to add to that index and 5 bits to generate the mask. */ -#define UTF8_GET_NAMING2(pages, byte) \ - (namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \ - + ((((byte)[0]) & 3) << 1) \ - + ((((byte)[1]) >> 5) & 1)] \ - & (1u << (((byte)[1]) & 0x1F))) +#define UTF8_GET_NAMING2(pages, byte) \ + (namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \ + + ((((byte)[0]) & 3) << 1) + ((((byte)[1]) >> 5) & 1)] \ + & (1u << (((byte)[1]) & 0x1F))) /* A 3 byte UTF-8 representation splits the characters 16 bits between the bottom 4, 6 and 6 bits of the bytes. We need 8 bits to index into pages, 3 bits to add to that index and 5 bits to generate the mask. */ -#define UTF8_GET_NAMING3(pages, byte) \ - (namingBitmap[((pages)[((((byte)[0]) & 0xF) << 4) \ - + ((((byte)[1]) >> 2) & 0xF)] \ - << 3) \ - + ((((byte)[1]) & 3) << 1) \ - + ((((byte)[2]) >> 5) & 1)] \ - & (1u << (((byte)[2]) & 0x1F))) - -#define UTF8_GET_NAMING(pages, p, n) \ - ((n) == 2 \ - ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \ - : ((n) == 3 \ - ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) \ - : 0)) +#define UTF8_GET_NAMING3(pages, byte) \ + (namingBitmap \ + [((pages)[((((byte)[0]) & 0xF) << 4) + ((((byte)[1]) >> 2) & 0xF)] \ + << 3) \ + + ((((byte)[1]) & 3) << 1) + ((((byte)[2]) >> 5) & 1)] \ + & (1u << (((byte)[2]) & 0x1F))) + +#define UTF8_GET_NAMING(pages, p, n) \ + ((n) == 2 \ + ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \ + : ((n) == 3 ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) : 0)) /* Detection of invalid UTF-8 sequences is based on Table 3.1B of Unicode 3.2: http://www.unicode.org/unicode/reports/tr28/ @@ -120,88 +110,76 @@ (A & 0xC0) == 0xC0 means A > 0xBF */ -#define UTF8_INVALID2(p) \ +#define UTF8_INVALID2(p) \ ((*p) < 0xC2 || ((p)[1] & 0x80) == 0 || ((p)[1] & 0xC0) == 0xC0) -#define UTF8_INVALID3(p) \ - (((p)[2] & 0x80) == 0 \ - || \ - ((*p) == 0xEF && (p)[1] == 0xBF \ - ? \ - (p)[2] > 0xBD \ - : \ - ((p)[2] & 0xC0) == 0xC0) \ - || \ - ((*p) == 0xE0 \ - ? \ - (p)[1] < 0xA0 || ((p)[1] & 0xC0) == 0xC0 \ - : \ - ((p)[1] & 0x80) == 0 \ - || \ - ((*p) == 0xED ? (p)[1] > 0x9F : ((p)[1] & 0xC0) == 0xC0))) - -#define UTF8_INVALID4(p) \ - (((p)[3] & 0x80) == 0 || ((p)[3] & 0xC0) == 0xC0 \ - || \ - ((p)[2] & 0x80) == 0 || ((p)[2] & 0xC0) == 0xC0 \ - || \ - ((*p) == 0xF0 \ - ? \ - (p)[1] < 0x90 || ((p)[1] & 0xC0) == 0xC0 \ - : \ - ((p)[1] & 0x80) == 0 \ - || \ - ((*p) == 0xF4 ? (p)[1] > 0x8F : ((p)[1] & 0xC0) == 0xC0))) +#define UTF8_INVALID3(p) \ + (((p)[2] & 0x80) == 0 \ + || ((*p) == 0xEF && (p)[1] == 0xBF ? (p)[2] > 0xBD \ + : ((p)[2] & 0xC0) == 0xC0) \ + || ((*p) == 0xE0 \ + ? (p)[1] < 0xA0 || ((p)[1] & 0xC0) == 0xC0 \ + : ((p)[1] & 0x80) == 0 \ + || ((*p) == 0xED ? (p)[1] > 0x9F : ((p)[1] & 0xC0) == 0xC0))) + +#define UTF8_INVALID4(p) \ + (((p)[3] & 0x80) == 0 || ((p)[3] & 0xC0) == 0xC0 || ((p)[2] & 0x80) == 0 \ + || ((p)[2] & 0xC0) == 0xC0 \ + || ((*p) == 0xF0 \ + ? (p)[1] < 0x90 || ((p)[1] & 0xC0) == 0xC0 \ + : ((p)[1] & 0x80) == 0 \ + || ((*p) == 0xF4 ? (p)[1] > 0x8F : ((p)[1] & 0xC0) == 0xC0))) static int PTRFASTCALL -isNever(const ENCODING *UNUSED_P(enc), const char *UNUSED_P(p)) -{ +isNever(const ENCODING *enc, const char *p) { + UNUSED_P(enc); + UNUSED_P(p); return 0; } static int PTRFASTCALL -utf8_isName2(const ENCODING *UNUSED_P(enc), const char *p) -{ +utf8_isName2(const ENCODING *enc, const char *p) { + UNUSED_P(enc); return UTF8_GET_NAMING2(namePages, (const unsigned char *)p); } static int PTRFASTCALL -utf8_isName3(const ENCODING *UNUSED_P(enc), const char *p) -{ +utf8_isName3(const ENCODING *enc, const char *p) { + UNUSED_P(enc); return UTF8_GET_NAMING3(namePages, (const unsigned char *)p); } #define utf8_isName4 isNever static int PTRFASTCALL -utf8_isNmstrt2(const ENCODING *UNUSED_P(enc), const char *p) -{ +utf8_isNmstrt2(const ENCODING *enc, const char *p) { + UNUSED_P(enc); return UTF8_GET_NAMING2(nmstrtPages, (const unsigned char *)p); } static int PTRFASTCALL -utf8_isNmstrt3(const ENCODING *UNUSED_P(enc), const char *p) -{ +utf8_isNmstrt3(const ENCODING *enc, const char *p) { + UNUSED_P(enc); return UTF8_GET_NAMING3(nmstrtPages, (const unsigned char *)p); } #define utf8_isNmstrt4 isNever static int PTRFASTCALL -utf8_isInvalid2(const ENCODING *UNUSED_P(enc), const char *p) -{ +utf8_isInvalid2(const ENCODING *enc, const char *p) { + UNUSED_P(enc); return UTF8_INVALID2((const unsigned char *)p); } static int PTRFASTCALL -utf8_isInvalid3(const ENCODING *UNUSED_P(enc), const char *p) -{ +utf8_isInvalid3(const ENCODING *enc, const char *p) { + UNUSED_P(enc); return UTF8_INVALID3((const unsigned char *)p); } static int PTRFASTCALL -utf8_isInvalid4(const ENCODING *UNUSED_P(enc), const char *p) -{ +utf8_isInvalid4(const ENCODING *enc, const char *p) { + UNUSED_P(enc); return UTF8_INVALID4((const unsigned char *)p); } @@ -209,61 +187,44 @@ struct normal_encoding { ENCODING enc; unsigned char type[256]; #ifdef XML_MIN_SIZE - int (PTRFASTCALL *byteType)(const ENCODING *, const char *); - int (PTRFASTCALL *isNameMin)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrtMin)(const ENCODING *, const char *); - int (PTRFASTCALL *byteToAscii)(const ENCODING *, const char *); - int (PTRCALL *charMatches)(const ENCODING *, const char *, int); + int(PTRFASTCALL *byteType)(const ENCODING *, const char *); + int(PTRFASTCALL *isNameMin)(const ENCODING *, const char *); + int(PTRFASTCALL *isNmstrtMin)(const ENCODING *, const char *); + int(PTRFASTCALL *byteToAscii)(const ENCODING *, const char *); + int(PTRCALL *charMatches)(const ENCODING *, const char *, int); #endif /* XML_MIN_SIZE */ - int (PTRFASTCALL *isName2)(const ENCODING *, const char *); - int (PTRFASTCALL *isName3)(const ENCODING *, const char *); - int (PTRFASTCALL *isName4)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrt2)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrt3)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrt4)(const ENCODING *, const char *); - int (PTRFASTCALL *isInvalid2)(const ENCODING *, const char *); - int (PTRFASTCALL *isInvalid3)(const ENCODING *, const char *); - int (PTRFASTCALL *isInvalid4)(const ENCODING *, const char *); + int(PTRFASTCALL *isName2)(const ENCODING *, const char *); + int(PTRFASTCALL *isName3)(const ENCODING *, const char *); + int(PTRFASTCALL *isName4)(const ENCODING *, const char *); + int(PTRFASTCALL *isNmstrt2)(const ENCODING *, const char *); + int(PTRFASTCALL *isNmstrt3)(const ENCODING *, const char *); + int(PTRFASTCALL *isNmstrt4)(const ENCODING *, const char *); + int(PTRFASTCALL *isInvalid2)(const ENCODING *, const char *); + int(PTRFASTCALL *isInvalid3)(const ENCODING *, const char *); + int(PTRFASTCALL *isInvalid4)(const ENCODING *, const char *); }; -#define AS_NORMAL_ENCODING(enc) ((const struct normal_encoding *) (enc)) +#define AS_NORMAL_ENCODING(enc) ((const struct normal_encoding *)(enc)) #ifdef XML_MIN_SIZE -#define STANDARD_VTABLE(E) \ - E ## byteType, \ - E ## isNameMin, \ - E ## isNmstrtMin, \ - E ## byteToAscii, \ - E ## charMatches, +# define STANDARD_VTABLE(E) \ + E##byteType, E##isNameMin, E##isNmstrtMin, E##byteToAscii, E##charMatches, #else -#define STANDARD_VTABLE(E) /* as nothing */ +# define STANDARD_VTABLE(E) /* as nothing */ #endif -#define NORMAL_VTABLE(E) \ - E ## isName2, \ - E ## isName3, \ - E ## isName4, \ - E ## isNmstrt2, \ - E ## isNmstrt3, \ - E ## isNmstrt4, \ - E ## isInvalid2, \ - E ## isInvalid3, \ - E ## isInvalid4 - -#define NULL_VTABLE \ - /* isName2 */ NULL, \ - /* isName3 */ NULL, \ - /* isName4 */ NULL, \ - /* isNmstrt2 */ NULL, \ - /* isNmstrt3 */ NULL, \ - /* isNmstrt4 */ NULL, \ - /* isInvalid2 */ NULL, \ - /* isInvalid3 */ NULL, \ - /* isInvalid4 */ NULL +#define NORMAL_VTABLE(E) \ + E##isName2, E##isName3, E##isName4, E##isNmstrt2, E##isNmstrt3, \ + E##isNmstrt4, E##isInvalid2, E##isInvalid3, E##isInvalid4 + +#define NULL_VTABLE \ + /* isName2 */ NULL, /* isName3 */ NULL, /* isName4 */ NULL, \ + /* isNmstrt2 */ NULL, /* isNmstrt3 */ NULL, /* isNmstrt4 */ NULL, \ + /* isInvalid2 */ NULL, /* isInvalid3 */ NULL, /* isInvalid4 */ NULL static int FASTCALL checkCharRefNumber(int); @@ -271,75 +232,70 @@ static int FASTCALL checkCharRefNumber(int); #include "ascii.h" #ifdef XML_MIN_SIZE -#define sb_isNameMin isNever -#define sb_isNmstrtMin isNever +# define sb_isNameMin isNever +# define sb_isNmstrtMin isNever #endif #ifdef XML_MIN_SIZE -#define MINBPC(enc) ((enc)->minBytesPerChar) +# define MINBPC(enc) ((enc)->minBytesPerChar) #else /* minimum bytes per character */ -#define MINBPC(enc) 1 +# define MINBPC(enc) 1 #endif -#define SB_BYTE_TYPE(enc, p) \ +#define SB_BYTE_TYPE(enc, p) \ (((struct normal_encoding *)(enc))->type[(unsigned char)*(p)]) #ifdef XML_MIN_SIZE static int PTRFASTCALL -sb_byteType(const ENCODING *enc, const char *p) -{ +sb_byteType(const ENCODING *enc, const char *p) { return SB_BYTE_TYPE(enc, p); } -#define BYTE_TYPE(enc, p) \ - (AS_NORMAL_ENCODING(enc)->byteType(enc, p)) +# define BYTE_TYPE(enc, p) (AS_NORMAL_ENCODING(enc)->byteType(enc, p)) #else -#define BYTE_TYPE(enc, p) SB_BYTE_TYPE(enc, p) +# define BYTE_TYPE(enc, p) SB_BYTE_TYPE(enc, p) #endif #ifdef XML_MIN_SIZE -#define BYTE_TO_ASCII(enc, p) \ - (AS_NORMAL_ENCODING(enc)->byteToAscii(enc, p)) +# define BYTE_TO_ASCII(enc, p) (AS_NORMAL_ENCODING(enc)->byteToAscii(enc, p)) static int PTRFASTCALL -sb_byteToAscii(const ENCODING *enc, const char *p) -{ +sb_byteToAscii(const ENCODING *enc, const char *p) { + UNUSED_P(enc); return *p; } #else -#define BYTE_TO_ASCII(enc, p) (*(p)) +# define BYTE_TO_ASCII(enc, p) (*(p)) #endif -#define IS_NAME_CHAR(enc, p, n) \ - (AS_NORMAL_ENCODING(enc)->isName ## n(enc, p)) -#define IS_NMSTRT_CHAR(enc, p, n) \ - (AS_NORMAL_ENCODING(enc)->isNmstrt ## n(enc, p)) -#define IS_INVALID_CHAR(enc, p, n) \ - (AS_NORMAL_ENCODING(enc)->isInvalid ## n(enc, p)) +#define IS_NAME_CHAR(enc, p, n) (AS_NORMAL_ENCODING(enc)->isName##n(enc, p)) +#define IS_NMSTRT_CHAR(enc, p, n) (AS_NORMAL_ENCODING(enc)->isNmstrt##n(enc, p)) +#define IS_INVALID_CHAR(enc, p, n) \ + (AS_NORMAL_ENCODING(enc)->isInvalid##n(enc, p)) #ifdef XML_MIN_SIZE -#define IS_NAME_CHAR_MINBPC(enc, p) \ - (AS_NORMAL_ENCODING(enc)->isNameMin(enc, p)) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) \ - (AS_NORMAL_ENCODING(enc)->isNmstrtMin(enc, p)) +# define IS_NAME_CHAR_MINBPC(enc, p) \ + (AS_NORMAL_ENCODING(enc)->isNameMin(enc, p)) +# define IS_NMSTRT_CHAR_MINBPC(enc, p) \ + (AS_NORMAL_ENCODING(enc)->isNmstrtMin(enc, p)) #else -#define IS_NAME_CHAR_MINBPC(enc, p) (0) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) (0) +# define IS_NAME_CHAR_MINBPC(enc, p) (0) +# define IS_NMSTRT_CHAR_MINBPC(enc, p) (0) #endif #ifdef XML_MIN_SIZE -#define CHAR_MATCHES(enc, p, c) \ - (AS_NORMAL_ENCODING(enc)->charMatches(enc, p, c)) +# define CHAR_MATCHES(enc, p, c) \ + (AS_NORMAL_ENCODING(enc)->charMatches(enc, p, c)) static int PTRCALL -sb_charMatches(const ENCODING *enc, const char *p, int c) -{ +sb_charMatches(const ENCODING *enc, const char *p, int c) { + UNUSED_P(enc); return *p == c; } #else /* c is an ASCII character */ -#define CHAR_MATCHES(enc, p, c) (*(p) == c) +# define CHAR_MATCHES(enc, p, c) (*(p) == c) #endif -#define PREFIX(ident) normal_ ## ident +#define PREFIX(ident) normal_##ident #define XML_TOK_IMPL_C #include "xmltok_impl.c" #undef XML_TOK_IMPL_C @@ -354,42 +310,46 @@ sb_charMatches(const ENCODING *enc, const char *p, int c) #undef IS_NMSTRT_CHAR_MINBPC #undef IS_INVALID_CHAR -enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */ - UTF8_cval1 = 0x00, - UTF8_cval2 = 0xc0, - UTF8_cval3 = 0xe0, - UTF8_cval4 = 0xf0 +enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */ + UTF8_cval1 = 0x00, + UTF8_cval2 = 0xc0, + UTF8_cval3 = 0xe0, + UTF8_cval4 = 0xf0 }; void -_INTERNAL_trim_to_complete_utf8_characters(const char * from, const char ** fromLimRef) -{ - const char * fromLim = *fromLimRef; +_INTERNAL_trim_to_complete_utf8_characters(const char *from, + const char **fromLimRef) { + const char *fromLim = *fromLimRef; size_t walked = 0; for (; fromLim > from; fromLim--, walked++) { const unsigned char prev = (unsigned char)fromLim[-1]; - if ((prev & 0xf8u) == 0xf0u) { /* 4-byte character, lead by 0b11110xxx byte */ + if ((prev & 0xf8u) + == 0xf0u) { /* 4-byte character, lead by 0b11110xxx byte */ if (walked + 1 >= 4) { fromLim += 4 - 1; break; } else { walked = 0; } - } else if ((prev & 0xf0u) == 0xe0u) { /* 3-byte character, lead by 0b1110xxxx byte */ + } else if ((prev & 0xf0u) + == 0xe0u) { /* 3-byte character, lead by 0b1110xxxx byte */ if (walked + 1 >= 3) { fromLim += 3 - 1; break; } else { walked = 0; } - } else if ((prev & 0xe0u) == 0xc0u) { /* 2-byte character, lead by 0b110xxxxx byte */ + } else if ((prev & 0xe0u) + == 0xc0u) { /* 2-byte character, lead by 0b110xxxxx byte */ if (walked + 1 >= 2) { fromLim += 2 - 1; break; } else { walked = 0; } - } else if ((prev & 0x80u) == 0x00u) { /* 1-byte character, matching 0b0xxxxxxx */ + } else if ((prev & 0x80u) + == 0x00u) { /* 1-byte character, matching 0b0xxxxxxx */ break; } } @@ -397,16 +357,15 @@ _INTERNAL_trim_to_complete_utf8_characters(const char * from, const char ** from } static enum XML_Convert_Result PTRCALL -utf8_toUtf8(const ENCODING *UNUSED_P(enc), - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ +utf8_toUtf8(const ENCODING *enc, const char **fromP, const char *fromLim, + char **toP, const char *toLim) { bool input_incomplete = false; bool output_exhausted = false; /* Avoid copying partial characters (due to limited space). */ const ptrdiff_t bytesAvailable = fromLim - *fromP; const ptrdiff_t bytesStorable = toLim - *toP; + UNUSED_P(enc); if (bytesAvailable > bytesStorable) { fromLim = *fromP + bytesStorable; output_exhausted = true; @@ -414,7 +373,7 @@ utf8_toUtf8(const ENCODING *UNUSED_P(enc), /* Avoid copying partial characters (from incomplete input). */ { - const char * const fromLimBefore = fromLim; + const char *const fromLimBefore = fromLim; _INTERNAL_trim_to_complete_utf8_characters(*fromP, &fromLim); if (fromLim < fromLimBefore) { input_incomplete = true; @@ -428,7 +387,7 @@ utf8_toUtf8(const ENCODING *UNUSED_P(enc), *toP += bytesToCopy; } - if (output_exhausted) /* needs to go first */ + if (output_exhausted) /* needs to go first */ return XML_CONVERT_OUTPUT_EXHAUSTED; else if (input_incomplete) return XML_CONVERT_INPUT_INCOMPLETE; @@ -437,10 +396,8 @@ utf8_toUtf8(const ENCODING *UNUSED_P(enc), } static enum XML_Convert_Result PTRCALL -utf8_toUtf16(const ENCODING *enc, - const char **fromP, const char *fromLim, - unsigned short **toP, const unsigned short *toLim) -{ +utf8_toUtf16(const ENCODING *enc, const char **fromP, const char *fromLim, + unsigned short **toP, const unsigned short *toLim) { enum XML_Convert_Result res = XML_CONVERT_COMPLETED; unsigned short *to = *toP; const char *from = *fromP; @@ -459,30 +416,28 @@ utf8_toUtf16(const ENCODING *enc, res = XML_CONVERT_INPUT_INCOMPLETE; goto after; } - *to++ = (unsigned short)(((from[0] & 0xf) << 12) - | ((from[1] & 0x3f) << 6) | (from[2] & 0x3f)); + *to++ = (unsigned short)(((from[0] & 0xf) << 12) | ((from[1] & 0x3f) << 6) + | (from[2] & 0x3f)); from += 3; break; - case BT_LEAD4: - { - unsigned long n; - if (toLim - to < 2) { - res = XML_CONVERT_OUTPUT_EXHAUSTED; - goto after; - } - if (fromLim - from < 4) { - res = XML_CONVERT_INPUT_INCOMPLETE; - goto after; - } - n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12) - | ((from[2] & 0x3f) << 6) | (from[3] & 0x3f); - n -= 0x10000; - to[0] = (unsigned short)((n >> 10) | 0xD800); - to[1] = (unsigned short)((n & 0x3FF) | 0xDC00); - to += 2; - from += 4; + case BT_LEAD4: { + unsigned long n; + if (toLim - to < 2) { + res = XML_CONVERT_OUTPUT_EXHAUSTED; + goto after; } - break; + if (fromLim - from < 4) { + res = XML_CONVERT_INPUT_INCOMPLETE; + goto after; + } + n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12) + | ((from[2] & 0x3f) << 6) | (from[3] & 0x3f); + n -= 0x10000; + to[0] = (unsigned short)((n >> 10) | 0xD800); + to[1] = (unsigned short)((n & 0x3FF) | 0xDC00); + to += 2; + from += 4; + } break; default: *to++ = *from++; break; @@ -497,56 +452,51 @@ utf8_toUtf16(const ENCODING *enc, } #ifdef XML_NS -static const struct normal_encoding utf8_encoding_ns = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { -#include "asciitab.h" -#include "utf8tab.h" - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; +static const struct normal_encoding utf8_encoding_ns + = {{VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0}, + { +# include "asciitab.h" +# include "utf8tab.h" + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_)}; #endif -static const struct normal_encoding utf8_encoding = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { +static const struct normal_encoding utf8_encoding + = {{VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0}, + { #define BT_COLON BT_NMSTRT #include "asciitab.h" #undef BT_COLON #include "utf8tab.h" - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_)}; #ifdef XML_NS -static const struct normal_encoding internal_utf8_encoding_ns = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { -#include "iasciitab.h" -#include "utf8tab.h" - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; +static const struct normal_encoding internal_utf8_encoding_ns + = {{VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0}, + { +# include "iasciitab.h" +# include "utf8tab.h" + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_)}; #endif -static const struct normal_encoding internal_utf8_encoding = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { +static const struct normal_encoding internal_utf8_encoding + = {{VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0}, + { #define BT_COLON BT_NMSTRT #include "iasciitab.h" #undef BT_COLON #include "utf8tab.h" - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_)}; static enum XML_Convert_Result PTRCALL -latin1_toUtf8(const ENCODING *UNUSED_P(enc), - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ +latin1_toUtf8(const ENCODING *enc, const char **fromP, const char *fromLim, + char **toP, const char *toLim) { + UNUSED_P(enc); for (;;) { unsigned char c; if (*fromP == fromLim) @@ -558,8 +508,7 @@ latin1_toUtf8(const ENCODING *UNUSED_P(enc), *(*toP)++ = (char)((c >> 6) | UTF8_cval2); *(*toP)++ = (char)((c & 0x3f) | 0x80); (*fromP)++; - } - else { + } else { if (*toP == toLim) return XML_CONVERT_OUTPUT_EXHAUSTED; *(*toP)++ = *(*fromP)++; @@ -568,10 +517,9 @@ latin1_toUtf8(const ENCODING *UNUSED_P(enc), } static enum XML_Convert_Result PTRCALL -latin1_toUtf16(const ENCODING *UNUSED_P(enc), - const char **fromP, const char *fromLim, - unsigned short **toP, const unsigned short *toLim) -{ +latin1_toUtf16(const ENCODING *enc, const char **fromP, const char *fromLim, + unsigned short **toP, const unsigned short *toLim) { + UNUSED_P(enc); while (*fromP < fromLim && *toP < toLim) *(*toP)++ = (unsigned char)*(*fromP)++; @@ -583,33 +531,30 @@ latin1_toUtf16(const ENCODING *UNUSED_P(enc), #ifdef XML_NS -static const struct normal_encoding latin1_encoding_ns = { - { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, - { -#include "asciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(sb_) NULL_VTABLE -}; +static const struct normal_encoding latin1_encoding_ns + = {{VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0}, + { +# include "asciitab.h" +# include "latin1tab.h" + }, + STANDARD_VTABLE(sb_) NULL_VTABLE}; #endif -static const struct normal_encoding latin1_encoding = { - { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, - { +static const struct normal_encoding latin1_encoding + = {{VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0}, + { #define BT_COLON BT_NMSTRT #include "asciitab.h" #undef BT_COLON #include "latin1tab.h" - }, - STANDARD_VTABLE(sb_) NULL_VTABLE -}; + }, + STANDARD_VTABLE(sb_) NULL_VTABLE}; static enum XML_Convert_Result PTRCALL -ascii_toUtf8(const ENCODING *UNUSED_P(enc), - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ +ascii_toUtf8(const ENCODING *enc, const char **fromP, const char *fromLim, + char **toP, const char *toLim) { + UNUSED_P(enc); while (*fromP < fromLim && *toP < toLim) *(*toP)++ = *(*fromP)++; @@ -621,40 +566,45 @@ ascii_toUtf8(const ENCODING *UNUSED_P(enc), #ifdef XML_NS -static const struct normal_encoding ascii_encoding_ns = { - { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, - { -#include "asciitab.h" -/* BT_NONXML == 0 */ - }, - STANDARD_VTABLE(sb_) NULL_VTABLE -}; +static const struct normal_encoding ascii_encoding_ns + = {{VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0}, + { +# include "asciitab.h" + /* BT_NONXML == 0 */ + }, + STANDARD_VTABLE(sb_) NULL_VTABLE}; #endif -static const struct normal_encoding ascii_encoding = { - { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, - { +static const struct normal_encoding ascii_encoding + = {{VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0}, + { #define BT_COLON BT_NMSTRT #include "asciitab.h" #undef BT_COLON -/* BT_NONXML == 0 */ - }, - STANDARD_VTABLE(sb_) NULL_VTABLE -}; + /* BT_NONXML == 0 */ + }, + STANDARD_VTABLE(sb_) NULL_VTABLE}; static int PTRFASTCALL -unicode_byte_type(char hi, char lo) -{ +unicode_byte_type(char hi, char lo) { switch ((unsigned char)hi) { - case 0xD8: case 0xD9: case 0xDA: case 0xDB: + /* 0xD800–0xDBFF first 16-bit code unit or high surrogate (W1) */ + case 0xD8: + case 0xD9: + case 0xDA: + case 0xDB: return BT_LEAD4; - case 0xDC: case 0xDD: case 0xDE: case 0xDF: + /* 0xDC00–0xDFFF second 16-bit code unit or low surrogate (W2) */ + case 0xDC: + case 0xDD: + case 0xDE: + case 0xDF: return BT_TRAIL; case 0xFF: switch ((unsigned char)lo) { - case 0xFF: - case 0xFE: + case 0xFF: /* noncharacter-FFFF */ + case 0xFE: /* noncharacter-FFFE */ return BT_NONXML; } break; @@ -662,102 +612,105 @@ unicode_byte_type(char hi, char lo) return BT_NONASCII; } -#define DEFINE_UTF16_TO_UTF8(E) \ -static enum XML_Convert_Result PTRCALL \ -E ## toUtf8(const ENCODING *UNUSED_P(enc), \ - const char **fromP, const char *fromLim, \ - char **toP, const char *toLim) \ -{ \ - const char *from = *fromP; \ - fromLim = from + (((fromLim - from) >> 1) << 1); /* shrink to even */ \ - for (; from < fromLim; from += 2) { \ - int plane; \ - unsigned char lo2; \ - unsigned char lo = GET_LO(from); \ - unsigned char hi = GET_HI(from); \ - switch (hi) { \ - case 0: \ - if (lo < 0x80) { \ - if (*toP == toLim) { \ - *fromP = from; \ - return XML_CONVERT_OUTPUT_EXHAUSTED; \ - } \ - *(*toP)++ = lo; \ - break; \ - } \ - /* fall through */ \ - case 0x1: case 0x2: case 0x3: \ - case 0x4: case 0x5: case 0x6: case 0x7: \ - if (toLim - *toP < 2) { \ - *fromP = from; \ - return XML_CONVERT_OUTPUT_EXHAUSTED; \ - } \ - *(*toP)++ = ((lo >> 6) | (hi << 2) | UTF8_cval2); \ - *(*toP)++ = ((lo & 0x3f) | 0x80); \ - break; \ - default: \ - if (toLim - *toP < 3) { \ - *fromP = from; \ - return XML_CONVERT_OUTPUT_EXHAUSTED; \ - } \ - /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \ - *(*toP)++ = ((hi >> 4) | UTF8_cval3); \ - *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \ - *(*toP)++ = ((lo & 0x3f) | 0x80); \ - break; \ - case 0xD8: case 0xD9: case 0xDA: case 0xDB: \ - if (toLim - *toP < 4) { \ - *fromP = from; \ - return XML_CONVERT_OUTPUT_EXHAUSTED; \ - } \ - if (fromLim - from < 4) { \ - *fromP = from; \ - return XML_CONVERT_INPUT_INCOMPLETE; \ - } \ - plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \ - *(*toP)++ = ((plane >> 2) | UTF8_cval4); \ - *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \ - from += 2; \ - lo2 = GET_LO(from); \ - *(*toP)++ = (((lo & 0x3) << 4) \ - | ((GET_HI(from) & 0x3) << 2) \ - | (lo2 >> 6) \ - | 0x80); \ - *(*toP)++ = ((lo2 & 0x3f) | 0x80); \ - break; \ - } \ - } \ - *fromP = from; \ - if (from < fromLim) \ - return XML_CONVERT_INPUT_INCOMPLETE; \ - else \ - return XML_CONVERT_COMPLETED; \ -} +#define DEFINE_UTF16_TO_UTF8(E) \ + static enum XML_Convert_Result PTRCALL E##toUtf8( \ + const ENCODING *enc, const char **fromP, const char *fromLim, \ + char **toP, const char *toLim) { \ + const char *from = *fromP; \ + UNUSED_P(enc); \ + fromLim = from + (((fromLim - from) >> 1) << 1); /* shrink to even */ \ + for (; from < fromLim; from += 2) { \ + int plane; \ + unsigned char lo2; \ + unsigned char lo = GET_LO(from); \ + unsigned char hi = GET_HI(from); \ + switch (hi) { \ + case 0: \ + if (lo < 0x80) { \ + if (*toP == toLim) { \ + *fromP = from; \ + return XML_CONVERT_OUTPUT_EXHAUSTED; \ + } \ + *(*toP)++ = lo; \ + break; \ + } \ + /* fall through */ \ + case 0x1: \ + case 0x2: \ + case 0x3: \ + case 0x4: \ + case 0x5: \ + case 0x6: \ + case 0x7: \ + if (toLim - *toP < 2) { \ + *fromP = from; \ + return XML_CONVERT_OUTPUT_EXHAUSTED; \ + } \ + *(*toP)++ = ((lo >> 6) | (hi << 2) | UTF8_cval2); \ + *(*toP)++ = ((lo & 0x3f) | 0x80); \ + break; \ + default: \ + if (toLim - *toP < 3) { \ + *fromP = from; \ + return XML_CONVERT_OUTPUT_EXHAUSTED; \ + } \ + /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \ + *(*toP)++ = ((hi >> 4) | UTF8_cval3); \ + *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \ + *(*toP)++ = ((lo & 0x3f) | 0x80); \ + break; \ + case 0xD8: \ + case 0xD9: \ + case 0xDA: \ + case 0xDB: \ + if (toLim - *toP < 4) { \ + *fromP = from; \ + return XML_CONVERT_OUTPUT_EXHAUSTED; \ + } \ + if (fromLim - from < 4) { \ + *fromP = from; \ + return XML_CONVERT_INPUT_INCOMPLETE; \ + } \ + plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \ + *(*toP)++ = (char)((plane >> 2) | UTF8_cval4); \ + *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \ + from += 2; \ + lo2 = GET_LO(from); \ + *(*toP)++ = (((lo & 0x3) << 4) | ((GET_HI(from) & 0x3) << 2) \ + | (lo2 >> 6) | 0x80); \ + *(*toP)++ = ((lo2 & 0x3f) | 0x80); \ + break; \ + } \ + } \ + *fromP = from; \ + if (from < fromLim) \ + return XML_CONVERT_INPUT_INCOMPLETE; \ + else \ + return XML_CONVERT_COMPLETED; \ + } -#define DEFINE_UTF16_TO_UTF16(E) \ -static enum XML_Convert_Result PTRCALL \ -E ## toUtf16(const ENCODING *UNUSED_P(enc), \ - const char **fromP, const char *fromLim, \ - unsigned short **toP, const unsigned short *toLim) \ -{ \ - enum XML_Convert_Result res = XML_CONVERT_COMPLETED; \ - fromLim = *fromP + (((fromLim - *fromP) >> 1) << 1); /* shrink to even */ \ - /* Avoid copying first half only of surrogate */ \ - if (fromLim - *fromP > ((toLim - *toP) << 1) \ - && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) { \ - fromLim -= 2; \ - res = XML_CONVERT_INPUT_INCOMPLETE; \ - } \ - for (; *fromP < fromLim && *toP < toLim; *fromP += 2) \ - *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \ - if ((*toP == toLim) && (*fromP < fromLim)) \ - return XML_CONVERT_OUTPUT_EXHAUSTED; \ - else \ - return res; \ -} +#define DEFINE_UTF16_TO_UTF16(E) \ + static enum XML_Convert_Result PTRCALL E##toUtf16( \ + const ENCODING *enc, const char **fromP, const char *fromLim, \ + unsigned short **toP, const unsigned short *toLim) { \ + enum XML_Convert_Result res = XML_CONVERT_COMPLETED; \ + UNUSED_P(enc); \ + fromLim = *fromP + (((fromLim - *fromP) >> 1) << 1); /* shrink to even */ \ + /* Avoid copying first half only of surrogate */ \ + if (fromLim - *fromP > ((toLim - *toP) << 1) \ + && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) { \ + fromLim -= 2; \ + res = XML_CONVERT_INPUT_INCOMPLETE; \ + } \ + for (; *fromP < fromLim && *toP < toLim; *fromP += 2) \ + *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \ + if ((*toP == toLim) && (*fromP < fromLim)) \ + return XML_CONVERT_OUTPUT_EXHAUSTED; \ + else \ + return res; \ + } -#define SET2(ptr, ch) \ - (((ptr)[0] = ((ch) & 0xff)), ((ptr)[1] = ((ch) >> 8))) +#define SET2(ptr, ch) (((ptr)[0] = ((ch)&0xff)), ((ptr)[1] = ((ch) >> 8))) #define GET_LO(ptr) ((unsigned char)(ptr)[0]) #define GET_HI(ptr) ((unsigned char)(ptr)[1]) @@ -768,8 +721,7 @@ DEFINE_UTF16_TO_UTF16(little2_) #undef GET_LO #undef GET_HI -#define SET2(ptr, ch) \ - (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch) & 0xFF))) +#define SET2(ptr, ch) (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch)&0xFF))) #define GET_LO(ptr) ((unsigned char)(ptr)[1]) #define GET_HI(ptr) ((unsigned char)(ptr)[0]) @@ -780,292 +732,279 @@ DEFINE_UTF16_TO_UTF16(big2_) #undef GET_LO #undef GET_HI -#define LITTLE2_BYTE_TYPE(enc, p) \ - ((p)[1] == 0 \ - ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \ - : unicode_byte_type((p)[1], (p)[0])) -#define LITTLE2_BYTE_TO_ASCII(enc, p) ((p)[1] == 0 ? (p)[0] : -1) -#define LITTLE2_CHAR_MATCHES(enc, p, c) ((p)[1] == 0 && (p)[0] == c) -#define LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) \ +#define LITTLE2_BYTE_TYPE(enc, p) \ + ((p)[1] == 0 ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \ + : unicode_byte_type((p)[1], (p)[0])) +#define LITTLE2_BYTE_TO_ASCII(p) ((p)[1] == 0 ? (p)[0] : -1) +#define LITTLE2_CHAR_MATCHES(p, c) ((p)[1] == 0 && (p)[0] == c) +#define LITTLE2_IS_NAME_CHAR_MINBPC(p) \ UCS2_GET_NAMING(namePages, (unsigned char)p[1], (unsigned char)p[0]) -#define LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ +#define LITTLE2_IS_NMSTRT_CHAR_MINBPC(p) \ UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[1], (unsigned char)p[0]) #ifdef XML_MIN_SIZE static int PTRFASTCALL -little2_byteType(const ENCODING *enc, const char *p) -{ +little2_byteType(const ENCODING *enc, const char *p) { return LITTLE2_BYTE_TYPE(enc, p); } static int PTRFASTCALL -little2_byteToAscii(const ENCODING *enc, const char *p) -{ - return LITTLE2_BYTE_TO_ASCII(enc, p); +little2_byteToAscii(const ENCODING *enc, const char *p) { + UNUSED_P(enc); + return LITTLE2_BYTE_TO_ASCII(p); } static int PTRCALL -little2_charMatches(const ENCODING *enc, const char *p, int c) -{ - return LITTLE2_CHAR_MATCHES(enc, p, c); +little2_charMatches(const ENCODING *enc, const char *p, int c) { + UNUSED_P(enc); + return LITTLE2_CHAR_MATCHES(p, c); } static int PTRFASTCALL -little2_isNameMin(const ENCODING *enc, const char *p) -{ - return LITTLE2_IS_NAME_CHAR_MINBPC(enc, p); +little2_isNameMin(const ENCODING *enc, const char *p) { + UNUSED_P(enc); + return LITTLE2_IS_NAME_CHAR_MINBPC(p); } static int PTRFASTCALL -little2_isNmstrtMin(const ENCODING *enc, const char *p) -{ - return LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p); +little2_isNmstrtMin(const ENCODING *enc, const char *p) { + UNUSED_P(enc); + return LITTLE2_IS_NMSTRT_CHAR_MINBPC(p); } -#undef VTABLE -#define VTABLE VTABLE1, little2_toUtf8, little2_toUtf16 +# undef VTABLE +# define VTABLE VTABLE1, little2_toUtf8, little2_toUtf16 #else /* not XML_MIN_SIZE */ -#undef PREFIX -#define PREFIX(ident) little2_ ## ident -#define MINBPC(enc) 2 +# undef PREFIX +# define PREFIX(ident) little2_##ident +# define MINBPC(enc) 2 /* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ -#define BYTE_TYPE(enc, p) LITTLE2_BYTE_TYPE(enc, p) -#define BYTE_TO_ASCII(enc, p) LITTLE2_BYTE_TO_ASCII(enc, p) -#define CHAR_MATCHES(enc, p, c) LITTLE2_CHAR_MATCHES(enc, p, c) -#define IS_NAME_CHAR(enc, p, n) 0 -#define IS_NAME_CHAR_MINBPC(enc, p) LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) -#define IS_NMSTRT_CHAR(enc, p, n) (0) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) - -#define XML_TOK_IMPL_C -#include "xmltok_impl.c" -#undef XML_TOK_IMPL_C - -#undef MINBPC -#undef BYTE_TYPE -#undef BYTE_TO_ASCII -#undef CHAR_MATCHES -#undef IS_NAME_CHAR -#undef IS_NAME_CHAR_MINBPC -#undef IS_NMSTRT_CHAR -#undef IS_NMSTRT_CHAR_MINBPC -#undef IS_INVALID_CHAR +# define BYTE_TYPE(enc, p) LITTLE2_BYTE_TYPE(enc, p) +# define BYTE_TO_ASCII(enc, p) LITTLE2_BYTE_TO_ASCII(p) +# define CHAR_MATCHES(enc, p, c) LITTLE2_CHAR_MATCHES(p, c) +# define IS_NAME_CHAR(enc, p, n) 0 +# define IS_NAME_CHAR_MINBPC(enc, p) LITTLE2_IS_NAME_CHAR_MINBPC(p) +# define IS_NMSTRT_CHAR(enc, p, n) (0) +# define IS_NMSTRT_CHAR_MINBPC(enc, p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(p) + +# define XML_TOK_IMPL_C +# include "xmltok_impl.c" +# undef XML_TOK_IMPL_C + +# undef MINBPC +# undef BYTE_TYPE +# undef BYTE_TO_ASCII +# undef CHAR_MATCHES +# undef IS_NAME_CHAR +# undef IS_NAME_CHAR_MINBPC +# undef IS_NMSTRT_CHAR +# undef IS_NMSTRT_CHAR_MINBPC +# undef IS_INVALID_CHAR #endif /* not XML_MIN_SIZE */ #ifdef XML_NS -static const struct normal_encoding little2_encoding_ns = { - { VTABLE, 2, 0, -#if BYTEORDER == 1234 - 1 -#else - 0 -#endif - }, - { -#include "asciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(little2_) NULL_VTABLE -}; +static const struct normal_encoding little2_encoding_ns + = {{VTABLE, 2, 0, +# if BYTEORDER == 1234 + 1 +# else + 0 +# endif + }, + { +# include "asciitab.h" +# include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) NULL_VTABLE}; #endif -static const struct normal_encoding little2_encoding = { - { VTABLE, 2, 0, +static const struct normal_encoding little2_encoding + = {{VTABLE, 2, 0, #if BYTEORDER == 1234 - 1 + 1 #else - 0 + 0 #endif - }, - { + }, + { #define BT_COLON BT_NMSTRT #include "asciitab.h" #undef BT_COLON #include "latin1tab.h" - }, - STANDARD_VTABLE(little2_) NULL_VTABLE -}; + }, + STANDARD_VTABLE(little2_) NULL_VTABLE}; #if BYTEORDER != 4321 -#ifdef XML_NS +# ifdef XML_NS -static const struct normal_encoding internal_little2_encoding_ns = { - { VTABLE, 2, 0, 1 }, - { -#include "iasciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(little2_) NULL_VTABLE -}; +static const struct normal_encoding internal_little2_encoding_ns + = {{VTABLE, 2, 0, 1}, + { +# include "iasciitab.h" +# include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) NULL_VTABLE}; -#endif +# endif -static const struct normal_encoding internal_little2_encoding = { - { VTABLE, 2, 0, 1 }, - { -#define BT_COLON BT_NMSTRT -#include "iasciitab.h" -#undef BT_COLON -#include "latin1tab.h" - }, - STANDARD_VTABLE(little2_) NULL_VTABLE -}; +static const struct normal_encoding internal_little2_encoding + = {{VTABLE, 2, 0, 1}, + { +# define BT_COLON BT_NMSTRT +# include "iasciitab.h" +# undef BT_COLON +# include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) NULL_VTABLE}; #endif - -#define BIG2_BYTE_TYPE(enc, p) \ - ((p)[0] == 0 \ - ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \ - : unicode_byte_type((p)[0], (p)[1])) -#define BIG2_BYTE_TO_ASCII(enc, p) ((p)[0] == 0 ? (p)[1] : -1) -#define BIG2_CHAR_MATCHES(enc, p, c) ((p)[0] == 0 && (p)[1] == c) -#define BIG2_IS_NAME_CHAR_MINBPC(enc, p) \ +#define BIG2_BYTE_TYPE(enc, p) \ + ((p)[0] == 0 \ + ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \ + : unicode_byte_type((p)[0], (p)[1])) +#define BIG2_BYTE_TO_ASCII(p) ((p)[0] == 0 ? (p)[1] : -1) +#define BIG2_CHAR_MATCHES(p, c) ((p)[0] == 0 && (p)[1] == c) +#define BIG2_IS_NAME_CHAR_MINBPC(p) \ UCS2_GET_NAMING(namePages, (unsigned char)p[0], (unsigned char)p[1]) -#define BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ +#define BIG2_IS_NMSTRT_CHAR_MINBPC(p) \ UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[0], (unsigned char)p[1]) #ifdef XML_MIN_SIZE static int PTRFASTCALL -big2_byteType(const ENCODING *enc, const char *p) -{ +big2_byteType(const ENCODING *enc, const char *p) { return BIG2_BYTE_TYPE(enc, p); } static int PTRFASTCALL -big2_byteToAscii(const ENCODING *enc, const char *p) -{ - return BIG2_BYTE_TO_ASCII(enc, p); +big2_byteToAscii(const ENCODING *enc, const char *p) { + UNUSED_P(enc); + return BIG2_BYTE_TO_ASCII(p); } static int PTRCALL -big2_charMatches(const ENCODING *enc, const char *p, int c) -{ - return BIG2_CHAR_MATCHES(enc, p, c); +big2_charMatches(const ENCODING *enc, const char *p, int c) { + UNUSED_P(enc); + return BIG2_CHAR_MATCHES(p, c); } static int PTRFASTCALL -big2_isNameMin(const ENCODING *enc, const char *p) -{ - return BIG2_IS_NAME_CHAR_MINBPC(enc, p); +big2_isNameMin(const ENCODING *enc, const char *p) { + UNUSED_P(enc); + return BIG2_IS_NAME_CHAR_MINBPC(p); } static int PTRFASTCALL -big2_isNmstrtMin(const ENCODING *enc, const char *p) -{ - return BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p); +big2_isNmstrtMin(const ENCODING *enc, const char *p) { + UNUSED_P(enc); + return BIG2_IS_NMSTRT_CHAR_MINBPC(p); } -#undef VTABLE -#define VTABLE VTABLE1, big2_toUtf8, big2_toUtf16 +# undef VTABLE +# define VTABLE VTABLE1, big2_toUtf8, big2_toUtf16 #else /* not XML_MIN_SIZE */ -#undef PREFIX -#define PREFIX(ident) big2_ ## ident -#define MINBPC(enc) 2 +# undef PREFIX +# define PREFIX(ident) big2_##ident +# define MINBPC(enc) 2 /* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ -#define BYTE_TYPE(enc, p) BIG2_BYTE_TYPE(enc, p) -#define BYTE_TO_ASCII(enc, p) BIG2_BYTE_TO_ASCII(enc, p) -#define CHAR_MATCHES(enc, p, c) BIG2_CHAR_MATCHES(enc, p, c) -#define IS_NAME_CHAR(enc, p, n) 0 -#define IS_NAME_CHAR_MINBPC(enc, p) BIG2_IS_NAME_CHAR_MINBPC(enc, p) -#define IS_NMSTRT_CHAR(enc, p, n) (0) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) - -#define XML_TOK_IMPL_C -#include "xmltok_impl.c" -#undef XML_TOK_IMPL_C - -#undef MINBPC -#undef BYTE_TYPE -#undef BYTE_TO_ASCII -#undef CHAR_MATCHES -#undef IS_NAME_CHAR -#undef IS_NAME_CHAR_MINBPC -#undef IS_NMSTRT_CHAR -#undef IS_NMSTRT_CHAR_MINBPC -#undef IS_INVALID_CHAR +# define BYTE_TYPE(enc, p) BIG2_BYTE_TYPE(enc, p) +# define BYTE_TO_ASCII(enc, p) BIG2_BYTE_TO_ASCII(p) +# define CHAR_MATCHES(enc, p, c) BIG2_CHAR_MATCHES(p, c) +# define IS_NAME_CHAR(enc, p, n) 0 +# define IS_NAME_CHAR_MINBPC(enc, p) BIG2_IS_NAME_CHAR_MINBPC(p) +# define IS_NMSTRT_CHAR(enc, p, n) (0) +# define IS_NMSTRT_CHAR_MINBPC(enc, p) BIG2_IS_NMSTRT_CHAR_MINBPC(p) + +# define XML_TOK_IMPL_C +# include "xmltok_impl.c" +# undef XML_TOK_IMPL_C + +# undef MINBPC +# undef BYTE_TYPE +# undef BYTE_TO_ASCII +# undef CHAR_MATCHES +# undef IS_NAME_CHAR +# undef IS_NAME_CHAR_MINBPC +# undef IS_NMSTRT_CHAR +# undef IS_NMSTRT_CHAR_MINBPC +# undef IS_INVALID_CHAR #endif /* not XML_MIN_SIZE */ #ifdef XML_NS -static const struct normal_encoding big2_encoding_ns = { - { VTABLE, 2, 0, -#if BYTEORDER == 4321 - 1 -#else - 0 -#endif - }, - { -#include "asciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(big2_) NULL_VTABLE -}; +static const struct normal_encoding big2_encoding_ns + = {{VTABLE, 2, 0, +# if BYTEORDER == 4321 + 1 +# else + 0 +# endif + }, + { +# include "asciitab.h" +# include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) NULL_VTABLE}; #endif -static const struct normal_encoding big2_encoding = { - { VTABLE, 2, 0, +static const struct normal_encoding big2_encoding + = {{VTABLE, 2, 0, #if BYTEORDER == 4321 - 1 + 1 #else - 0 + 0 #endif - }, - { + }, + { #define BT_COLON BT_NMSTRT #include "asciitab.h" #undef BT_COLON #include "latin1tab.h" - }, - STANDARD_VTABLE(big2_) NULL_VTABLE -}; + }, + STANDARD_VTABLE(big2_) NULL_VTABLE}; #if BYTEORDER != 1234 -#ifdef XML_NS +# ifdef XML_NS -static const struct normal_encoding internal_big2_encoding_ns = { - { VTABLE, 2, 0, 1 }, - { -#include "iasciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(big2_) NULL_VTABLE -}; +static const struct normal_encoding internal_big2_encoding_ns + = {{VTABLE, 2, 0, 1}, + { +# include "iasciitab.h" +# include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) NULL_VTABLE}; -#endif +# endif -static const struct normal_encoding internal_big2_encoding = { - { VTABLE, 2, 0, 1 }, - { -#define BT_COLON BT_NMSTRT -#include "iasciitab.h" -#undef BT_COLON -#include "latin1tab.h" - }, - STANDARD_VTABLE(big2_) NULL_VTABLE -}; +static const struct normal_encoding internal_big2_encoding + = {{VTABLE, 2, 0, 1}, + { +# define BT_COLON BT_NMSTRT +# include "iasciitab.h" +# undef BT_COLON +# include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) NULL_VTABLE}; #endif #undef PREFIX static int FASTCALL -streqci(const char *s1, const char *s2) -{ +streqci(const char *s1, const char *s2) { for (;;) { char c1 = *s1++; char c2 = *s2++; @@ -1079,22 +1018,21 @@ streqci(const char *s1, const char *s2) c2 += ASCII_A - ASCII_a; /* LCOV_EXCL_LINE */ if (c1 != c2) return 0; - if (!c1) + if (! c1) break; } return 1; } static void PTRCALL -initUpdatePosition(const ENCODING *UNUSED_P(enc), const char *ptr, - const char *end, POSITION *pos) -{ +initUpdatePosition(const ENCODING *enc, const char *ptr, const char *end, + POSITION *pos) { + UNUSED_P(enc); normal_updatePosition(&utf8_encoding.enc, ptr, end, pos); } static int -toAscii(const ENCODING *enc, const char *ptr, const char *end) -{ +toAscii(const ENCODING *enc, const char *ptr, const char *end) { char buf[1]; char *p = buf; XmlUtf8Convert(enc, &ptr, end, &p, p + 1); @@ -1105,8 +1043,7 @@ toAscii(const ENCODING *enc, const char *ptr, const char *end) } static int FASTCALL -isSpace(int c) -{ +isSpace(int c) { switch (c) { case 0x20: case 0xD: @@ -1121,21 +1058,16 @@ isSpace(int c) followed by name=val. */ static int -parsePseudoAttribute(const ENCODING *enc, - const char *ptr, - const char *end, - const char **namePtr, - const char **nameEndPtr, - const char **valPtr, - const char **nextTokPtr) -{ +parsePseudoAttribute(const ENCODING *enc, const char *ptr, const char *end, + const char **namePtr, const char **nameEndPtr, + const char **valPtr, const char **nextTokPtr) { int c; char open; if (ptr == end) { *namePtr = NULL; return 1; } - if (!isSpace(toAscii(enc, ptr, end))) { + if (! isSpace(toAscii(enc, ptr, end))) { *nextTokPtr = ptr; return 0; } @@ -1191,12 +1123,9 @@ parsePseudoAttribute(const ENCODING *enc, c = toAscii(enc, ptr, end); if (c == open) break; - if (!(ASCII_a <= c && c <= ASCII_z) - && !(ASCII_A <= c && c <= ASCII_Z) - && !(ASCII_0 <= c && c <= ASCII_9) - && c != ASCII_PERIOD - && c != ASCII_MINUS - && c != ASCII_UNDERSCORE) { + if (! (ASCII_a <= c && c <= ASCII_z) && ! (ASCII_A <= c && c <= ASCII_Z) + && ! (ASCII_0 <= c && c <= ASCII_9) && c != ASCII_PERIOD + && c != ASCII_MINUS && c != ASCII_UNDERSCORE) { *nextTokPtr = ptr; return 0; } @@ -1205,68 +1134,52 @@ parsePseudoAttribute(const ENCODING *enc, return 1; } -static const char KW_version[] = { - ASCII_v, ASCII_e, ASCII_r, ASCII_s, ASCII_i, ASCII_o, ASCII_n, '\0' -}; +static const char KW_version[] + = {ASCII_v, ASCII_e, ASCII_r, ASCII_s, ASCII_i, ASCII_o, ASCII_n, '\0'}; -static const char KW_encoding[] = { - ASCII_e, ASCII_n, ASCII_c, ASCII_o, ASCII_d, ASCII_i, ASCII_n, ASCII_g, '\0' -}; +static const char KW_encoding[] = {ASCII_e, ASCII_n, ASCII_c, ASCII_o, ASCII_d, + ASCII_i, ASCII_n, ASCII_g, '\0'}; -static const char KW_standalone[] = { - ASCII_s, ASCII_t, ASCII_a, ASCII_n, ASCII_d, ASCII_a, ASCII_l, ASCII_o, - ASCII_n, ASCII_e, '\0' -}; +static const char KW_standalone[] + = {ASCII_s, ASCII_t, ASCII_a, ASCII_n, ASCII_d, ASCII_a, + ASCII_l, ASCII_o, ASCII_n, ASCII_e, '\0'}; -static const char KW_yes[] = { - ASCII_y, ASCII_e, ASCII_s, '\0' -}; +static const char KW_yes[] = {ASCII_y, ASCII_e, ASCII_s, '\0'}; -static const char KW_no[] = { - ASCII_n, ASCII_o, '\0' -}; +static const char KW_no[] = {ASCII_n, ASCII_o, '\0'}; static int -doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *, - const char *, +doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *, const char *, const char *), - int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, - const char **encodingName, - const ENCODING **encoding, - int *standalone) -{ + int isGeneralTextEntity, const ENCODING *enc, const char *ptr, + const char *end, const char **badPtr, const char **versionPtr, + const char **versionEndPtr, const char **encodingName, + const ENCODING **encoding, int *standalone) { const char *val = NULL; const char *name = NULL; const char *nameEnd = NULL; ptr += 5 * enc->minBytesPerChar; end -= 2 * enc->minBytesPerChar; - if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr) - || !name) { + if (! parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr) + || ! name) { *badPtr = ptr; return 0; } - if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_version)) { - if (!isGeneralTextEntity) { + if (! XmlNameMatchesAscii(enc, name, nameEnd, KW_version)) { + if (! isGeneralTextEntity) { *badPtr = name; return 0; } - } - else { + } else { if (versionPtr) *versionPtr = val; if (versionEndPtr) *versionEndPtr = ptr; - if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { + if (! parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { *badPtr = ptr; return 0; } - if (!name) { + if (! name) { if (isGeneralTextEntity) { /* a TextDecl must have an EncodingDecl */ *badPtr = ptr; @@ -1277,7 +1190,7 @@ doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *, } if (XmlNameMatchesAscii(enc, name, nameEnd, KW_encoding)) { int c = toAscii(enc, val, end); - if (!(ASCII_a <= c && c <= ASCII_z) && !(ASCII_A <= c && c <= ASCII_Z)) { + if (! (ASCII_a <= c && c <= ASCII_z) && ! (ASCII_A <= c && c <= ASCII_Z)) { *badPtr = val; return 0; } @@ -1285,14 +1198,14 @@ doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *, *encodingName = val; if (encoding) *encoding = encodingFinder(enc, val, ptr - enc->minBytesPerChar); - if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { + if (! parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { *badPtr = ptr; return 0; } - if (!name) + if (! name) return 1; } - if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_standalone) + if (! XmlNameMatchesAscii(enc, name, nameEnd, KW_standalone) || isGeneralTextEntity) { *badPtr = name; return 0; @@ -1300,12 +1213,10 @@ doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *, if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_yes)) { if (standalone) *standalone = 1; - } - else if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_no)) { + } else if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_no)) { if (standalone) *standalone = 0; - } - else { + } else { *badPtr = val; return 0; } @@ -1319,11 +1230,16 @@ doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *, } static int FASTCALL -checkCharRefNumber(int result) -{ +checkCharRefNumber(int result) { switch (result >> 8) { - case 0xD8: case 0xD9: case 0xDA: case 0xDB: - case 0xDC: case 0xDD: case 0xDE: case 0xDF: + case 0xD8: + case 0xD9: + case 0xDA: + case 0xDB: + case 0xDC: + case 0xDD: + case 0xDE: + case 0xDF: return -1; case 0: if (latin1_encoding.type[result] == BT_NONXML) @@ -1338,8 +1254,7 @@ checkCharRefNumber(int result) } int FASTCALL -XmlUtf8Encode(int c, char *buf) -{ +XmlUtf8Encode(int c, char *buf) { enum { /* minN is minimum legal resulting value for N byte sequence */ min2 = 0x80, @@ -1375,8 +1290,7 @@ XmlUtf8Encode(int c, char *buf) } int FASTCALL -XmlUtf16Encode(int charNum, unsigned short *buf) -{ +XmlUtf16Encode(int charNum, unsigned short *buf) { if (charNum < 0) return 0; if (charNum < 0x10000) { @@ -1400,17 +1314,15 @@ struct unknown_encoding { char utf8[256][4]; }; -#define AS_UNKNOWN_ENCODING(enc) ((const struct unknown_encoding *) (enc)) +#define AS_UNKNOWN_ENCODING(enc) ((const struct unknown_encoding *)(enc)) int -XmlSizeOfUnknownEncoding(void) -{ +XmlSizeOfUnknownEncoding(void) { return sizeof(struct unknown_encoding); } static int PTRFASTCALL -unknown_isName(const ENCODING *enc, const char *p) -{ +unknown_isName(const ENCODING *enc, const char *p) { const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); int c = uenc->convert(uenc->userData, p); if (c & ~0xFFFF) @@ -1419,8 +1331,7 @@ unknown_isName(const ENCODING *enc, const char *p) } static int PTRFASTCALL -unknown_isNmstrt(const ENCODING *enc, const char *p) -{ +unknown_isNmstrt(const ENCODING *enc, const char *p) { const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); int c = uenc->convert(uenc->userData, p); if (c & ~0xFFFF) @@ -1429,18 +1340,15 @@ unknown_isNmstrt(const ENCODING *enc, const char *p) } static int PTRFASTCALL -unknown_isInvalid(const ENCODING *enc, const char *p) -{ +unknown_isInvalid(const ENCODING *enc, const char *p) { const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); int c = uenc->convert(uenc->userData, p); return (c & ~0xFFFF) || checkCharRefNumber(c) < 0; } static enum XML_Convert_Result PTRCALL -unknown_toUtf8(const ENCODING *enc, - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ +unknown_toUtf8(const ENCODING *enc, const char **fromP, const char *fromLim, + char **toP, const char *toLim) { const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); char buf[XML_UTF8_ENCODE_MAX]; for (;;) { @@ -1458,8 +1366,7 @@ unknown_toUtf8(const ENCODING *enc, utf8 = buf; *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] - (BT_LEAD2 - 2)); - } - else { + } else { if (n > toLim - *toP) return XML_CONVERT_OUTPUT_EXHAUSTED; (*fromP)++; @@ -1470,20 +1377,16 @@ unknown_toUtf8(const ENCODING *enc, } static enum XML_Convert_Result PTRCALL -unknown_toUtf16(const ENCODING *enc, - const char **fromP, const char *fromLim, - unsigned short **toP, const unsigned short *toLim) -{ +unknown_toUtf16(const ENCODING *enc, const char **fromP, const char *fromLim, + unsigned short **toP, const unsigned short *toLim) { const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); while (*fromP < fromLim && *toP < toLim) { unsigned short c = uenc->utf16[(unsigned char)**fromP]; if (c == 0) { - c = (unsigned short) - uenc->convert(uenc->userData, *fromP); + c = (unsigned short)uenc->convert(uenc->userData, *fromP); *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] - (BT_LEAD2 - 2)); - } - else + } else (*fromP)++; *(*toP)++ = c; } @@ -1495,19 +1398,14 @@ unknown_toUtf16(const ENCODING *enc, } ENCODING * -XmlInitUnknownEncoding(void *mem, - int *table, - CONVERTER convert, - void *userData) -{ +XmlInitUnknownEncoding(void *mem, int *table, CONVERTER convert, + void *userData) { int i; struct unknown_encoding *e = (struct unknown_encoding *)mem; - for (i = 0; i < (int)sizeof(struct normal_encoding); i++) - ((char *)mem)[i] = ((char *)&latin1_encoding)[i]; + memcpy(mem, &latin1_encoding, sizeof(struct normal_encoding)); for (i = 0; i < 128; i++) if (latin1_encoding.type[i] != BT_OTHER - && latin1_encoding.type[i] != BT_NONXML - && table[i] != i) + && latin1_encoding.type[i] != BT_NONXML && table[i] != i) return 0; for (i = 0; i < 256; i++) { int c = table[i]; @@ -1517,35 +1415,30 @@ XmlInitUnknownEncoding(void *mem, e->utf16[i] = 0xFFFF; e->utf8[i][0] = 1; e->utf8[i][1] = 0; - } - else if (c < 0) { + } else if (c < 0) { if (c < -4) return 0; /* Multi-byte sequences need a converter function */ - if (!convert) + if (! convert) return 0; e->normal.type[i] = (unsigned char)(BT_LEAD2 - (c + 2)); e->utf8[i][0] = 0; e->utf16[i] = 0; - } - else if (c < 0x80) { + } else if (c < 0x80) { if (latin1_encoding.type[c] != BT_OTHER - && latin1_encoding.type[c] != BT_NONXML - && c != i) + && latin1_encoding.type[c] != BT_NONXML && c != i) return 0; e->normal.type[i] = latin1_encoding.type[c]; e->utf8[i][0] = 1; e->utf8[i][1] = (char)c; e->utf16[i] = (unsigned short)(c == 0 ? 0xFFFF : c); - } - else if (checkCharRefNumber(c) < 0) { + } else if (checkCharRefNumber(c) < 0) { e->normal.type[i] = BT_NONXML; /* This shouldn't really get used. */ e->utf16[i] = 0xFFFF; e->utf8[i][0] = 1; e->utf8[i][1] = 0; - } - else { + } else { if (c > 0xFFFF) return 0; if (UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xff)) @@ -1590,44 +1483,32 @@ enum { NO_ENC }; -static const char KW_ISO_8859_1[] = { - ASCII_I, ASCII_S, ASCII_O, ASCII_MINUS, ASCII_8, ASCII_8, ASCII_5, ASCII_9, - ASCII_MINUS, ASCII_1, '\0' -}; -static const char KW_US_ASCII[] = { - ASCII_U, ASCII_S, ASCII_MINUS, ASCII_A, ASCII_S, ASCII_C, ASCII_I, ASCII_I, - '\0' -}; -static const char KW_UTF_8[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_8, '\0' -}; -static const char KW_UTF_16[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, '\0' -}; -static const char KW_UTF_16BE[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_B, ASCII_E, - '\0' -}; -static const char KW_UTF_16LE[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_L, ASCII_E, - '\0' -}; +static const char KW_ISO_8859_1[] + = {ASCII_I, ASCII_S, ASCII_O, ASCII_MINUS, ASCII_8, ASCII_8, + ASCII_5, ASCII_9, ASCII_MINUS, ASCII_1, '\0'}; +static const char KW_US_ASCII[] + = {ASCII_U, ASCII_S, ASCII_MINUS, ASCII_A, ASCII_S, + ASCII_C, ASCII_I, ASCII_I, '\0'}; +static const char KW_UTF_8[] + = {ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_8, '\0'}; +static const char KW_UTF_16[] + = {ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, '\0'}; +static const char KW_UTF_16BE[] + = {ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, + ASCII_6, ASCII_B, ASCII_E, '\0'}; +static const char KW_UTF_16LE[] + = {ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, + ASCII_6, ASCII_L, ASCII_E, '\0'}; static int FASTCALL -getEncodingIndex(const char *name) -{ - static const char * const encodingNames[] = { - KW_ISO_8859_1, - KW_US_ASCII, - KW_UTF_8, - KW_UTF_16, - KW_UTF_16BE, - KW_UTF_16LE, +getEncodingIndex(const char *name) { + static const char *const encodingNames[] = { + KW_ISO_8859_1, KW_US_ASCII, KW_UTF_8, KW_UTF_16, KW_UTF_16BE, KW_UTF_16LE, }; int i; if (name == NULL) return NO_ENC; - for (i = 0; i < (int)(sizeof(encodingNames)/sizeof(encodingNames[0])); i++) + for (i = 0; i < (int)(sizeof(encodingNames) / sizeof(encodingNames[0])); i++) if (streqci(name, encodingNames[i])) return i; return UNKNOWN_ENC; @@ -1647,15 +1528,9 @@ getEncodingIndex(const char *name) XML_PROLOG_STATE otherwise. */ - static int -initScan(const ENCODING * const *encodingTable, - const INIT_ENCODING *enc, - int state, - const char *ptr, - const char *end, - const char **nextTokPtr) -{ +initScan(const ENCODING *const *encodingTable, const INIT_ENCODING *enc, + int state, const char *ptr, const char *end, const char **nextTokPtr) { const ENCODING **encPtr; if (ptr >= end) @@ -1680,20 +1555,17 @@ initScan(const ENCODING * const *encodingTable, case 0xFE: case 0xFF: case 0xEF: /* possibly first byte of UTF-8 BOM */ - if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC - && state == XML_CONTENT_STATE) + if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC && state == XML_CONTENT_STATE) break; /* fall through */ case 0x00: case 0x3C: return XML_TOK_PARTIAL; } - } - else { + } else { switch (((unsigned char)ptr[0] << 8) | (unsigned char)ptr[1]) { case 0xFEFF: - if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC - && state == XML_CONTENT_STATE) + if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC && state == XML_CONTENT_STATE) break; *nextTokPtr = ptr + 2; *encPtr = encodingTable[UTF_16BE_ENC]; @@ -1707,8 +1579,7 @@ initScan(const ENCODING * const *encodingTable, *encPtr = encodingTable[UTF_16LE_ENC]; return XmlTok(*encPtr, state, ptr, end, nextTokPtr); case 0xFFFE: - if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC - && state == XML_CONTENT_STATE) + if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC && state == XML_CONTENT_STATE) break; *nextTokPtr = ptr + 2; *encPtr = encodingTable[UTF_16LE_ENC]; @@ -1723,8 +1594,8 @@ initScan(const ENCODING * const *encodingTable, */ if (state == XML_CONTENT_STATE) { int e = INIT_ENC_INDEX(enc); - if (e == ISO_8859_1_ENC || e == UTF_16BE_ENC - || e == UTF_16LE_ENC || e == UTF_16_ENC) + if (e == ISO_8859_1_ENC || e == UTF_16BE_ENC || e == UTF_16LE_ENC + || e == UTF_16_ENC) break; } if (ptr + 2 == end) @@ -1747,8 +1618,7 @@ initScan(const ENCODING * const *encodingTable, break; *encPtr = encodingTable[UTF_16BE_ENC]; return XmlTok(*encPtr, state, ptr, end, nextTokPtr); - } - else if (ptr[1] == '\0') { + } else if (ptr[1] == '\0') { /* We could recover here in the case: - parsing an external entity - second byte is 0 @@ -1770,7 +1640,6 @@ initScan(const ENCODING * const *encodingTable, return XmlTok(*encPtr, state, ptr, end, nextTokPtr); } - #define NS(x) x #define ns(x) x #define XML_TOK_NS_C @@ -1781,22 +1650,19 @@ initScan(const ENCODING * const *encodingTable, #ifdef XML_NS -#define NS(x) x ## NS -#define ns(x) x ## _ns +# define NS(x) x##NS +# define ns(x) x##_ns -#define XML_TOK_NS_C -#include "xmltok_ns.c" -#undef XML_TOK_NS_C +# define XML_TOK_NS_C +# include "xmltok_ns.c" +# undef XML_TOK_NS_C -#undef NS -#undef ns +# undef NS +# undef ns ENCODING * -XmlInitUnknownEncodingNS(void *mem, - int *table, - CONVERTER convert, - void *userData) -{ +XmlInitUnknownEncodingNS(void *mem, int *table, CONVERTER convert, + void *userData) { ENCODING *enc = XmlInitUnknownEncoding(mem, table, convert, userData); if (enc) ((struct normal_encoding *)enc)->type[ASCII_COLON] = BT_COLON; diff --git a/Modules/expat/xmltok.h b/Modules/expat/xmltok.h index 50926f38ab323e..2adbf5307befae 100644 --- a/Modules/expat/xmltok.h +++ b/Modules/expat/xmltok.h @@ -38,16 +38,18 @@ extern "C" { #endif /* The following token may be returned by XmlContentTok */ -#define XML_TOK_TRAILING_RSQB -5 /* ] or ]] at the end of the scan; might be - start of illegal ]]> sequence */ +#define XML_TOK_TRAILING_RSQB \ + -5 /* ] or ]] at the end of the scan; might be \ + start of illegal ]]> sequence */ /* The following tokens may be returned by both XmlPrologTok and XmlContentTok. */ -#define XML_TOK_NONE -4 /* The string to be scanned is empty */ -#define XML_TOK_TRAILING_CR -3 /* A CR at the end of the scan; - might be part of CRLF sequence */ -#define XML_TOK_PARTIAL_CHAR -2 /* only part of a multibyte sequence */ -#define XML_TOK_PARTIAL -1 /* only part of a token */ +#define XML_TOK_NONE -4 /* The string to be scanned is empty */ +#define XML_TOK_TRAILING_CR \ + -3 /* A CR at the end of the scan; \ + might be part of CRLF sequence */ +#define XML_TOK_PARTIAL_CHAR -2 /* only part of a multibyte sequence */ +#define XML_TOK_PARTIAL -1 /* only part of a token */ #define XML_TOK_INVALID 0 /* The following tokens are returned by XmlContentTok; some are also @@ -62,24 +64,24 @@ extern "C" { #define XML_TOK_DATA_NEWLINE 7 #define XML_TOK_CDATA_SECT_OPEN 8 #define XML_TOK_ENTITY_REF 9 -#define XML_TOK_CHAR_REF 10 /* numeric character reference */ +#define XML_TOK_CHAR_REF 10 /* numeric character reference */ /* The following tokens may be returned by both XmlPrologTok and XmlContentTok. */ -#define XML_TOK_PI 11 /* processing instruction */ -#define XML_TOK_XML_DECL 12 /* XML decl or text decl */ +#define XML_TOK_PI 11 /* processing instruction */ +#define XML_TOK_XML_DECL 12 /* XML decl or text decl */ #define XML_TOK_COMMENT 13 -#define XML_TOK_BOM 14 /* Byte order mark */ +#define XML_TOK_BOM 14 /* Byte order mark */ /* The following tokens are returned only by XmlPrologTok */ #define XML_TOK_PROLOG_S 15 -#define XML_TOK_DECL_OPEN 16 /* */ +#define XML_TOK_DECL_OPEN 16 /* */ #define XML_TOK_NAME 18 #define XML_TOK_NMTOKEN 19 -#define XML_TOK_POUND_NAME 20 /* #name */ -#define XML_TOK_OR 21 /* | */ +#define XML_TOK_POUND_NAME 20 /* #name */ +#define XML_TOK_OR 21 /* | */ #define XML_TOK_PERCENT 22 #define XML_TOK_OPEN_PAREN 23 #define XML_TOK_CLOSE_PAREN 24 @@ -90,14 +92,14 @@ extern "C" { #define XML_TOK_INSTANCE_START 29 /* The following occur only in element type declarations */ -#define XML_TOK_NAME_QUESTION 30 /* name? */ -#define XML_TOK_NAME_ASTERISK 31 /* name* */ -#define XML_TOK_NAME_PLUS 32 /* name+ */ -#define XML_TOK_COND_SECT_OPEN 33 /* */ -#define XML_TOK_CLOSE_PAREN_QUESTION 35 /* )? */ -#define XML_TOK_CLOSE_PAREN_ASTERISK 36 /* )* */ -#define XML_TOK_CLOSE_PAREN_PLUS 37 /* )+ */ +#define XML_TOK_NAME_QUESTION 30 /* name? */ +#define XML_TOK_NAME_ASTERISK 31 /* name* */ +#define XML_TOK_NAME_PLUS 32 /* name+ */ +#define XML_TOK_COND_SECT_OPEN 33 /* */ +#define XML_TOK_CLOSE_PAREN_QUESTION 35 /* )? */ +#define XML_TOK_CLOSE_PAREN_ASTERISK 36 /* )* */ +#define XML_TOK_CLOSE_PAREN_PLUS 37 /* )+ */ #define XML_TOK_COMMA 38 /* The following token is returned only by XmlAttributeValueTok */ @@ -112,20 +114,20 @@ extern "C" { #define XML_TOK_PREFIXED_NAME 41 #ifdef XML_DTD -#define XML_TOK_IGNORE_SECT 42 +# define XML_TOK_IGNORE_SECT 42 #endif /* XML_DTD */ #ifdef XML_DTD -#define XML_N_STATES 4 +# define XML_N_STATES 4 #else /* not XML_DTD */ -#define XML_N_STATES 3 +# define XML_N_STATES 3 #endif /* not XML_DTD */ #define XML_PROLOG_STATE 0 #define XML_CONTENT_STATE 1 #define XML_CDATA_SECTION_STATE 2 #ifdef XML_DTD -#define XML_IGNORE_SECTION_STATE 3 +# define XML_IGNORE_SECTION_STATE 3 #endif /* XML_DTD */ #define XML_N_LITERAL_TYPES 2 @@ -153,52 +155,41 @@ typedef struct { struct encoding; typedef struct encoding ENCODING; -typedef int (PTRCALL *SCANNER)(const ENCODING *, - const char *, - const char *, - const char **); +typedef int(PTRCALL *SCANNER)(const ENCODING *, const char *, const char *, + const char **); enum XML_Convert_Result { XML_CONVERT_COMPLETED = 0, XML_CONVERT_INPUT_INCOMPLETE = 1, - XML_CONVERT_OUTPUT_EXHAUSTED = 2 /* and therefore potentially input remaining as well */ + XML_CONVERT_OUTPUT_EXHAUSTED + = 2 /* and therefore potentially input remaining as well */ }; struct encoding { SCANNER scanners[XML_N_STATES]; SCANNER literalScanners[XML_N_LITERAL_TYPES]; - int (PTRCALL *nameMatchesAscii)(const ENCODING *, - const char *, - const char *, - const char *); - int (PTRFASTCALL *nameLength)(const ENCODING *, const char *); + int(PTRCALL *nameMatchesAscii)(const ENCODING *, const char *, const char *, + const char *); + int(PTRFASTCALL *nameLength)(const ENCODING *, const char *); const char *(PTRFASTCALL *skipS)(const ENCODING *, const char *); - int (PTRCALL *getAtts)(const ENCODING *enc, - const char *ptr, - int attsMax, - ATTRIBUTE *atts); - int (PTRFASTCALL *charRefNumber)(const ENCODING *enc, const char *ptr); - int (PTRCALL *predefinedEntityName)(const ENCODING *, - const char *, - const char *); - void (PTRCALL *updatePosition)(const ENCODING *, - const char *ptr, - const char *end, - POSITION *); - int (PTRCALL *isPublicId)(const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr); - enum XML_Convert_Result (PTRCALL *utf8Convert)(const ENCODING *enc, - const char **fromP, - const char *fromLim, - char **toP, - const char *toLim); - enum XML_Convert_Result (PTRCALL *utf16Convert)(const ENCODING *enc, - const char **fromP, - const char *fromLim, - unsigned short **toP, - const unsigned short *toLim); + int(PTRCALL *getAtts)(const ENCODING *enc, const char *ptr, int attsMax, + ATTRIBUTE *atts); + int(PTRFASTCALL *charRefNumber)(const ENCODING *enc, const char *ptr); + int(PTRCALL *predefinedEntityName)(const ENCODING *, const char *, + const char *); + void(PTRCALL *updatePosition)(const ENCODING *, const char *ptr, + const char *end, POSITION *); + int(PTRCALL *isPublicId)(const ENCODING *enc, const char *ptr, + const char *end, const char **badPtr); + enum XML_Convert_Result(PTRCALL *utf8Convert)(const ENCODING *enc, + const char **fromP, + const char *fromLim, char **toP, + const char *toLim); + enum XML_Convert_Result(PTRCALL *utf16Convert)(const ENCODING *enc, + const char **fromP, + const char *fromLim, + unsigned short **toP, + const unsigned short *toLim); int minBytesPerChar; char isUtf8; char isUtf16; @@ -225,66 +216,62 @@ struct encoding { the prolog outside literals, comments and processing instructions. */ - -#define XmlTok(enc, state, ptr, end, nextTokPtr) \ +#define XmlTok(enc, state, ptr, end, nextTokPtr) \ (((enc)->scanners[state])(enc, ptr, end, nextTokPtr)) -#define XmlPrologTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_PROLOG_STATE, ptr, end, nextTokPtr) +#define XmlPrologTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_PROLOG_STATE, ptr, end, nextTokPtr) -#define XmlContentTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_CONTENT_STATE, ptr, end, nextTokPtr) +#define XmlContentTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_CONTENT_STATE, ptr, end, nextTokPtr) -#define XmlCdataSectionTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_CDATA_SECTION_STATE, ptr, end, nextTokPtr) +#define XmlCdataSectionTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_CDATA_SECTION_STATE, ptr, end, nextTokPtr) #ifdef XML_DTD -#define XmlIgnoreSectionTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_IGNORE_SECTION_STATE, ptr, end, nextTokPtr) +# define XmlIgnoreSectionTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_IGNORE_SECTION_STATE, ptr, end, nextTokPtr) #endif /* XML_DTD */ /* This is used for performing a 2nd-level tokenization on the content of a literal that has already been returned by XmlTok. */ -#define XmlLiteralTok(enc, literalType, ptr, end, nextTokPtr) \ +#define XmlLiteralTok(enc, literalType, ptr, end, nextTokPtr) \ (((enc)->literalScanners[literalType])(enc, ptr, end, nextTokPtr)) -#define XmlAttributeValueTok(enc, ptr, end, nextTokPtr) \ - XmlLiteralTok(enc, XML_ATTRIBUTE_VALUE_LITERAL, ptr, end, nextTokPtr) +#define XmlAttributeValueTok(enc, ptr, end, nextTokPtr) \ + XmlLiteralTok(enc, XML_ATTRIBUTE_VALUE_LITERAL, ptr, end, nextTokPtr) -#define XmlEntityValueTok(enc, ptr, end, nextTokPtr) \ - XmlLiteralTok(enc, XML_ENTITY_VALUE_LITERAL, ptr, end, nextTokPtr) +#define XmlEntityValueTok(enc, ptr, end, nextTokPtr) \ + XmlLiteralTok(enc, XML_ENTITY_VALUE_LITERAL, ptr, end, nextTokPtr) -#define XmlNameMatchesAscii(enc, ptr1, end1, ptr2) \ +#define XmlNameMatchesAscii(enc, ptr1, end1, ptr2) \ (((enc)->nameMatchesAscii)(enc, ptr1, end1, ptr2)) -#define XmlNameLength(enc, ptr) \ - (((enc)->nameLength)(enc, ptr)) +#define XmlNameLength(enc, ptr) (((enc)->nameLength)(enc, ptr)) -#define XmlSkipS(enc, ptr) \ - (((enc)->skipS)(enc, ptr)) +#define XmlSkipS(enc, ptr) (((enc)->skipS)(enc, ptr)) -#define XmlGetAttributes(enc, ptr, attsMax, atts) \ +#define XmlGetAttributes(enc, ptr, attsMax, atts) \ (((enc)->getAtts)(enc, ptr, attsMax, atts)) -#define XmlCharRefNumber(enc, ptr) \ - (((enc)->charRefNumber)(enc, ptr)) +#define XmlCharRefNumber(enc, ptr) (((enc)->charRefNumber)(enc, ptr)) -#define XmlPredefinedEntityName(enc, ptr, end) \ +#define XmlPredefinedEntityName(enc, ptr, end) \ (((enc)->predefinedEntityName)(enc, ptr, end)) -#define XmlUpdatePosition(enc, ptr, end, pos) \ +#define XmlUpdatePosition(enc, ptr, end, pos) \ (((enc)->updatePosition)(enc, ptr, end, pos)) -#define XmlIsPublicId(enc, ptr, end, badPtr) \ +#define XmlIsPublicId(enc, ptr, end, badPtr) \ (((enc)->isPublicId)(enc, ptr, end, badPtr)) -#define XmlUtf8Convert(enc, fromP, fromLim, toP, toLim) \ +#define XmlUtf8Convert(enc, fromP, fromLim, toP, toLim) \ (((enc)->utf8Convert)(enc, fromP, fromLim, toP, toLim)) -#define XmlUtf16Convert(enc, fromP, fromLim, toP, toLim) \ +#define XmlUtf16Convert(enc, fromP, fromLim, toP, toLim) \ (((enc)->utf16Convert)(enc, fromP, fromLim, toP, toLim)) typedef struct { @@ -292,16 +279,11 @@ typedef struct { const ENCODING **encPtr; } INIT_ENCODING; -int XmlParseXmlDecl(int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, +int XmlParseXmlDecl(int isGeneralTextEntity, const ENCODING *enc, + const char *ptr, const char *end, const char **badPtr, + const char **versionPtr, const char **versionEndPtr, const char **encodingNamePtr, - const ENCODING **namedEncodingPtr, - int *standalonePtr); + const ENCODING **namedEncodingPtr, int *standalonePtr); int XmlInitEncoding(INIT_ENCODING *, const ENCODING **, const char *name); const ENCODING *XmlGetUtf8InternalEncoding(void); @@ -310,34 +292,22 @@ int FASTCALL XmlUtf8Encode(int charNumber, char *buf); int FASTCALL XmlUtf16Encode(int charNumber, unsigned short *buf); int XmlSizeOfUnknownEncoding(void); +typedef int(XMLCALL *CONVERTER)(void *userData, const char *p); -typedef int (XMLCALL *CONVERTER) (void *userData, const char *p); - -ENCODING * -XmlInitUnknownEncoding(void *mem, - int *table, - CONVERTER convert, - void *userData); +ENCODING *XmlInitUnknownEncoding(void *mem, int *table, CONVERTER convert, + void *userData); -int XmlParseXmlDeclNS(int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, +int XmlParseXmlDeclNS(int isGeneralTextEntity, const ENCODING *enc, + const char *ptr, const char *end, const char **badPtr, + const char **versionPtr, const char **versionEndPtr, const char **encodingNamePtr, - const ENCODING **namedEncodingPtr, - int *standalonePtr); + const ENCODING **namedEncodingPtr, int *standalonePtr); int XmlInitEncodingNS(INIT_ENCODING *, const ENCODING **, const char *name); const ENCODING *XmlGetUtf8InternalEncodingNS(void); const ENCODING *XmlGetUtf16InternalEncodingNS(void); -ENCODING * -XmlInitUnknownEncodingNS(void *mem, - int *table, - CONVERTER convert, - void *userData); +ENCODING *XmlInitUnknownEncodingNS(void *mem, int *table, CONVERTER convert, + void *userData); #ifdef __cplusplus } #endif diff --git a/Modules/expat/xmltok_impl.c b/Modules/expat/xmltok_impl.c index 4d9ae7dc3896b8..c209221cd79d13 100644 --- a/Modules/expat/xmltok_impl.c +++ b/Modules/expat/xmltok_impl.c @@ -32,130 +32,124 @@ #ifdef XML_TOK_IMPL_C -#ifndef IS_INVALID_CHAR -#define IS_INVALID_CHAR(enc, ptr, n) (0) -#endif - -#define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (IS_INVALID_CHAR(enc, ptr, n)) { \ - *(nextTokPtr) = (ptr); \ - return XML_TOK_INVALID; \ - } \ - ptr += n; \ - break; +# ifndef IS_INVALID_CHAR +# define IS_INVALID_CHAR(enc, ptr, n) (0) +# endif + +# define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \ + case BT_LEAD##n: \ + if (end - ptr < n) \ + return XML_TOK_PARTIAL_CHAR; \ + if (IS_INVALID_CHAR(enc, ptr, n)) { \ + *(nextTokPtr) = (ptr); \ + return XML_TOK_INVALID; \ + } \ + ptr += n; \ + break; -#define INVALID_CASES(ptr, nextTokPtr) \ - INVALID_LEAD_CASE(2, ptr, nextTokPtr) \ - INVALID_LEAD_CASE(3, ptr, nextTokPtr) \ - INVALID_LEAD_CASE(4, ptr, nextTokPtr) \ - case BT_NONXML: \ - case BT_MALFORM: \ - case BT_TRAIL: \ - *(nextTokPtr) = (ptr); \ +# define INVALID_CASES(ptr, nextTokPtr) \ + INVALID_LEAD_CASE(2, ptr, nextTokPtr) \ + INVALID_LEAD_CASE(3, ptr, nextTokPtr) \ + INVALID_LEAD_CASE(4, ptr, nextTokPtr) \ + case BT_NONXML: \ + case BT_MALFORM: \ + case BT_TRAIL: \ + *(nextTokPtr) = (ptr); \ return XML_TOK_INVALID; -#define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (!IS_NAME_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - ptr += n; \ - break; - -#define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \ - case BT_NONASCII: \ - if (!IS_NAME_CHAR_MINBPC(enc, ptr)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - /* fall through */ \ - case BT_NMSTRT: \ - case BT_HEX: \ - case BT_DIGIT: \ - case BT_NAME: \ - case BT_MINUS: \ - ptr += MINBPC(enc); \ - break; \ - CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \ - CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \ - CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr) - -#define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (!IS_NMSTRT_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - ptr += n; \ - break; - -#define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \ - case BT_NONASCII: \ - if (!IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - /* fall through */ \ - case BT_NMSTRT: \ - case BT_HEX: \ - ptr += MINBPC(enc); \ - break; \ - CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \ - CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \ - CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr) - -#ifndef PREFIX -#define PREFIX(ident) ident -#endif - - -#define HAS_CHARS(enc, ptr, end, count) \ - (end - ptr >= count * MINBPC(enc)) +# define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \ + case BT_LEAD##n: \ + if (end - ptr < n) \ + return XML_TOK_PARTIAL_CHAR; \ + if (! IS_NAME_CHAR(enc, ptr, n)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; \ + } \ + ptr += n; \ + break; -#define HAS_CHAR(enc, ptr, end) \ - HAS_CHARS(enc, ptr, end, 1) +# define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \ + case BT_NONASCII: \ + if (! IS_NAME_CHAR_MINBPC(enc, ptr)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; \ + } \ + /* fall through */ \ + case BT_NMSTRT: \ + case BT_HEX: \ + case BT_DIGIT: \ + case BT_NAME: \ + case BT_MINUS: \ + ptr += MINBPC(enc); \ + break; \ + CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \ + CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \ + CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr) + +# define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \ + case BT_LEAD##n: \ + if (end - ptr < n) \ + return XML_TOK_PARTIAL_CHAR; \ + if (! IS_NMSTRT_CHAR(enc, ptr, n)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; \ + } \ + ptr += n; \ + break; -#define REQUIRE_CHARS(enc, ptr, end, count) \ - { \ - if (! HAS_CHARS(enc, ptr, end, count)) { \ - return XML_TOK_PARTIAL; \ - } \ +# define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \ + case BT_NONASCII: \ + if (! IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; \ + } \ + /* fall through */ \ + case BT_NMSTRT: \ + case BT_HEX: \ + ptr += MINBPC(enc); \ + break; \ + CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \ + CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \ + CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr) + +# ifndef PREFIX +# define PREFIX(ident) ident +# endif + +# define HAS_CHARS(enc, ptr, end, count) (end - ptr >= count * MINBPC(enc)) + +# define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1) + +# define REQUIRE_CHARS(enc, ptr, end, count) \ + { \ + if (! HAS_CHARS(enc, ptr, end, count)) { \ + return XML_TOK_PARTIAL; \ + } \ } -#define REQUIRE_CHAR(enc, ptr, end) \ - REQUIRE_CHARS(enc, ptr, end, 1) - +# define REQUIRE_CHAR(enc, ptr, end) REQUIRE_CHARS(enc, ptr, end, 1) /* ptr points to character following " */ switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) { - case BT_S: case BT_CR: case BT_LF: case BT_PERCNT: + case BT_S: + case BT_CR: + case BT_LF: + case BT_PERCNT: *nextTokPtr = ptr; return XML_TOK_INVALID; } /* fall through */ - case BT_S: case BT_CR: case BT_LF: + case BT_S: + case BT_CR: + case BT_LF: *nextTokPtr = ptr; return XML_TOK_DECL_OPEN; case BT_NMSTRT: @@ -220,12 +218,12 @@ PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, } static int PTRCALL -PREFIX(checkPiTarget)(const ENCODING *UNUSED_P(enc), const char *ptr, - const char *end, int *tokPtr) -{ +PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end, + int *tokPtr) { int upper = 0; + UNUSED_P(enc); *tokPtr = XML_TOK_PI; - if (end - ptr != MINBPC(enc)*3) + if (end - ptr != MINBPC(enc) * 3) return 1; switch (BYTE_TO_ASCII(enc, ptr)) { case ASCII_x: @@ -265,30 +263,31 @@ PREFIX(checkPiTarget)(const ENCODING *UNUSED_P(enc), const char *ptr, /* ptr points to character following "= end) return XML_TOK_NONE; if (MINBPC(enc) > 1) { @@ -361,11 +359,11 @@ PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, case BT_RSQB: ptr += MINBPC(enc); REQUIRE_CHAR(enc, ptr, end); - if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) + if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB)) break; ptr += MINBPC(enc); REQUIRE_CHAR(enc, ptr, end); - if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { + if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) { ptr -= MINBPC(enc); break; } @@ -381,23 +379,25 @@ PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, case BT_LF: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_DATA_NEWLINE; - INVALID_CASES(ptr, nextTokPtr) + INVALID_CASES(ptr, nextTokPtr) default: ptr += MINBPC(enc); break; } while (HAS_CHAR(enc, ptr, end)) { switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_DATA_CHARS; \ - } \ - ptr += n; \ - break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE +# define LEAD_CASE(n) \ + case BT_LEAD##n: \ + if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_DATA_CHARS; \ + } \ + ptr += n; \ + break; + LEAD_CASE(2) + LEAD_CASE(3) + LEAD_CASE(4) +# undef LEAD_CASE case BT_NONXML: case BT_MALFORM: case BT_TRAIL: @@ -418,23 +418,26 @@ PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, /* ptr points to character following "= end) return XML_TOK_NONE; if (MINBPC(enc) > 1) { @@ -842,48 +843,50 @@ PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end, ptr += MINBPC(enc); if (! HAS_CHAR(enc, ptr, end)) return XML_TOK_TRAILING_RSQB; - if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) + if (! CHAR_MATCHES(enc, ptr, ASCII_RSQB)) break; ptr += MINBPC(enc); if (! HAS_CHAR(enc, ptr, end)) return XML_TOK_TRAILING_RSQB; - if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { + if (! CHAR_MATCHES(enc, ptr, ASCII_GT)) { ptr -= MINBPC(enc); break; } *nextTokPtr = ptr; return XML_TOK_INVALID; - INVALID_CASES(ptr, nextTokPtr) + INVALID_CASES(ptr, nextTokPtr) default: ptr += MINBPC(enc); break; } while (HAS_CHAR(enc, ptr, end)) { switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_DATA_CHARS; \ - } \ - ptr += n; \ - break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE +# define LEAD_CASE(n) \ + case BT_LEAD##n: \ + if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_DATA_CHARS; \ + } \ + ptr += n; \ + break; + LEAD_CASE(2) + LEAD_CASE(3) + LEAD_CASE(4) +# undef LEAD_CASE case BT_RSQB: if (HAS_CHARS(enc, ptr, end, 2)) { - if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) { - ptr += MINBPC(enc); - break; - } - if (HAS_CHARS(enc, ptr, end, 3)) { - if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), ASCII_GT)) { - ptr += MINBPC(enc); - break; - } - *nextTokPtr = ptr + 2*MINBPC(enc); - return XML_TOK_INVALID; - } + if (! CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) { + ptr += MINBPC(enc); + break; + } + if (HAS_CHARS(enc, ptr, end, 3)) { + if (! CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) { + ptr += MINBPC(enc); + break; + } + *nextTokPtr = ptr + 2 * MINBPC(enc); + return XML_TOK_INVALID; + } } /* fall through */ case BT_AMP: @@ -908,12 +911,14 @@ PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end, static int PTRCALL PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ + const char **nextTokPtr) { REQUIRE_CHAR(enc, ptr, end); switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - case BT_S: case BT_LF: case BT_CR: case BT_PERCNT: + CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) + case BT_S: + case BT_LF: + case BT_CR: + case BT_PERCNT: *nextTokPtr = ptr; return XML_TOK_PERCENT; default: @@ -922,7 +927,7 @@ PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end, } while (HAS_CHAR(enc, ptr, end)) { switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) case BT_SEMI: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_PARAM_ENTITY_REF; @@ -936,20 +941,24 @@ PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end, static int PTRCALL PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ + const char **nextTokPtr) { REQUIRE_CHAR(enc, ptr, end); switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) + CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) default: *nextTokPtr = ptr; return XML_TOK_INVALID; } while (HAS_CHAR(enc, ptr, end)) { switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_CR: case BT_LF: case BT_S: - case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR: + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + case BT_CR: + case BT_LF: + case BT_S: + case BT_RPAR: + case BT_GT: + case BT_PERCNT: + case BT_VERBAR: *nextTokPtr = ptr; return XML_TOK_POUND_NAME; default: @@ -961,14 +970,12 @@ PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end, } static int PTRCALL -PREFIX(scanLit)(int open, const ENCODING *enc, - const char *ptr, const char *end, - const char **nextTokPtr) -{ +PREFIX(scanLit)(int open, const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) { while (HAS_CHAR(enc, ptr, end)) { int t = BYTE_TYPE(enc, ptr); switch (t) { - INVALID_CASES(ptr, nextTokPtr) + INVALID_CASES(ptr, nextTokPtr) case BT_QUOT: case BT_APOS: ptr += MINBPC(enc); @@ -978,8 +985,12 @@ PREFIX(scanLit)(int open, const ENCODING *enc, return -XML_TOK_LITERAL; *nextTokPtr = ptr; switch (BYTE_TYPE(enc, ptr)) { - case BT_S: case BT_CR: case BT_LF: - case BT_GT: case BT_PERCNT: case BT_LSQB: + case BT_S: + case BT_CR: + case BT_LF: + case BT_GT: + case BT_PERCNT: + case BT_LSQB: return XML_TOK_LITERAL; default: return XML_TOK_INVALID; @@ -994,8 +1005,7 @@ PREFIX(scanLit)(int open, const ENCODING *enc, static int PTRCALL PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ + const char **nextTokPtr) { int tok; if (ptr >= end) return XML_TOK_NONE; @@ -1013,27 +1023,26 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr); case BT_APOS: return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_LT: - { - ptr += MINBPC(enc); - REQUIRE_CHAR(enc, ptr, end); - switch (BYTE_TYPE(enc, ptr)) { - case BT_EXCL: - return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_QUEST: - return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_NMSTRT: - case BT_HEX: - case BT_NONASCII: - case BT_LEAD2: - case BT_LEAD3: - case BT_LEAD4: - *nextTokPtr = ptr - MINBPC(enc); - return XML_TOK_INSTANCE_START; - } - *nextTokPtr = ptr; - return XML_TOK_INVALID; + case BT_LT: { + ptr += MINBPC(enc); + REQUIRE_CHAR(enc, ptr, end); + switch (BYTE_TYPE(enc, ptr)) { + case BT_EXCL: + return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_QUEST: + return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_NMSTRT: + case BT_HEX: + case BT_NONASCII: + case BT_LEAD2: + case BT_LEAD3: + case BT_LEAD4: + *nextTokPtr = ptr - MINBPC(enc); + return XML_TOK_INSTANCE_START; } + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } case BT_CR: if (ptr + MINBPC(enc) == end) { *nextTokPtr = end; @@ -1041,13 +1050,15 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, return -XML_TOK_PROLOG_S; } /* fall through */ - case BT_S: case BT_LF: + case BT_S: + case BT_LF: for (;;) { ptr += MINBPC(enc); if (! HAS_CHAR(enc, ptr, end)) break; switch (BYTE_TYPE(enc, ptr)) { - case BT_S: case BT_LF: + case BT_S: + case BT_LF: break; case BT_CR: /* don't split CR/LF pair */ @@ -1076,7 +1087,7 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { REQUIRE_CHARS(enc, ptr, end, 2); if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) { - *nextTokPtr = ptr + 2*MINBPC(enc); + *nextTokPtr = ptr + 2 * MINBPC(enc); return XML_TOK_COND_SECT_CLOSE; } } @@ -1099,8 +1110,12 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, case BT_PLUS: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_CLOSE_PAREN_PLUS; - case BT_CR: case BT_LF: case BT_S: - case BT_GT: case BT_COMMA: case BT_VERBAR: + case BT_CR: + case BT_LF: + case BT_S: + case BT_GT: + case BT_COMMA: + case BT_VERBAR: case BT_RPAR: *nextTokPtr = ptr; return XML_TOK_CLOSE_PAREN; @@ -1115,24 +1130,26 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, return XML_TOK_DECL_CLOSE; case BT_NUM: return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr); -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (IS_NMSTRT_CHAR(enc, ptr, n)) { \ - ptr += n; \ - tok = XML_TOK_NAME; \ - break; \ - } \ - if (IS_NAME_CHAR(enc, ptr, n)) { \ - ptr += n; \ - tok = XML_TOK_NMTOKEN; \ - break; \ - } \ - *nextTokPtr = ptr; \ +# define LEAD_CASE(n) \ + case BT_LEAD##n: \ + if (end - ptr < n) \ + return XML_TOK_PARTIAL_CHAR; \ + if (IS_NMSTRT_CHAR(enc, ptr, n)) { \ + ptr += n; \ + tok = XML_TOK_NAME; \ + break; \ + } \ + if (IS_NAME_CHAR(enc, ptr, n)) { \ + ptr += n; \ + tok = XML_TOK_NMTOKEN; \ + break; \ + } \ + *nextTokPtr = ptr; \ return XML_TOK_INVALID; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE + LEAD_CASE(2) + LEAD_CASE(3) + LEAD_CASE(4) +# undef LEAD_CASE case BT_NMSTRT: case BT_HEX: tok = XML_TOK_NAME; @@ -1141,9 +1158,9 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, case BT_DIGIT: case BT_NAME: case BT_MINUS: -#ifdef XML_NS +# ifdef XML_NS case BT_COLON: -#endif +# endif tok = XML_TOK_NMTOKEN; ptr += MINBPC(enc); break; @@ -1165,13 +1182,19 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, } while (HAS_CHAR(enc, ptr, end)) { switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_GT: case BT_RPAR: case BT_COMMA: - case BT_VERBAR: case BT_LSQB: case BT_PERCNT: - case BT_S: case BT_CR: case BT_LF: + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + case BT_GT: + case BT_RPAR: + case BT_COMMA: + case BT_VERBAR: + case BT_LSQB: + case BT_PERCNT: + case BT_S: + case BT_CR: + case BT_LF: *nextTokPtr = ptr; return tok; -#ifdef XML_NS +# ifdef XML_NS case BT_COLON: ptr += MINBPC(enc); switch (tok) { @@ -1179,7 +1202,7 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, REQUIRE_CHAR(enc, ptr, end); tok = XML_TOK_PREFIXED_NAME; switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) default: tok = XML_TOK_NMTOKEN; break; @@ -1190,23 +1213,23 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, break; } break; -#endif +# endif case BT_PLUS: - if (tok == XML_TOK_NMTOKEN) { + if (tok == XML_TOK_NMTOKEN) { *nextTokPtr = ptr; return XML_TOK_INVALID; } *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_NAME_PLUS; case BT_AST: - if (tok == XML_TOK_NMTOKEN) { + if (tok == XML_TOK_NMTOKEN) { *nextTokPtr = ptr; return XML_TOK_INVALID; } *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_NAME_ASTERISK; case BT_QUEST: - if (tok == XML_TOK_NMTOKEN) { + if (tok == XML_TOK_NMTOKEN) { *nextTokPtr = ptr; return XML_TOK_INVALID; } @@ -1221,9 +1244,8 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, } static int PTRCALL -PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ +PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) { const char *start; if (ptr >= end) return XML_TOK_NONE; @@ -1238,10 +1260,14 @@ PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, start = ptr; while (HAS_CHAR(enc, ptr, end)) { switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: ptr += n; break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE +# define LEAD_CASE(n) \ + case BT_LEAD##n: \ + ptr += n; \ + break; + LEAD_CASE(2) + LEAD_CASE(3) + LEAD_CASE(4) +# undef LEAD_CASE case BT_AMP: if (ptr == start) return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); @@ -1287,9 +1313,8 @@ PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, } static int PTRCALL -PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ +PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) { const char *start; if (ptr >= end) return XML_TOK_NONE; @@ -1304,10 +1329,14 @@ PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, start = ptr; while (HAS_CHAR(enc, ptr, end)) { switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: ptr += n; break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE +# define LEAD_CASE(n) \ + case BT_LEAD##n: \ + ptr += n; \ + break; + LEAD_CASE(2) + LEAD_CASE(3) + LEAD_CASE(4) +# undef LEAD_CASE case BT_AMP: if (ptr == start) return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); @@ -1315,8 +1344,7 @@ PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, return XML_TOK_DATA_CHARS; case BT_PERCNT: if (ptr == start) { - int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), - end, nextTokPtr); + int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr); return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok; } *nextTokPtr = ptr; @@ -1349,12 +1377,11 @@ PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, return XML_TOK_DATA_CHARS; } -#ifdef XML_DTD +# ifdef XML_DTD static int PTRCALL -PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ +PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) { int level = 0; if (MINBPC(enc) > 1) { size_t n = end - ptr; @@ -1365,7 +1392,7 @@ PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, } while (HAS_CHAR(enc, ptr, end)) { switch (BYTE_TYPE(enc, ptr)) { - INVALID_CASES(ptr, nextTokPtr) + INVALID_CASES(ptr, nextTokPtr) case BT_LT: ptr += MINBPC(enc); REQUIRE_CHAR(enc, ptr, end); @@ -1402,12 +1429,11 @@ PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, return XML_TOK_PARTIAL; } -#endif /* XML_DTD */ +# endif /* XML_DTD */ static int PTRCALL PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, - const char **badPtr) -{ + const char **badPtr) { ptr += MINBPC(enc); end -= MINBPC(enc); for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) { @@ -1430,9 +1456,9 @@ PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, case BT_AST: case BT_PERCNT: case BT_NUM: -#ifdef XML_NS +# ifdef XML_NS case BT_COLON: -#endif +# endif break; case BT_S: if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) { @@ -1442,7 +1468,7 @@ PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, break; case BT_NAME: case BT_NMSTRT: - if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f)) + if (! (BYTE_TO_ASCII(enc, ptr) & ~0x7f)) break; /* fall through */ default: @@ -1466,9 +1492,8 @@ PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, */ static int PTRCALL -PREFIX(getAtts)(const ENCODING *enc, const char *ptr, - int attsMax, ATTRIBUTE *atts) -{ +PREFIX(getAtts)(const ENCODING *enc, const char *ptr, int attsMax, + ATTRIBUTE *atts) { enum { other, inName, inValue } state = inName; int nAtts = 0; int open = 0; /* defined when state == inValue; @@ -1476,32 +1501,35 @@ PREFIX(getAtts)(const ENCODING *enc, const char *ptr, for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) { switch (BYTE_TYPE(enc, ptr)) { -#define START_NAME \ - if (state == other) { \ - if (nAtts < attsMax) { \ - atts[nAtts].name = ptr; \ - atts[nAtts].normalized = 1; \ - } \ - state = inName; \ - } -#define LEAD_CASE(n) \ - case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE +# define START_NAME \ + if (state == other) { \ + if (nAtts < attsMax) { \ + atts[nAtts].name = ptr; \ + atts[nAtts].normalized = 1; \ + } \ + state = inName; \ + } +# define LEAD_CASE(n) \ + case BT_LEAD##n: \ + START_NAME ptr += (n - MINBPC(enc)); \ + break; + LEAD_CASE(2) + LEAD_CASE(3) + LEAD_CASE(4) +# undef LEAD_CASE case BT_NONASCII: case BT_NMSTRT: case BT_HEX: START_NAME break; -#undef START_NAME +# undef START_NAME case BT_QUOT: if (state != inValue) { if (nAtts < attsMax) atts[nAtts].valuePtr = ptr + MINBPC(enc); state = inValue; open = BT_QUOT; - } - else if (open == BT_QUOT) { + } else if (open == BT_QUOT) { state = other; if (nAtts < attsMax) atts[nAtts].valueEnd = ptr; @@ -1514,8 +1542,7 @@ PREFIX(getAtts)(const ENCODING *enc, const char *ptr, atts[nAtts].valuePtr = ptr + MINBPC(enc); state = inValue; open = BT_APOS; - } - else if (open == BT_APOS) { + } else if (open == BT_APOS) { state = other; if (nAtts < attsMax) atts[nAtts].valueEnd = ptr; @@ -1529,16 +1556,15 @@ PREFIX(getAtts)(const ENCODING *enc, const char *ptr, case BT_S: if (state == inName) state = other; - else if (state == inValue - && nAtts < attsMax - && atts[nAtts].normalized + else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized && (ptr == atts[nAtts].valuePtr || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open)) atts[nAtts].normalized = 0; break; - case BT_CR: case BT_LF: + case BT_CR: + case BT_LF: /* This case ensures that the first attribute name is counted Apart from that we could just change state on the quote. */ if (state == inName) @@ -1559,29 +1585,44 @@ PREFIX(getAtts)(const ENCODING *enc, const char *ptr, } static int PTRFASTCALL -PREFIX(charRefNumber)(const ENCODING *UNUSED_P(enc), const char *ptr) -{ +PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) { int result = 0; /* skip &# */ - ptr += 2*MINBPC(enc); + UNUSED_P(enc); + ptr += 2 * MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_x)) { - for (ptr += MINBPC(enc); - !CHAR_MATCHES(enc, ptr, ASCII_SEMI); + for (ptr += MINBPC(enc); ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) { int c = BYTE_TO_ASCII(enc, ptr); switch (c) { - case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4: - case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9: + case ASCII_0: + case ASCII_1: + case ASCII_2: + case ASCII_3: + case ASCII_4: + case ASCII_5: + case ASCII_6: + case ASCII_7: + case ASCII_8: + case ASCII_9: result <<= 4; result |= (c - ASCII_0); break; - case ASCII_A: case ASCII_B: case ASCII_C: - case ASCII_D: case ASCII_E: case ASCII_F: + case ASCII_A: + case ASCII_B: + case ASCII_C: + case ASCII_D: + case ASCII_E: + case ASCII_F: result <<= 4; result += 10 + (c - ASCII_A); break; - case ASCII_a: case ASCII_b: case ASCII_c: - case ASCII_d: case ASCII_e: case ASCII_f: + case ASCII_a: + case ASCII_b: + case ASCII_c: + case ASCII_d: + case ASCII_e: + case ASCII_f: result <<= 4; result += 10 + (c - ASCII_a); break; @@ -1589,9 +1630,8 @@ PREFIX(charRefNumber)(const ENCODING *UNUSED_P(enc), const char *ptr) if (result >= 0x110000) return -1; } - } - else { - for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) { + } else { + for (; ! CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) { int c = BYTE_TO_ASCII(enc, ptr); result *= 10; result += (c - ASCII_0); @@ -1603,10 +1643,10 @@ PREFIX(charRefNumber)(const ENCODING *UNUSED_P(enc), const char *ptr) } static int PTRCALL -PREFIX(predefinedEntityName)(const ENCODING *UNUSED_P(enc), const char *ptr, - const char *end) -{ - switch ((end - ptr)/MINBPC(enc)) { +PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, + const char *end) { + UNUSED_P(enc); + switch ((end - ptr) / MINBPC(enc)) { case 2: if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) { switch (BYTE_TO_ASCII(enc, ptr)) { @@ -1657,9 +1697,9 @@ PREFIX(predefinedEntityName)(const ENCODING *UNUSED_P(enc), const char *ptr, } static int PTRCALL -PREFIX(nameMatchesAscii)(const ENCODING *UNUSED_P(enc), const char *ptr1, - const char *end1, const char *ptr2) -{ +PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1, + const char *end1, const char *ptr2) { + UNUSED_P(enc); for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) { if (end1 - ptr1 < MINBPC(enc)) { /* This line cannot be executed. The incoming data has already @@ -1669,27 +1709,30 @@ PREFIX(nameMatchesAscii)(const ENCODING *UNUSED_P(enc), const char *ptr1, */ return 0; /* LCOV_EXCL_LINE */ } - if (!CHAR_MATCHES(enc, ptr1, *ptr2)) + if (! CHAR_MATCHES(enc, ptr1, *ptr2)) return 0; } return ptr1 == end1; } static int PTRFASTCALL -PREFIX(nameLength)(const ENCODING *enc, const char *ptr) -{ +PREFIX(nameLength)(const ENCODING *enc, const char *ptr) { const char *start = ptr; for (;;) { switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: ptr += n; break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE +# define LEAD_CASE(n) \ + case BT_LEAD##n: \ + ptr += n; \ + break; + LEAD_CASE(2) + LEAD_CASE(3) + LEAD_CASE(4) +# undef LEAD_CASE case BT_NONASCII: case BT_NMSTRT: -#ifdef XML_NS +# ifdef XML_NS case BT_COLON: -#endif +# endif case BT_HEX: case BT_DIGIT: case BT_NAME: @@ -1702,9 +1745,8 @@ PREFIX(nameLength)(const ENCODING *enc, const char *ptr) } } -static const char * PTRFASTCALL -PREFIX(skipS)(const ENCODING *enc, const char *ptr) -{ +static const char *PTRFASTCALL +PREFIX(skipS)(const ENCODING *enc, const char *ptr) { for (;;) { switch (BYTE_TYPE(enc, ptr)) { case BT_LF: @@ -1719,19 +1761,18 @@ PREFIX(skipS)(const ENCODING *enc, const char *ptr) } static void PTRCALL -PREFIX(updatePosition)(const ENCODING *enc, - const char *ptr, - const char *end, - POSITION *pos) -{ +PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end, + POSITION *pos) { while (HAS_CHAR(enc, ptr, end)) { switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - ptr += n; \ - break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE +# define LEAD_CASE(n) \ + case BT_LEAD##n: \ + ptr += n; \ + break; + LEAD_CASE(2) + LEAD_CASE(3) + LEAD_CASE(4) +# undef LEAD_CASE case BT_LF: pos->columnNumber = (XML_Size)-1; pos->lineNumber++; @@ -1752,12 +1793,12 @@ PREFIX(updatePosition)(const ENCODING *enc, } } -#undef DO_LEAD_CASE -#undef MULTIBYTE_CASES -#undef INVALID_CASES -#undef CHECK_NAME_CASE -#undef CHECK_NAME_CASES -#undef CHECK_NMSTRT_CASE -#undef CHECK_NMSTRT_CASES +# undef DO_LEAD_CASE +# undef MULTIBYTE_CASES +# undef INVALID_CASES +# undef CHECK_NAME_CASE +# undef CHECK_NAME_CASES +# undef CHECK_NMSTRT_CASE +# undef CHECK_NMSTRT_CASES #endif /* XML_TOK_IMPL_C */ diff --git a/Modules/expat/xmltok_impl.h b/Modules/expat/xmltok_impl.h index a6420f48eedc04..e925dbc7e2c833 100644 --- a/Modules/expat/xmltok_impl.h +++ b/Modules/expat/xmltok_impl.h @@ -31,43 +31,43 @@ */ enum { - BT_NONXML, - BT_MALFORM, - BT_LT, - BT_AMP, - BT_RSQB, - BT_LEAD2, - BT_LEAD3, - BT_LEAD4, - BT_TRAIL, - BT_CR, - BT_LF, - BT_GT, - BT_QUOT, - BT_APOS, - BT_EQUALS, - BT_QUEST, - BT_EXCL, - BT_SOL, - BT_SEMI, - BT_NUM, - BT_LSQB, - BT_S, - BT_NMSTRT, - BT_COLON, - BT_HEX, - BT_DIGIT, - BT_NAME, - BT_MINUS, - BT_OTHER, /* known not to be a name or name start character */ + BT_NONXML, /* e.g. noncharacter-FFFF */ + BT_MALFORM, /* illegal, with regard to encoding */ + BT_LT, /* less than = "<" */ + BT_AMP, /* ampersand = "&" */ + BT_RSQB, /* right square bracket = "[" */ + BT_LEAD2, /* lead byte of a 2-byte UTF-8 character */ + BT_LEAD3, /* lead byte of a 3-byte UTF-8 character */ + BT_LEAD4, /* lead byte of a 4-byte UTF-8 character */ + BT_TRAIL, /* trailing unit, e.g. second 16-bit unit of a 4-byte char. */ + BT_CR, /* carriage return = "\r" */ + BT_LF, /* line feed = "\n" */ + BT_GT, /* greater than = ">" */ + BT_QUOT, /* quotation character = "\"" */ + BT_APOS, /* aposthrophe = "'" */ + BT_EQUALS, /* equal sign = "=" */ + BT_QUEST, /* question mark = "?" */ + BT_EXCL, /* exclamation mark = "!" */ + BT_SOL, /* solidus, slash = "/" */ + BT_SEMI, /* semicolon = ";" */ + BT_NUM, /* number sign = "#" */ + BT_LSQB, /* left square bracket = "[" */ + BT_S, /* white space, e.g. "\t", " "[, "\r"] */ + BT_NMSTRT, /* non-hex name start letter = "G".."Z" + "g".."z" + "_" */ + BT_COLON, /* colon = ":" */ + BT_HEX, /* hex letter = "A".."F" + "a".."f" */ + BT_DIGIT, /* digit = "0".."9" */ + BT_NAME, /* dot and middle dot = "." + chr(0xb7) */ + BT_MINUS, /* minus = "-" */ + BT_OTHER, /* known not to be a name or name start character */ BT_NONASCII, /* might be a name or name start character */ - BT_PERCNT, - BT_LPAR, - BT_RPAR, - BT_AST, - BT_PLUS, - BT_COMMA, - BT_VERBAR + BT_PERCNT, /* percent sign = "%" */ + BT_LPAR, /* left parenthesis = "(" */ + BT_RPAR, /* right parenthesis = "(" */ + BT_AST, /* asterisk = "*" */ + BT_PLUS, /* plus sign = "+" */ + BT_COMMA, /* comma = "," */ + BT_VERBAR /* vertical bar = "|" */ }; #include diff --git a/Modules/expat/xmltok_ns.c b/Modules/expat/xmltok_ns.c index 23d31e8e424916..919c74e9f97fe8 100644 --- a/Modules/expat/xmltok_ns.c +++ b/Modules/expat/xmltok_ns.c @@ -33,56 +33,47 @@ #ifdef XML_TOK_NS_C const ENCODING * -NS(XmlGetUtf8InternalEncoding)(void) -{ +NS(XmlGetUtf8InternalEncoding)(void) { return &ns(internal_utf8_encoding).enc; } const ENCODING * -NS(XmlGetUtf16InternalEncoding)(void) -{ -#if BYTEORDER == 1234 +NS(XmlGetUtf16InternalEncoding)(void) { +# if BYTEORDER == 1234 return &ns(internal_little2_encoding).enc; -#elif BYTEORDER == 4321 +# elif BYTEORDER == 4321 return &ns(internal_big2_encoding).enc; -#else +# else const short n = 1; - return (*(const char *)&n - ? &ns(internal_little2_encoding).enc - : &ns(internal_big2_encoding).enc); -#endif + return (*(const char *)&n ? &ns(internal_little2_encoding).enc + : &ns(internal_big2_encoding).enc); +# endif } -static const ENCODING * const NS(encodings)[] = { - &ns(latin1_encoding).enc, - &ns(ascii_encoding).enc, - &ns(utf8_encoding).enc, - &ns(big2_encoding).enc, - &ns(big2_encoding).enc, - &ns(little2_encoding).enc, - &ns(utf8_encoding).enc /* NO_ENC */ +static const ENCODING *const NS(encodings)[] = { + &ns(latin1_encoding).enc, &ns(ascii_encoding).enc, + &ns(utf8_encoding).enc, &ns(big2_encoding).enc, + &ns(big2_encoding).enc, &ns(little2_encoding).enc, + &ns(utf8_encoding).enc /* NO_ENC */ }; static int PTRCALL NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - return initScan(NS(encodings), (const INIT_ENCODING *)enc, - XML_PROLOG_STATE, ptr, end, nextTokPtr); + const char **nextTokPtr) { + return initScan(NS(encodings), (const INIT_ENCODING *)enc, XML_PROLOG_STATE, + ptr, end, nextTokPtr); } static int PTRCALL NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - return initScan(NS(encodings), (const INIT_ENCODING *)enc, - XML_CONTENT_STATE, ptr, end, nextTokPtr); + const char **nextTokPtr) { + return initScan(NS(encodings), (const INIT_ENCODING *)enc, XML_CONTENT_STATE, + ptr, end, nextTokPtr); } int NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr, - const char *name) -{ + const char *name) { int i = getEncodingIndex(name); if (i == UNKNOWN_ENC) return 0; @@ -96,9 +87,8 @@ NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr, } static const ENCODING * -NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) -{ -#define ENCODING_MAX 128 +NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) { +# define ENCODING_MAX 128 char buf[ENCODING_MAX]; char *p = buf; int i; @@ -115,28 +105,14 @@ NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) } int -NS(XmlParseXmlDecl)(int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, - const char **encodingName, - const ENCODING **encoding, - int *standalone) -{ - return doParseXmlDecl(NS(findEncoding), - isGeneralTextEntity, - enc, - ptr, - end, - badPtr, - versionPtr, - versionEndPtr, - encodingName, - encoding, - standalone); +NS(XmlParseXmlDecl)(int isGeneralTextEntity, const ENCODING *enc, + const char *ptr, const char *end, const char **badPtr, + const char **versionPtr, const char **versionEndPtr, + const char **encodingName, const ENCODING **encoding, + int *standalone) { + return doParseXmlDecl(NS(findEncoding), isGeneralTextEntity, enc, ptr, end, + badPtr, versionPtr, versionEndPtr, encodingName, + encoding, standalone); } #endif /* XML_TOK_NS_C */ diff --git a/PCbuild/_elementtree.vcxproj b/PCbuild/_elementtree.vcxproj index 0db61f208183d7..639ba479db5786 100644 --- a/PCbuild/_elementtree.vcxproj +++ b/PCbuild/_elementtree.vcxproj @@ -87,7 +87,6 @@ - diff --git a/PCbuild/_elementtree.vcxproj.filters b/PCbuild/_elementtree.vcxproj.filters index 4597ee521b3331..6acdf35846ab14 100644 --- a/PCbuild/_elementtree.vcxproj.filters +++ b/PCbuild/_elementtree.vcxproj.filters @@ -33,9 +33,6 @@ Header Files - - Header Files - Header Files diff --git a/PCbuild/pyexpat.vcxproj b/PCbuild/pyexpat.vcxproj index 51ca69e95d705e..9a765ff07bde88 100644 --- a/PCbuild/pyexpat.vcxproj +++ b/PCbuild/pyexpat.vcxproj @@ -68,7 +68,6 @@ - diff --git a/PCbuild/pyexpat.vcxproj.filters b/PCbuild/pyexpat.vcxproj.filters index cb02847980c634..f8d46026c9c284 100644 --- a/PCbuild/pyexpat.vcxproj.filters +++ b/PCbuild/pyexpat.vcxproj.filters @@ -20,9 +20,6 @@ Source Files - - Source Files - Source Files From 1698cacfb924d1df452e78d11a4bf81ae7777389 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 28 Sep 2019 09:33:00 +0200 Subject: [PATCH 2164/2287] bpo-38243, xmlrpc.server: Escape the server_title (GH-16373) (GH-16441) Escape the server title of xmlrpc.server.DocXMLRPCServer when rendering the document page as HTML. (cherry picked from commit e8650a4f8c7fb76f570d4ca9c1fbe44e91c8dfaa) --- Lib/test/test_docxmlrpc.py | 16 ++++++++++++++++ Lib/xmlrpc/server.py | 3 ++- .../2019-09-25-13-21-09.bpo-38243.1pfz24.rst | 3 +++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Security/2019-09-25-13-21-09.bpo-38243.1pfz24.rst diff --git a/Lib/test/test_docxmlrpc.py b/Lib/test/test_docxmlrpc.py index 00903337c07c21..d2adb21af0fb34 100644 --- a/Lib/test/test_docxmlrpc.py +++ b/Lib/test/test_docxmlrpc.py @@ -1,5 +1,6 @@ from xmlrpc.server import DocXMLRPCServer import http.client +import re import sys from test import support threading = support.import_module('threading') @@ -193,6 +194,21 @@ def test_annotations(self): b'method_annotation(x: bytes)

    }(b2^fdO=Ei)Ikgt6j3I(=?p8L3# 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 fgBlk;bj&!-*ijA0&8up|$WoXpU1t diff --git a/Lib/ensurepip/_bundled/pip-18.1-py2.py3-none-any.whl b/Lib/ensurepip/_bundled/pip-18.1-py2.py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..c3c146f6da272399a19fd6e21364a4f45066cec7 GIT binary patch literal 1323545 zcmZs?Q;aTLur2zvZQERJ+qP}nwr$(CZM#?7wpQCZe{OQ`-pRQ$sfYP89;%WWW7Mpv zAPoYF3IG5g0Uw&8vXraTk{JKp(EbaA|H8r2fnHzV($3OFU!TswGdiALnwENQWi$#+)`;|Wu2Lb@>f&Vv#t)Zpe|AV2c$Y?jr0K5GR4UBb- zTDin25EiE!{V&K$no&_xNfg`8PhYAru_aIBAvYS#S}BQu74)bAO! zJ*(1HzmgkKbtNkZdw6sha_tFcNKCr@sG>mAmQ{iQSdcpldol-_9y%=i&`(CaT$x`o+>KA4urf}n1bg*=g8KD^{aoU; z6v2X5bh_#_!!ocSrv~IOzF0yzj7TC7vm}L_fDOK|19(cvL|e65cj@LcBcaX)8G3V7 zL!|Dl0GZY9)F&-GrY{S41)8=Oa+|=3l&E_D`6S^{*Q?!|UoU5a{`wl(b`%2J)0Y#4 z&=;wd7LlGM%ysAudz9%N1IQ{MQ$y9b6Y+NS^w#(ZFDdIfE5M+!1{mdW@+bQ>SSkV^S>*Ys%C4y#fJD(r|;;jAOeoN z@-NH|(#$|RyAWuRG@|=iSP`QWvI|_-6e^gl3GX0 zRur`*2=?<%-rD*7QJ0qoqmKupmp?S2t)Ki>I#Pu&#@W*6HA+tJ%rj9N^n{n#)(o}j zVlZHJ)*y3J8V+S2*W@8>*E|zw61}YXk{sz^=)M4rcnZQvq)JqYGcM4?9$@={ckEiz zn*cF`#S7;s?>{BT(xL(e_tN2W+~+Q)F0{petoE`UCJ&r31OrNXQl){nGP;yGfHv9S zHVs^8bsqu-_G%sP%q?jpEpK<%;#emEtAo>QR4|V264SjAuG8L- z!;A$$hCTP_?E0A-45Yx0}>8j_yMT<5RI74w935QBOr&X~J(l!#o;Z+IBo(O}as5T$*dgT676<`giDrq(mjv!ib&(7*gFXWB^UfG1a1!^#%bGSms1I^4k$8?p{sL4occD=0a zMonDrk%lVbDW8OsF>j~>)1B;vnnRvEy7Rq4Tbcf=$4gUpYd5{+zx(6*4Co(za%9Vu zyRb)#eXzgd{O*&k?duKS7xMM3x(!%>$RQBr3G5cth{?}_=EQso(<#~er9n+JE?wSD z=~aH`;JyU=2ud?kQKZt0n9H8B(F)y$A2#66IecYdXOWvy(-2p=Tp6k(9fc!%FVXvA zanapOZ>{;F3bn_1)@vh@EHB}vUm=uWo?7%UIZA&_Dm64(6~%nCfHU* z=?dtBHVk+B35;~AH8#aR1WO!~8e1bOwaNQ8S|sR?GWXE5Y$W`8l`%esqd7k4hE2)T z!2U}ze93~FIb)>*q|S=b=J=?cRnLo3nfn&8l_ihx1yla`*SclfFGJUFMyVLPHwkW| zaC!nC!?@$cljSe2`^2!ht?XJ25jn-;w?w$a4bKjRX}z`>=c%j1QAFLvwdA;3Hdl!o zvRdz&{5rM~zPWg9W(2y}gRv{%$l{1s`?`iSy0|(#ygOXl<5cV}#&moyowcsOG7^5P zTdWZO7I&56WM}|>)li}SmXX%cewUp>r`!5HkGqL-a-#=GNuY8MWVye(I zdg~HAzwFB0EMWq5Pk)EUs;|dWGvKo``J`okUee0|7jO{B#CSb?TCyA~*;iT9P;KVw zk9i+uR~2$(0Q>)Hrbe!oHYWO}c5eUiVXgXB+<)EF_f;M79|)NWa?+Y8980<_O2InlWSM9q zE2t*6cjm-@y;KiJ@TZq~IX3Bfwygr7jm+w7#^FwvKAql53FAhKAoQmb!cx<=z(Bh+ zlc8#+Mj;8U72RoEhA74q=Wt+c)TvX4W~5JPvq|a3t!1^3dWknPS<|LEy4Qy5|Hxh+q#NLipLOJt>NOpMCC^0>g zamI7W*{pyqU(vy%)xe{0SkH2TW|J}*Y|ET!tMhDi<=p)ac#xXBq_N|6?5rkW%0&R? zRbe2lv;)O(iG@MIPFvDt!8++>RU;M-so*(!Wf5qc(iKb3K*p)u36TxiU+h!8;HENN zUXU@hc5qcoE-_+p4QB!b1C@OPNT;XpaEi26cj67m|M&0(E`B{W2{G@;sn93#b$*Ne z)~+v@5RIG&ye2dnlKqy?x98{X{^rItehH*iPg>S5{vaMvM{8~*4J<;GXjpAlYodT< zz@s#VqbxP7mg4~nHfxShB0pddliw&@CVOQqFP^S%685gzOnw9{mR}vyE?u(EGn=s! zJ(Ud1$M>H{_uN`=-&W*Rofs1Y_bw~G4vAU#4~ef^cQCa67zZz`=2d_2A ziCqSYeC*y-2O^E{7~kOzk>lie??_}$zZifnU_QdrN+dU(Gh{wzy&7g@DF1PEql%+C zbi6N295&9=N*;|xKD@>zolP&5lohk8ES&L}Z0edaIBODyC0uIiKHW;lk$H?-eeXZ%C#9TW8Sta^eCVp6RmZG z?;s_2JZz=>omdw$3xRy&Pz2dSnIvif9C!qJcp8X%!!b#fqYo|4S}a-;G&L8#_>8eX ze2v^$n(eLcD#_eO9tRXJHV3DXSFV`@!b>pm0lqdcy|sjksYdq1tDY5aY^<_>Es{7VPLG5KQqNr zgiG&^5eO>88yvg>IMJsiW}d!&|JT#i`hLsS+!PPr-QWzW!rPXy_OO~wD>YRcFr8`_ z5^^{FMZJmVr5*)Z{ei7{`HU7G3% z*+k@B>kEZqF8c9?OA$MNg3T9}LD(}4*BMjLG3)n`3|wvhhBFr4f!p}b*=K}Y5|tJO zRE8}f?eF`-doh46-aAX&9I%fj6DkGG$Ya1A1ap>o7+BRJ)6qG|^tX7wT&)TmbVd1_ z!FNTCG3CT$w>AbPH~R<(HGFLsr^e8#*sAxNVE$1Y@3p!e7W@?Jtu_n4xfpV|_6vk# zRzv%9cZc2mbIi1g*Gz?4mLtz^s$MaRGS|Y~ns5amK<{~a}6!v0nD zVxpj9Rm(ER?FZ<86nO?Rg)9KBLNXo_0I2f%$xN4|rEK1VKJJ~VDiWmFm?!UO5@6F- zY1Gj7d6k|xy(iPSNqrH=Zddg(%^G#;(4l+jYp+3`#*3@+E zzS6XD5<9D{o{O@#rKHMN-Qs!f-ZS`nCbE%H)8JikZMt%%mDTh-rMtUO;hUSj`RvWN z|89PxvY_G4(|*&STyCUtjYB)Fg=xBX-|+g9Z{Y%MuQH1+7x zsDYaLq~|b)-2D@hymS>hfS~!=jpTHLLjfa_agrCcxgoAg9iO0_H9e;hn;Pp{loE?- z!yXEUWup7kU00g?*$}JKhfdJ2rx`6{FB1IwuFAFtsP*1B4rPsPUTFT6cZ%;PMU5_*4wO zNmGCeWrI(Y?rlKuDbmLA zoWiEW`E#{{lc6TzwaTDs?+&^e-+*2Zq!vIcP;Yn;o2(u7u1K)*=Aa`eO1IWVHeMS~ z2R;McDE#t|(g6#1f(jUM&b#+Dm}e@sw8EAl2JZT9(?96sEvscu0z z>0~x3IDcC(GZJO};BOc#36ip_b||KL-rr{CsBSde>d;r@c$UL8f!U-59!O}$r`5_bSMmxjL40MaCrvctIVn&x)OGm~frL3n6kxr<3KJ)s^SGIT z-7b_!jpxo+lYxeeu~%28k0)X`{9REw1RA;=7iX!fq{#H)u|}Aj3r-QA2ds1XVg}yV z9tz=-)0^N*EILJD-Q$)6J%?0Jd2_mr@mSDq=P1)5U6Tac?fV)&>Fs592`!<^F}O?T z!b`EQkDpb}ZOH*Bi&qseo*}IxsW&Jk%`>PS>0vOffUbryPtx4SPMiYiRKVRmYT13X51TwCd&z zGbncpsDNS<8^lmWlqGTOFKU-@5Ul+!UyTR@AkvaAecLkuClLtTj5nqlu{a<3#s%() zv6hhPKdU~#$}H$)3oN6*<%uhzr6rcuZ7fVNLQFG+x2&DBOVXI)Z}u#)E;isEGs+5> z9Bi~S0$VKjv+yV@{_@%K8V}nAC__9TiP0`!(^N#Vzw&FOQLx1i4d3H&`YhYW5y{`k zFw)MbBSk)uN@h*#a9;P8B*YtZ7=Od04b*1(?hHV4UTjwqw-@F>daG-E3*xrpd^svM zECCl5SL1fXLP}_lrZz?0@y6qZ(vN>VV0&8X_H*>qr2+;$2=5D~TRvIS61Z_}up_A! zNnRyniiuli3cFCaJ=u2+FM%^Kes-#4w#~L=Oy;@nA~c;W{guPs{q)mZOb8_wbfg%y z+p$rKuV>46`AzsuG{xu-h-=6a!$P}prxQ5J5=hEH(nSpf`zVKw?`_B9?k^~sO^kpA+EwzMb=FCBMHS_Wy)I-3RC7;c zl?|@Zg^T7`))HvA+*Go6zn}fSJlwQFz>51=Z*d%9vio5$l{rRNO0xe9i~*6=ox>1l zja@Tu-SfA#PxHp&;qr0p%Jj3615O{zDkoCQaktBT9+-Ly2w~X9QMAspnk{^KE$3Vo zOLMy&>P+cOV@5YgRmEF~awU9U_E z*=$4o)Tnt10sv3dkQJQgJI|*D&20ZN46@Gyl){T{`mJniq<4r23(Y?dZ;Xm_?SEv* zpUfQ!eqbzS0?Q&{+`9-=4*)F@g?RHkoNL8K88>dlgqajGhHR@m%s_C2?aCr7FM8pw$=1pgyp zq>Dsk(PrHvRsWj;cQXS3`2V+rv9~j`GU zq|{g|GH5n{AsI<$!sHGVaOc@OE^~iPcdVWWJ!qNOP+YMdg-uX-)4wpBL;C?jXKQJ; zAvNGX%yBvl}fWh=JNu-^3%3>x~Z>j zM@%P~6J^DY3RxZEL8On3Mln8@8#0RcC~6S9?*cc`!6Zm`&@&Y-a#fzuk5#v2BSO+z z@5Zm7KqR-pNW(lgSDDr(#V$jQrBJ=9MY1H)+=ruCtcs=YXvxy6OYNvsoLOPesKZ^(Tmf zCEY4HhV~XhF0=-LEhZ0v~9miNXu@q z>aFhzZQjj2ZuSs%F?yCIo`9g1WCX1N%U?g`PvGuFm1%Dnh1G-F@(FZxP_k5Cvp}D7|!snopLA@ zPke|Dlb=k6)e(#sv6zS#*)b#eA zc4I*cH-gMKFU2!4&wbqeUhe3HIG@YASo7v*d1b(dEPpaWmL|69=+AA#dF1nT zb@I9oF1jh|Eujlo9PPqCrF(?mAOx?FrYsVJ_k}TIrnmHoOf=quJHG(`K#sm4*U-$3 zz8_=nDojtCUJn$xndP7VI%0)|1Xtt$CD z`v7ncSu6XfS)z0kh9N@65d)4d=sf$GWv;He)Ph;;L~R&arf~5Z%g97AV^HAPwi2$@ zqI}If5cG>SP;+B}&PWjfz|QG!tEfR;Zugm7bs8+j?bL}s;6tNL|s zQ!ZG^QDKR}9763L4~$a^4n20t#aSq5r2J@2k?cLtKnR7e|2=SL=kevmkN3VGB)?!t zaXNZ|3bN_r%oZLF9rW#Q-Ohqyl$cjszfUlOjp#^F4BA2(FdH%%T)8JqQh~|YgpnR( zReEP*0~b6PhzoPQ)()QU`5^QYGq9ELxXm^>fdOfjWSA+YjD-T#rHTdyb%gS;EWhstIOLZW6;6m9gB zK2FlMN`$#dQ?iAq`i20bj+E%T52BKs1NxBLye!k?%bUrZ2>C1H$N2<^Xu$Zefs@3C zwc!N>EyFW9v?bIdJ+#s*CkRovx*o>@vsI>=ezKUTk7_06M8;ZmYD4RYNGFk@*L=0x zv@&7;;U{ycx&wh7BK*TNK z$8Iaoj3p^BnCN_Z@O)P7v`}GgfQ@{33w;P$nNY_z6iRKKA0fMe#o5;s_IfYE|FNER zg6i}G_e;u19fK7HDggnr%S%aC4%|fiY+(a#B(!A#w7UNZNfVh_M+IcyY?e+>7%KmG z&4ZaJ(%~vuuFuLR3BJTtH=ekIUq7Y13SEb*xKpNxtCNwEMzh+%6}4cbIM(M;y6B^# zG`E8w6X78kO-nQNim?bsZZ#Oh0BjihPu+`VLBC=wBO9%UsMWCvn12%y_}#+J(saKx zGi+wlJbRtsOxd8zcnsXyJ4B`TN{fcWtULwbZCLwHxmu;W@mD!aVENq`=9_l+7X~=~ zn&V!NTQ+B-VA7crxy(+!2!PfJpUtm3JoAC&>3&6lgnF>G(t_7qW(2#^UeF@HJ;FjQ z2iO@VpBNv$k@VjD&WGs3*zhDdBs%^v-|~D4XTyr7V=vMp5y)>eS1^vO^Yl-&B!M93 z5>Si0fv#T~aZ{+EHewk5fw$>q_fMdm4$RELHYyZ%IR@ywLcuXg7rD}8%8}HvT0-x@ ziC1qbqVB0Y_lb|d%McM4e%#C3V7URUL00R3J{5(31|%1dO@5XjzQ#T-A^TFZWo<8; ziXPyE-*o#*W2Br@CHASg)dLIL}v~Z z+K@Llk3WX!o&{Mib3XeF5^{F$)FoAjPi@JQKgg5RVE6--_R)m)AFP^VXqQsza_s~p ztmIu_J6-Kz7&Rti8>oOJ>{OAZ^jy$VG-;$cJ{2dCNB-FmhI>A78o0u5a5e&W5&&Zh zypHy+@Nq%D?6|laFO{R#t4Dd0lQk7?6;5+{Z$b`b&auFVRdk*XPDGop4A|^Q?WRhH zJAi1D^sYU|lSr?0(l&0i*Kd<8HQey)GdpoAh&k_GOT+|C1zSOGtJ8QB4TYj!e~Q`VoNxkIFO)R7&xGX~z%PW!$m;CeNuL>PfM{~H5);?_>4?|Rw>U-on zq=g+`6+Ax)y&X9A8kaS)i7pfG)Y!C{rI#o>2fGuplY&ATH;S2-xJhEp7bj$R9Os+p z<|}an7vT4X>9t0I4buyJ03Y8_1zzu%w5+FSR2U43CJp)|h^%Rq$UKFT(K7VKdn(|z{7FzcK#P={u= z5-~52JHY`w5{rH2yVUVUUq(3R%P#;OPmZMqy$wf$_!~Y<+Z5j}N#W%9?QL4q{Mf(?y5RTXOz{n<7JzLF@lY)1C$B9CeyG+8LbNdP z9Ev#Nu;gg#>=awxsA(_v*WNaO=m0HbkmjF>!Vw(<8fv8?xEs!h)PK|sgz zv=E=#05}nh81A?^_VwVXqTNrpoQHz4R=;mIC-OZ z)}!&X&AaGMie`u2fxieXx3JahLJh9E>Run`3(!e*H?~cb?D18;qXeo=UZkzN(BJ3T z_P;;v^ObI4cJHtxqz?7dhcrTjN65Dy>&1Nt1RF-PKmmk&S4ZQXZ;Tj4cU+O32!(|I z8OrH`@{BIf;Wy4aSUz&cJgjAG$`1Y* z<0O{ftQlQr=AmrPZFE?8betF*fnmCRQDqIs%S%uzTTS$9Pq{zv{HV{4D1!CDdEwZL z5D3J4iUvBJqOEYics+Mh2-IO(a2@R!0L+alBe{`;|WVmp!I<8%~GV+5my*Kgde0kC;(H-X*Mc8%>VUtJ${%SW+c&vgh_BT;R?*9&U z>kjs~$<}9Yy9T)>n1k_JzaKtQ@Lc2Y_#fJkLECr?j?L04PYCkd2ckNNKEfNy>?#}G z!k~nn&WS6SA@b0K9+Yfv$4c0XcBK=~OF;Odf<^tzHbHx`&(V~gavMKmhvks$fyeZ$Ey^bCe=c>KgU2D`bjfAS)QKUk!@b+%x?UB^HOd{I z`!vw^kqs7mydWdScngQ5R~y#E@{PsCNP)oNZxD~& z!b>(Wv|h_uL^Co+;G!US+O}}b{Ld3YN@oiA&SidcdY2bL#h?pOgI#4ii!HGKOgMe4 zJL8hsx=whuYi;~2H)4@niyN9p+-~=6C93-wtWZzL*8~Qyr(43>Wr}_WwZ2Z~HV68x z$Ra+%RsV!m>Y#xY?VUq1VCwZ078a)?1BTkB=IpZp>k%yd7al*>=etv!B=E7fm3`8i z-L}hAGlBeS_q^83P`yneP(oW z&d-Sv2ZsN5Ug0bh)vXgrquVU4Gf9c{?W?+wE@V_iw4|rd+cy9Jh`` znc~x$HcF=azN@RG9y=@2rh9a<>aTogvv0&U+fu(SF9g<(@vAM4lG`_)bMa= z5Wi*nB9pZ>%~WY^%KKZDSgoj4{P@vqby451*LqLyd2;KId#JO!sAcw)ecYzz^~^5H z5}$wKzC<&B_Rc~{F~9XhS^G5yte2ixefX=dtPB9m!5pTjG;jPRQdTWxhbt#1-MJiY zgqvojUHu{RkU^hA%fY#J9CNSTmk_joG#R=yT|Ph-9Ee57xF&jTzt|}8_SQN=5BW)J)Yj4ZZtnn!&k4j za-)`s(@jX7$fjU9IzzupVrInjV2#_*eC1Lqr5=t?Ut7b)_6Yg@+-UCAKJX$+fY{%E zYTAwve_Cm(wW7?(D%stv)j9=B;~DR86t3H{&%V1V*dI;iG$JWLPc?>jmiW!eSPj@L zYe^4h<550--u`7JzyrRI4G|d;YJpl$_BN{=85iU~0-oxMTbXy}>66_3{XYL)&yJ2- z|4}VSUgD+?%${zEIQiDG%fjWDe)3DLT0!X4DxdXXMH}Fi)e7hcAU~jM5-^x9#gFOc zg6IUNp*_fV)!Lij8sz0%&eY_eo0i$l{<&?toeSSY4j*gEQOAPh`XjMb7Bskjun*XV z3Wso9ooKxX8#)1B?a(A!(WQbgAM;HYIPAO#%MbkU&a&pT;o6^>A`dL@?yhk*g@}N6 zukcqT1&+f{S2BQ~r zs&b<(2c?@vgZ!p-&4*6;woI=0!bni;SaQ}g%RHDtr8!YqzA8(*!~PgF+GU3=r)6g# zr#*c#Xz~`4V!J7;tP&z?W}|0f?u>4pCfL*M^ZooF?(}f|8MXs7D6lXt-6Qw;r>{Bf zsyw^7x3jV1^#zO4R8j?vas<#V@mxIO@ z3J9ao3f4B8KI0$41r#Y7}fn%`v^&$eYYYTF`<_K32?mBkSom3f59EZ#n-0b=E?*b;MZL)u3&QC(J0tp zpBq?+GGPMf+|ar_Jt+dtE=e%xMtx92Uv^9!=5zHr)UU@W;Dr2l`L?#!MnQ@59_qjs zZBXoi`rA4+J%Mut?ZMWSUjT~!YC-o5e!=j~v-l(3Q6)cO8HzWM@J6CRbm?!{Ie%4k z?YQNSqGty2cPdk@q5Dc~=VX=|JFv$3Ry-L#Q8y0mT*`rytL6MpZ7eV>6GIURVn6}c zS1Ik{GmZ4O7~AI}#3WPY;~Q4_brLg2!f}B8K9R%Mu_EU23}^LShHJ&+nJz@>z^f zgrGA$I3G~w{RX1J@Qq~PR^4+Q>%f|2uSF1HYZ++4OmVGgJ8+;PdiYQK4c|JN;{D>9 z7rO;^j1kq<+k)33X-LL)YhlDmtiRvbF0|rVo7t^*JVs|WZS0)nxovFd8LjT%x!k<> ztn2le;vR{FIbV!1dowY79O|cj%Xs|(^cTbY#;cgv3x*?5J|n2LTCQjT)$`GVC2*Xu zFbStql_K5s&$FCpwxwQ)R3t$F*~4v>YgRhjKg3KA&>F@qK?6N9f&CuIB*>O)BkBQb z4g0?VMh$p7cdj;j#QYiaf+(2Zbydu$i3I$eM+wG8V?goiKyrHa;JiBFIKEmRh=Rsn zMOg5^c@g|mVKzNVZ2NA|DZr}HL=m+KSD7oiI{0qioU%Yjby^&(S zu%Lc?om@VCH}GzS5Fn%?tp)L8llIh~W21%^7QC^6mPM{HD5g1earyeu`jHWe*>d~M ze)orOnW=)l+$6GILEyf!RQI;JDiItN8W zI?~Io2RtHjcGz9H?0I0XnG6^tk|Eiu1}i}cu^rWgF;g5~Ke%6sLIQ;%nf;Dw9pc>^ zN{v?J4`^evfNvWSu`sFOilH*>%_x&W3*)=PGM7XqxB2d1 z4ZIJQCUO@oju9jKZ&fm*{`9^)Ftk-i_ZZ0!<9dDwI|3mAa~r2 z;w((DV#;}Zukr=`%yFwoe|u59bcO%CESpjHy`P@a)uvk=Vh{5h_cQ}06Nj`)m{Cdb zgOs-~1Sk;uS`G(l+$|-6&+BW2Sz{`RMFYxQSLoD5?ANnxwKNRqg7=wOO0(3+Fu72E z9fCjzAf^i_%Gn_J<|1fE{mcav2SQhb&itySC|OS0!NFnX`S2k})S2Q14g^PmoMBkU zy8*(eaa1-H-4GpneY{Az>umJwv=y-ga0TViH4^tKphM-uYyZr12O^*Q7tV7xa*d7; zwr=KfIfxGqzzhd2$g)%4c{CBP?d;JJ?46#@DOV|7)}s=Z#VBSAsvgO_?$!%ZoLy`Y z-5X%5xD{Jja|C)E*l4J zUKN#Ny<4JcHBPcf)QJE*nXr<0L3$mpp{{lk%5ufp)ZVY4WA<<9UC zO-#b5!Z=L3_zW{-`_c*sp4jhLA4b*uGpDuqUo8Pb&wS}odY)nK&5KO4k)+~Y>jExT zbSzjC7KgVi>ft#N7~~-& z_)7hpAF};W5|AEXJFg+&YpQAVPKzvZbb8#b`{k1n3SkFHtaWp!Sk9ex>(LJamQ<+< zVUH!#bK}ymK?_HAeGR-4UIvFJSRVVHoR{(jWJ|Egs}#bXyXVIC%rSCUp~KRc)-KnE zEIT_Ntu*Pg(3@M8O1l+%2d-6F!vrj&1-(Rhdr!&+cwE+jfgsW#4jxwa!@`C>kN((lD8;lojhrrpY;VvzSV#U(h zn?l%=Zt}oQT1Ezn=JX?7yT}|YzGnW)45#SEm7&&fnaMBITqa?3_q^CEydZ3*R_z27 z+@Fq!U6Zyk4DIF#jUQ9WfqPVuF_W4uRc3=UAuy0*msJdBV7|11z(@o`t;)=_J*{TCOV{ z%N0QGSPvW@z6ekxkVN40(b0l!(mBB9Y-qqh0fLJx(h72g3K0c%6}AdypW$8d8goNN z(T8?irCA*)`kCu~LO1(TiA{`mN+{)h2yw=HE?f|KdT^kY^|t5fMuXhR1XZ#?Hfi)2 zPum61m=~J#&ZQPH0f9<9o>oX*5=zi804DUIo$yt&Rh1iSwYKH1Q4fk6k;CgpiX_tS zE9gsogg$Q}zE;CLx=9GGAs>DY^m%==aMy@$@W;)lPBlWilhU zi6RaSU(RESvvXaFLtqdL9wA%rmnU!s|C@tJFn5x zqANKwqeu{j)H1rIEgP-P4FEG*-p>ei85zb3chi%8*e>30b}&>)L?bXteCQ*`WI?;6 z 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≻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