[pypy-commit] pypy default: merge
fijal
noreply at buildbot.pypy.org
Sat May 18 13:19:19 CEST 2013
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch:
Changeset: r64278:44b4f0cf0b7d
Date: 2013-05-18 13:18 +0200
http://bitbucket.org/pypy/pypy/changeset/44b4f0cf0b7d/
Log: merge
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
@@ -1,13 +1,14 @@
-from pypy.interpreter import gateway
from pypy.interpreter.baseobjspace import W_Root
from pypy.interpreter.error import OperationError, operationerrfmt
+from pypy.interpreter.gateway import (
+ WrappedDefault, applevel, interp2app, unwrap_spec)
from pypy.interpreter.mixedmodule import MixedModule
from pypy.interpreter.signature import Signature
from pypy.objspace.std.stdtypedef import StdTypeDef
-from rpython.rlib import rerased, jit
+from rpython.rlib import jit, rerased
from rpython.rlib.debug import mark_dict_non_null
-from rpython.rlib.objectmodel import r_dict, specialize, newlist_hint
+from rpython.rlib.objectmodel import newlist_hint, r_dict, specialize
from rpython.tool.sourcetools import func_with_new_name
@@ -18,7 +19,7 @@
return space.is_w(space.type(w_key), space.w_str)
def _never_equal_to_string(space, w_lookup_type):
- """ Handles the case of a non string key lookup.
+ """Handles the case of a non string key lookup.
Types that have a sane hash/eq function should allow us to return True
directly to signal that the key is not in the dict in any case.
XXX The types should provide such a flag. """
@@ -32,7 +33,7 @@
@specialize.call_location()
def w_dict_unrolling_heuristic(w_dct):
- """ In which cases iterating over dict items can be unrolled.
+ """In which cases iterating over dict items can be unrolled.
Note that w_dct is an instance of W_DictMultiObject, not necesarilly
an actual dict
"""
@@ -56,8 +57,8 @@
class W_DictMultiObject(W_Root):
@staticmethod
def allocate_and_init_instance(space, w_type=None, module=False,
- instance=False, strdict=False, kwargs=False):
-
+ instance=False, strdict=False,
+ kwargs=False):
if space.config.objspace.std.withcelldict and module:
from pypy.objspace.std.celldict import ModuleDictStrategy
assert w_type is None
@@ -67,11 +68,9 @@
elif space.config.objspace.std.withmapdict and instance:
from pypy.objspace.std.mapdict import MapDictStrategy
strategy = space.fromcache(MapDictStrategy)
-
elif instance or strdict or module:
assert w_type is None
strategy = space.fromcache(StringDictStrategy)
-
elif kwargs:
assert w_type is None
from pypy.objspace.std.kwargsdict import EmptyKwargsDictStrategy
@@ -92,7 +91,7 @@
self.dstorage = storage
def __repr__(w_self):
- """ representation for debugging purposes """
+ """representation for debugging purposes"""
return "%s(%s)" % (w_self.__class__.__name__, w_self.strategy)
def unwrap(w_dict, space):
@@ -105,12 +104,10 @@
def missing_method(w_dict, space, w_key):
if not space.is_w(space.type(w_dict), space.w_dict):
- w_missing = space.lookup(w_dict, "__missing__")
- if w_missing is None:
- return None
- return space.get_and_call_function(w_missing, w_dict, w_key)
- else:
- return None
+ w_missing = space.lookup(w_dict, '__missing__')
+ if w_missing is not None:
+ return space.get_and_call_function(w_missing, w_dict, w_key)
+ return None
def initialize_content(w_self, list_pairs_w):
for w_k, w_v in list_pairs_w:
@@ -163,7 +160,7 @@
if self.length() != w_other.length():
return space.w_False
iteratorimplementation = self.iteritems()
- while 1:
+ while True:
w_key, w_val = iteratorimplementation.next_item()
if w_key is None:
break
@@ -240,7 +237,8 @@
space.raise_key_error(w_key)
def descr_reversed(self, space):
- raise OperationError(space.w_TypeError, space.wrap('argument to reversed() must be a sequence'))
+ raise OperationError(space.w_TypeError, space.wrap(
+ 'argument to reversed() must be a sequence'))
def descr_copy(self, space):
"""D.copy() -> a shallow copy of D"""
@@ -292,16 +290,13 @@
"""D.clear() -> None. Remove all items from D."""
self.clear()
- @gateway.unwrap_spec(w_default=gateway.WrappedDefault(None))
+ @unwrap_spec(w_default=WrappedDefault(None))
def descr_get(self, space, w_key, w_default):
"""D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None."""
w_value = self.getitem(w_key)
- if w_value is not None:
- return w_value
- else:
- return w_default
+ return w_value if w_value is not None else w_default
- @gateway.unwrap_spec(defaults_w='args_w')
+ @unwrap_spec(defaults_w='args_w')
def descr_pop(self, space, w_key, defaults_w):
"""D.pop(k[,d]) -> v, remove specified key and return the
corresponding value\nIf key is not found, d is returned if given,
@@ -332,7 +327,7 @@
space.wrap("popitem(): dictionary is empty"))
return space.newtuple([w_key, w_value])
- @gateway.unwrap_spec(w_default=gateway.WrappedDefault(None))
+ @unwrap_spec(w_default=WrappedDefault(None))
def descr_setdefault(self, space, w_key, w_default):
"""D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D"""
return self.setdefault(w_key, w_default)
@@ -364,7 +359,7 @@
_add_indirections()
-app = gateway.applevel('''
+app = applevel('''
def dictrepr(currently_in_repr, d):
if len(d) == 0:
return "{}"
@@ -400,46 +395,46 @@
d[k] = v
dict(**kwargs) -> new dictionary initialized with the name=value pairs
in the keyword argument list. For example: dict(one=1, two=2)''',
- __new__ = gateway.interp2app(W_DictMultiObject.descr_new),
- fromkeys = gateway.interp2app(W_DictMultiObject.descr_fromkeys,
- as_classmethod=True),
+ __new__ = interp2app(W_DictMultiObject.descr_new),
+ fromkeys = interp2app(W_DictMultiObject.descr_fromkeys,
+ as_classmethod=True),
__hash__ = None,
- __repr__ = gateway.interp2app(W_DictMultiObject.descr_repr),
- __init__ = gateway.interp2app(W_DictMultiObject.descr_init),
+ __repr__ = interp2app(W_DictMultiObject.descr_repr),
+ __init__ = interp2app(W_DictMultiObject.descr_init),
- __eq__ = gateway.interp2app(W_DictMultiObject.descr_eq),
- __ne__ = gateway.interp2app(W_DictMultiObject.descr_ne),
- __lt__ = gateway.interp2app(W_DictMultiObject.descr_lt),
- __le__ = gateway.interp2app(W_DictMultiObject.descr_le),
- __gt__ = gateway.interp2app(W_DictMultiObject.descr_gt),
- __ge__ = gateway.interp2app(W_DictMultiObject.descr_ge),
+ __eq__ = interp2app(W_DictMultiObject.descr_eq),
+ __ne__ = interp2app(W_DictMultiObject.descr_ne),
+ __lt__ = interp2app(W_DictMultiObject.descr_lt),
+ __le__ = interp2app(W_DictMultiObject.descr_le),
+ __gt__ = interp2app(W_DictMultiObject.descr_gt),
+ __ge__ = interp2app(W_DictMultiObject.descr_ge),
- __len__ = gateway.interp2app(W_DictMultiObject.descr_len),
- __iter__ = gateway.interp2app(W_DictMultiObject.descr_iter),
- __contains__ = gateway.interp2app(W_DictMultiObject.descr_contains),
+ __len__ = interp2app(W_DictMultiObject.descr_len),
+ __iter__ = interp2app(W_DictMultiObject.descr_iter),
+ __contains__ = interp2app(W_DictMultiObject.descr_contains),
- __getitem__ = gateway.interp2app(W_DictMultiObject.descr_getitem),
- __setitem__ = gateway.interp2app(W_DictMultiObject.descr_setitem),
- __delitem__ = gateway.interp2app(W_DictMultiObject.descr_delitem),
+ __getitem__ = interp2app(W_DictMultiObject.descr_getitem),
+ __setitem__ = interp2app(W_DictMultiObject.descr_setitem),
+ __delitem__ = interp2app(W_DictMultiObject.descr_delitem),
- __reversed__ = gateway.interp2app(W_DictMultiObject.descr_reversed),
- copy = gateway.interp2app(W_DictMultiObject.descr_copy),
- items = gateway.interp2app(W_DictMultiObject.descr_items),
- keys = gateway.interp2app(W_DictMultiObject.descr_keys),
- values = gateway.interp2app(W_DictMultiObject.descr_values),
- iteritems = gateway.interp2app(W_DictMultiObject.descr_iteritems),
- iterkeys = gateway.interp2app(W_DictMultiObject.descr_iterkeys),
- itervalues = gateway.interp2app(W_DictMultiObject.descr_itervalues),
- viewkeys = gateway.interp2app(W_DictMultiObject.descr_viewkeys),
- viewitems = gateway.interp2app(W_DictMultiObject.descr_viewitems),
- viewvalues = gateway.interp2app(W_DictMultiObject.descr_viewvalues),
- has_key = gateway.interp2app(W_DictMultiObject.descr_has_key),
- clear = gateway.interp2app(W_DictMultiObject.descr_clear),
- get = gateway.interp2app(W_DictMultiObject.descr_get),
- pop = gateway.interp2app(W_DictMultiObject.descr_pop),
- popitem = gateway.interp2app(W_DictMultiObject.descr_popitem),
- setdefault = gateway.interp2app(W_DictMultiObject.descr_setdefault),
- update = gateway.interp2app(W_DictMultiObject.descr_update),
+ __reversed__ = interp2app(W_DictMultiObject.descr_reversed),
+ copy = interp2app(W_DictMultiObject.descr_copy),
+ items = interp2app(W_DictMultiObject.descr_items),
+ keys = interp2app(W_DictMultiObject.descr_keys),
+ values = interp2app(W_DictMultiObject.descr_values),
+ iteritems = interp2app(W_DictMultiObject.descr_iteritems),
+ iterkeys = interp2app(W_DictMultiObject.descr_iterkeys),
+ itervalues = interp2app(W_DictMultiObject.descr_itervalues),
+ viewkeys = interp2app(W_DictMultiObject.descr_viewkeys),
+ viewitems = interp2app(W_DictMultiObject.descr_viewitems),
+ viewvalues = interp2app(W_DictMultiObject.descr_viewvalues),
+ has_key = interp2app(W_DictMultiObject.descr_has_key),
+ clear = interp2app(W_DictMultiObject.descr_clear),
+ get = interp2app(W_DictMultiObject.descr_get),
+ pop = interp2app(W_DictMultiObject.descr_pop),
+ popitem = interp2app(W_DictMultiObject.descr_popitem),
+ setdefault = interp2app(W_DictMultiObject.descr_setdefault),
+ update = interp2app(W_DictMultiObject.descr_update),
)
@@ -453,7 +448,7 @@
def w_keys(self, w_dict):
iterator = self.iterkeys(w_dict)
result = newlist_hint(self.length(w_dict))
- while 1:
+ while True:
w_key = iterator.next_key()
if w_key is not None:
result.append(w_key)
@@ -463,7 +458,7 @@
def values(self, w_dict):
iterator = self.itervalues(w_dict)
result = newlist_hint(self.length(w_dict))
- while 1:
+ while True:
w_value = iterator.next_value()
if w_value is not None:
result.append(w_value)
@@ -473,7 +468,7 @@
def items(self, w_dict):
iterator = self.iteritems(w_dict)
result = newlist_hint(self.length(w_dict))
- while 1:
+ while True:
w_key, w_value = iterator.next_item()
if w_key is not None:
result.append(self.space.newtuple([w_key, w_value]))
@@ -515,7 +510,7 @@
unerase = staticmethod(unerase)
def get_empty_storage(self):
- return self.erase(None)
+ return self.erase(None)
def switch_to_correct_strategy(self, w_dict, w_key):
withidentitydict = self.space.config.objspace.std.withidentitydict
@@ -618,7 +613,7 @@
# Iterator Implementation base classes
def _new_next(TP):
- if TP == 'key' or TP == 'value':
+ if TP in ('key', 'value'):
EMPTY = None
else:
EMPTY = None, None
@@ -626,10 +621,12 @@
def next(self):
if self.dictimplementation is None:
return EMPTY
+ space = self.space
if self.len != self.dictimplementation.length():
self.len = -1 # Make this error state sticky
- raise OperationError(self.space.w_RuntimeError,
- self.space.wrap("dictionary changed size during iteration"))
+ msg = "dictionary changed size during iteration"
+ raise OperationError(space.w_RuntimeError, space.wrap(msg))
+
# look for the next entry
if self.pos < self.len:
result = getattr(self, 'next_' + TP + '_entry')()
@@ -647,8 +644,8 @@
w_value = self.dictimplementation.getitem(w_key)
if w_value is None:
self.len = -1 # Make this error state sticky
- raise OperationError(self.space.w_RuntimeError,
- self.space.wrap("dictionary changed during iteration"))
+ msg = "dictionary changed during iteration"
+ raise OperationError(space.w_RuntimeError, space.wrap(msg))
return (w_key, w_value)
# no more entries
self.dictimplementation = None
@@ -781,7 +778,8 @@
def setdefault(self, w_dict, w_key, w_default):
if self.is_correct_type(w_key):
- return self.unerase(w_dict.dstorage).setdefault(self.unwrap(w_key), w_default)
+ return self.unerase(w_dict.dstorage).setdefault(self.unwrap(w_key),
+ w_default)
else:
self.switch_to_object_strategy(w_dict)
return w_dict.setdefault(w_key, w_default)
@@ -821,7 +819,7 @@
space = self.space
dict_w = self.unerase(w_dict.dstorage)
return [space.newtuple([self.wrap(key), w_value])
- for (key, w_value) in dict_w.iteritems()]
+ for (key, w_value) in dict_w.iteritems()]
def popitem(self, w_dict):
key, value = self.unerase(w_dict.dstorage).popitem()
@@ -866,9 +864,9 @@
return True
def get_empty_storage(self):
- new_dict = r_dict(self.space.eq_w, self.space.hash_w,
- force_non_null=True)
- return self.erase(new_dict)
+ new_dict = r_dict(self.space.eq_w, self.space.hash_w,
+ force_non_null=True)
+ return self.erase(new_dict)
def _never_equal_to(self, w_lookup_type):
return False
@@ -1068,7 +1066,7 @@
w_dict_unrolling_heuristic(w_data))
def update1_dict_dict(space, w_dict, w_data):
iterator = w_data.iteritems()
- while 1:
+ while True:
w_key, w_value = iterator.next_item()
if w_key is None:
break
@@ -1106,16 +1104,18 @@
update1(space, w_dict, w_kwds)
def characterize(space, w_a, w_b):
- """ (similar to CPython)
- returns the smallest key in acontent for which b's value is different or absent and this value """
+ """(similar to CPython)
+ returns the smallest key in acontent for which b's value is
+ different or absent and this value"""
w_smallest_diff_a_key = None
w_its_value = None
iteratorimplementation = w_a.iteritems()
- while 1:
+ while True:
w_key, w_val = iteratorimplementation.next_item()
if w_key is None:
break
- if w_smallest_diff_a_key is None or space.is_true(space.lt(w_key, w_smallest_diff_a_key)):
+ if w_smallest_diff_a_key is None or space.is_true(space.lt(
+ w_key, w_smallest_diff_a_key)):
w_bvalue = w_b.getitem(w_key)
if w_bvalue is None:
w_its_value = w_val
@@ -1191,10 +1191,7 @@
w_clone.pos += 1
stuff = [w_clone.next_entry() for i in range(w_clone.pos, w_clone.len)]
w_res = space.newlist(stuff)
- tup = [
- w_res
- ]
- w_ret = space.newtuple([new_inst, space.newtuple(tup)])
+ w_ret = space.newtuple([new_inst, space.newtuple([w_res])])
return w_ret
@@ -1224,23 +1221,23 @@
W_DictMultiIterItemsObject.typedef = StdTypeDef(
"dict_iteritems",
- __iter__ = gateway.interp2app(W_DictMultiIterItemsObject.descr_iter),
- next = gateway.interp2app(W_DictMultiIterItemsObject.descr_next),
- __length_hint__ = gateway.interp2app(W_BaseDictMultiIterObject.descr_length_hint)
+ __iter__ = interp2app(W_DictMultiIterItemsObject.descr_iter),
+ next = interp2app(W_DictMultiIterItemsObject.descr_next),
+ __length_hint__ = interp2app(W_BaseDictMultiIterObject.descr_length_hint)
)
W_DictMultiIterKeysObject.typedef = StdTypeDef(
"dict_iterkeys",
- __iter__ = gateway.interp2app(W_DictMultiIterKeysObject.descr_iter),
- next = gateway.interp2app(W_DictMultiIterKeysObject.descr_next),
- __length_hint__ = gateway.interp2app(W_BaseDictMultiIterObject.descr_length_hint)
+ __iter__ = interp2app(W_DictMultiIterKeysObject.descr_iter),
+ next = interp2app(W_DictMultiIterKeysObject.descr_next),
+ __length_hint__ = interp2app(W_BaseDictMultiIterObject.descr_length_hint)
)
W_DictMultiIterValuesObject.typedef = StdTypeDef(
"dict_itervalues",
- __iter__ = gateway.interp2app(W_DictMultiIterValuesObject.descr_iter),
- next = gateway.interp2app(W_DictMultiIterValuesObject.descr_next),
- __length_hint__ = gateway.interp2app(W_BaseDictMultiIterObject.descr_length_hint)
+ __iter__ = interp2app(W_DictMultiIterValuesObject.descr_iter),
+ next = interp2app(W_DictMultiIterValuesObject.descr_next),
+ __length_hint__ = interp2app(W_BaseDictMultiIterObject.descr_length_hint)
)
@@ -1276,6 +1273,14 @@
def descr_len(self, space):
return space.len(self.w_dict)
+class SetLikeDictView(object):
+ _mixin_ = True
+
+ def descr_sub(self, space, w_otherview):
+ w_set = space.call_function(space.w_set, self)
+ space.call_method(w_set, "difference_update", w_otherview)
+ return w_set
+
def descr_and(self, space, w_otherview):
w_set = space.call_function(space.w_set, self)
space.call_method(w_set, "intersection_update", w_otherview)
@@ -1291,11 +1296,11 @@
space.call_method(w_set, "symmetric_difference_update", w_otherview)
return w_set
-class W_DictViewItemsObject(W_DictViewObject):
+class W_DictViewItemsObject(W_DictViewObject, SetLikeDictView):
def descr_iter(self, space):
return W_DictMultiIterItemsObject(space, self.w_dict.iteritems())
-class W_DictViewKeysObject(W_DictViewObject):
+class W_DictViewKeysObject(W_DictViewObject, SetLikeDictView):
def descr_iter(self, space):
return W_DictMultiIterKeysObject(space, self.w_dict.iterkeys())
@@ -1305,33 +1310,32 @@
W_DictViewItemsObject.typedef = StdTypeDef(
"dict_items",
- __repr__ = gateway.interp2app(W_DictViewItemsObject.descr_repr),
- __eq__ = gateway.interp2app(W_DictViewItemsObject.descr_eq),
- __len__ = gateway.interp2app(W_DictViewItemsObject.descr_len),
- __iter__ = gateway.interp2app(W_DictViewItemsObject.descr_iter),
- __and__ = gateway.interp2app(W_DictViewItemsObject.descr_and),
- __or__ = gateway.interp2app(W_DictViewItemsObject.descr_or),
- __xor__ = gateway.interp2app(W_DictViewItemsObject.descr_xor)
+ __repr__ = interp2app(W_DictViewItemsObject.descr_repr),
+ __eq__ = interp2app(W_DictViewItemsObject.descr_eq),
+ __len__ = interp2app(W_DictViewItemsObject.descr_len),
+ __iter__ = interp2app(W_DictViewItemsObject.descr_iter),
+ __sub__ = interp2app(W_DictViewItemsObject.descr_sub),
+ __and__ = interp2app(W_DictViewItemsObject.descr_and),
+ __or__ = interp2app(W_DictViewItemsObject.descr_or),
+ __xor__ = interp2app(W_DictViewItemsObject.descr_xor)
)
W_DictViewKeysObject.typedef = StdTypeDef(
"dict_keys",
- __repr__ = gateway.interp2app(W_DictViewKeysObject.descr_repr),
- __eq__ = gateway.interp2app(W_DictViewKeysObject.descr_eq),
- __len__ = gateway.interp2app(W_DictViewKeysObject.descr_len),
- __iter__ = gateway.interp2app(W_DictViewKeysObject.descr_iter),
- __and__ = gateway.interp2app(W_DictViewKeysObject.descr_and),
- __or__ = gateway.interp2app(W_DictViewKeysObject.descr_or),
- __xor__ = gateway.interp2app(W_DictViewKeysObject.descr_xor)
+ __repr__ = interp2app(W_DictViewKeysObject.descr_repr),
+ __eq__ = interp2app(W_DictViewKeysObject.descr_eq),
+ __len__ = interp2app(W_DictViewKeysObject.descr_len),
+ __iter__ = interp2app(W_DictViewKeysObject.descr_iter),
+ __sub__ = interp2app(W_DictViewKeysObject.descr_sub),
+ __and__ = interp2app(W_DictViewKeysObject.descr_and),
+ __or__ = interp2app(W_DictViewKeysObject.descr_or),
+ __xor__ = interp2app(W_DictViewKeysObject.descr_xor)
)
W_DictViewValuesObject.typedef = StdTypeDef(
"dict_values",
- __repr__ = gateway.interp2app(W_DictViewValuesObject.descr_repr),
- __eq__ = gateway.interp2app(W_DictViewValuesObject.descr_eq),
- __len__ = gateway.interp2app(W_DictViewValuesObject.descr_len),
- __iter__ = gateway.interp2app(W_DictViewValuesObject.descr_iter),
- __and__ = gateway.interp2app(W_DictViewValuesObject.descr_and),
- __or__ = gateway.interp2app(W_DictViewValuesObject.descr_or),
- __xor__ = gateway.interp2app(W_DictViewValuesObject.descr_xor)
+ __repr__ = interp2app(W_DictViewValuesObject.descr_repr),
+ __eq__ = interp2app(W_DictViewValuesObject.descr_eq),
+ __len__ = interp2app(W_DictViewValuesObject.descr_len),
+ __iter__ = interp2app(W_DictViewValuesObject.descr_iter),
)
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
@@ -774,6 +774,13 @@
assert d1.viewkeys() ^ set(d2.viewkeys()) == set('ac')
assert d1.viewkeys() ^ set(d3.viewkeys()) == set('abde')
+ assert d1.viewkeys() - d1.viewkeys() == set()
+ assert d1.viewkeys() - d2.viewkeys() == set('a')
+ assert d1.viewkeys() - d3.viewkeys() == set('ab')
+ assert d1.viewkeys() - set(d1.viewkeys()) == set()
+ assert d1.viewkeys() - set(d2.viewkeys()) == set('a')
+ assert d1.viewkeys() - set(d3.viewkeys()) == set('ab')
+
def test_items_set_operations(self):
d1 = {'a': 1, 'b': 2}
d2 = {'a': 2, 'b': 2}
@@ -802,6 +809,10 @@
assert (d1.viewitems() ^ d3.viewitems() ==
set([('a', 1), ('b', 2), ('d', 4), ('e', 5)]))
+ assert d1.viewitems() - d1.viewitems() == set()
+ assert d1.viewitems() - d2.viewitems() == set([('a', 1)])
+ assert d1.viewitems() - d3.viewitems() == set([('a', 1), ('b', 2)])
+
class AppTestStrategies(object):
def setup_class(cls):
More information about the pypy-commit
mailing list