Author: Matti Picus <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit