Author: Matti Picus <matti.pi...@gmail.com> Branch: py3.5 Changeset: r94651:39fd746993fe Date: 2018-05-21 21:34 -0700 http://bitbucket.org/pypy/pypy/changeset/39fd746993fe/
Log: merge default into py3.5 diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst --- a/pypy/doc/whatsnew-head.rst +++ b/pypy/doc/whatsnew-head.rst @@ -18,3 +18,7 @@ .. branch: crypt_h Include crypt.h for crypt() on Linux + +.. branch: gc-more-logging + +Log additional gc-minor and gc-collect-step info in the PYPYLOG diff --git a/pypy/module/__pypy__/test/test_special.py b/pypy/module/__pypy__/test/test_special.py --- a/pypy/module/__pypy__/test/test_special.py +++ b/pypy/module/__pypy__/test/test_special.py @@ -135,7 +135,10 @@ cls.w_runappdirect = cls.space.wrap(cls.runappdirect) def test_jit_backend_features(self): - from __pypy__ import jit_backend_features + try: + from __pypy__ import jit_backend_features + except ImportError: + skip("compiled without jit") supported_types = jit_backend_features assert isinstance(supported_types, list) for x in supported_types: diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py --- a/pypy/module/cpyext/api.py +++ b/pypy/module/cpyext/api.py @@ -660,7 +660,7 @@ '_PyObject_New', '_PyObject_NewVar', '_PyObject_GC_New', '_PyObject_GC_NewVar', 'PyObject_Init', 'PyObject_InitVar', - 'PyTuple_New', + 'PyTuple_New', '_Py_Dealloc', ] TYPES = {} FORWARD_DECLS = [] @@ -1150,10 +1150,11 @@ def attach_c_functions(space, eci, prefix): state = space.fromcache(State) - state.C._Py_Dealloc = rffi.llexternal('_Py_Dealloc', - [PyObject], lltype.Void, - compilation_info=eci, - _nowrapper=True) + state.C._Py_Dealloc = rffi.llexternal( + mangle_name(prefix, '_Py_Dealloc'), + [PyObject], lltype.Void, + compilation_info=eci, + _nowrapper=True) state.C.PyObject_Free = rffi.llexternal( mangle_name(prefix, 'PyObject_Free'), [rffi.VOIDP], lltype.Void, diff --git a/pypy/objspace/std/dictmultiobject.py b/pypy/objspace/std/dictmultiobject.py --- a/pypy/objspace/std/dictmultiobject.py +++ b/pypy/objspace/std/dictmultiobject.py @@ -226,13 +226,7 @@ """Not exposed directly to app-level, but via __pypy__.reversed_dict(). """ strategy = self.get_strategy() - if strategy.has_iterreversed: - it = strategy.iterreversed(self) - return W_DictMultiIterKeysObject(space, it) - else: - # fall-back - w_keys = self.w_keys() - return space.call_method(w_keys, '__reversed__') + return strategy.iterreversed(self) def nondescr_delitem_if_value_is(self, space, w_key, w_value): """Not exposed directly to app-level, but used by @@ -246,32 +240,7 @@ """Not exposed directly to app-level, but via __pypy__.move_to_end(). """ strategy = self.get_strategy() - if strategy.has_move_to_end: - strategy.move_to_end(self, w_key, last_flag) - else: - # fall-back - w_value = self.getitem(w_key) - if w_value is None: - space.raise_key_error(w_key) - else: - self.internal_delitem(w_key) - if last_flag: - self.setitem(w_key, w_value) - else: - # *very slow* fall-back - keys_w = [] - values_w = [] - iteratorimplementation = self.iteritems() - while True: - w_k, w_v = iteratorimplementation.next_item() - if w_k is None: - break - keys_w.append(w_k) - values_w.append(w_v) - self.clear() - self.setitem(w_key, w_value) - for i in range(len(keys_w)): - self.setitem(keys_w[i], values_w[i]) + strategy.move_to_end(self, w_key, last_flag) def nondescr_popitem_first(self, space): """Not exposed directly to app-level, but via __pypy__.popitem_first(). @@ -298,21 +267,10 @@ otherwise KeyError is raised """ strategy = self.get_strategy() - if strategy.has_pop: - try: - return strategy.pop(self, w_key, w_default) - except KeyError: - raise space.raise_key_error(w_key) - # fall-back - w_item = self.getitem(w_key) - if w_item is None: - if w_default is not None: - return w_default - else: - space.raise_key_error(w_key) - else: - self.internal_delitem(w_key) - return w_item + try: + return strategy.pop(self, w_key, w_default) + except KeyError: + raise space.raise_key_error(w_key) def descr_popitem(self, space): """D.popitem() -> (k, v), remove and return some (key, value) pair as @@ -547,7 +505,6 @@ raise NotImplementedError has_iterreversed = False - has_move_to_end = False has_pop = False # ^^^ no default implementation available for these methods @@ -562,6 +519,48 @@ def prepare_update(self, w_dict, num_extra): pass + def move_to_end(self, w_dict, w_key, last_flag): + # fall-back + w_value = w_dict.getitem(w_key) + if w_value is None: + self.space.raise_key_error(w_key) + else: + w_dict.internal_delitem(w_key) + if last_flag: + w_dict.setitem(w_key, w_value) + else: + # *very slow* fall-back + keys_w = [] + values_w = [] + iteratorimplementation = w_dict.iteritems() + while True: + w_k, w_v = iteratorimplementation.next_item() + if w_k is None: + break + keys_w.append(w_k) + values_w.append(w_v) + w_dict.clear() + w_dict.setitem(w_key, w_value) + for i in range(len(keys_w)): + w_dict.setitem(keys_w[i], values_w[i]) + + + def pop(self, w_dict, w_key, w_default): + # fall-back + w_item = w_dict.getitem(w_key) + if w_item is None: + if w_default is not None: + return w_default + else: + raise KeyError + else: + w_dict.internal_delitem(w_key) + return w_item + + def iterreversed(self, w_dict): + # fall-back if getiterreversed is not present + w_keys = self.w_keys(w_dict) + return self.space.call_method(w_keys, '__reversed__') class EmptyDictStrategy(DictStrategy): erase, unerase = rerased.new_erasing_pair("empty") @@ -660,6 +659,15 @@ def view_as_kwargs(self, w_dict): return ([], []) + def move_to_end(self, w_dict, w_key, last_flag): + self.space.raise_key_error(w_key) + + def pop(self, w_dict, w_key, w_default): + if w_default is not None: + return w_default + else: + raise KeyError + # ---------- iterator interface ---------------- def getiterkeys(self, w_dict): @@ -829,15 +837,10 @@ if hasattr(dictimpl, 'getiterreversed'): def iterreversed(self, w_dict): - return IterClassReversed(self.space, self, w_dict) + return W_DictMultiIterKeysObject( + self.space, + IterClassReversed(self.space, self, w_dict)) dictimpl.iterreversed = iterreversed - dictimpl.has_iterreversed = True - - if hasattr(dictimpl, 'move_to_end'): - dictimpl.has_move_to_end = True - - if hasattr(dictimpl, 'pop'): - dictimpl.has_pop = True @jit.look_inside_iff(lambda self, w_dict, w_updatedict: w_dict_unrolling_heuristic(w_dict)) diff --git a/pypy/objspace/std/test/test_dictmultiobject.py b/pypy/objspace/std/test/test_dictmultiobject.py --- a/pypy/objspace/std/test/test_dictmultiobject.py +++ b/pypy/objspace/std/test/test_dictmultiobject.py @@ -231,6 +231,33 @@ raises(KeyError, d.pop, "abc") assert len(d) == 2 + def test_pop_empty_bug(self): + d = {} + assert d.pop(1, 2) == 2 + def f(**d): return d + d = f() + assert d.pop(1, 2) == 2 + + def test_pop_kwargs(self): + def kw(**d): return d + d = kw(o=2, t=4) + dd = d.copy() + result = dd.pop("o") + assert result == 2 + assert len(dd) == 1 + dd = d.copy() + result = dd.pop("o", 44) + assert result == 2 + assert len(dd) == 1 + result = dd.pop("o", 44) + assert result == 44 + assert len(dd) == 1 + raises(KeyError, dd.pop, "33") + + assert d.pop("abc", None) is None + raises(KeyError, d.pop, "abc") + assert len(d) == 2 + def test_items(self): d = {1: 2, 3: 4} its = list(d.items()) @@ -261,8 +288,9 @@ def test_reversed_dict(self): import __pypy__ - for d in [{}, {1: 2, 3: 4, 5: 6}, {"a": 5, "b": 2, "c": 6}]: - assert list(__pypy__.reversed_dict(d)) == list(d.keys())[::-1] + def kw(**d): return d + for d in [{}, {1: 2, 3: 4, 5: 6}, {"a": 5, "b": 2, "c": 6}, kw(a=1, b=2)]: + assert list(__pypy__.reversed_dict(d)) == list(d.keys()[::-1]) raises(TypeError, __pypy__.reversed_dict, 42) def test_reversed_dict_runtimeerror(self): diff --git a/rpython/memory/gc/incminimark.py b/rpython/memory/gc/incminimark.py --- a/rpython/memory/gc/incminimark.py +++ b/rpython/memory/gc/incminimark.py @@ -1836,6 +1836,7 @@ debug_print("minor collect, total memory used:", total_memory_used) debug_print("number of pinned objects:", self.pinned_objects_in_nursery) + debug_print("total size of surviving objects:", self.nursery_surviving_size) if self.DEBUG >= 2: self.debug_check_consistency() # expensive! # @@ -2401,7 +2402,9 @@ # a total object size of at least '3 * nursery_size' bytes # is processed. limit = 3 * self.nursery_size // self.small_request_threshold - self.free_unvisited_rawmalloc_objects_step(limit) + nobjects = self.free_unvisited_rawmalloc_objects_step(limit) + debug_print("freeing raw objects:", limit-nobjects, + "freed, limit was", limit) done = False # the 2nd half below must still be done else: # Ask the ArenaCollection to visit a fraction of the objects. @@ -2411,6 +2414,8 @@ limit = 3 * self.nursery_size // self.ac.page_size done = self.ac.mass_free_incremental(self._free_if_unvisited, limit) + status = done and "No more pages left." or "More to do." + debug_print("freeing GC objects, up to", limit, "pages.", status) # XXX tweak the limits above # if done: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit