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

Reply via email to