[pypy-svn] r12358 - pypy/dist/pypy/objspace/std
arigo at codespeak.net
arigo at codespeak.net
Mon May 16 15:56:22 CEST 2005
Author: arigo
Date: Mon May 16 15:56:22 2005
New Revision: 12358
Modified:
pypy/dist/pypy/objspace/std/dictobject.py
Log:
W_DictObject: got rid of non_empties(), which was a bit useless because in
most usages we still need to check if entries have been deleted in the
meantime by mutating space operations. Changed a few space.getitem() with
direct calls to lookdict().
--This line, and those below, will be ignored--
M std/dictobject.py
Modified: pypy/dist/pypy/objspace/std/dictobject.py
==============================================================================
--- pypy/dist/pypy/objspace/std/dictobject.py (original)
+++ pypy/dist/pypy/objspace/std/dictobject.py Mon May 16 15:56:22 2005
@@ -61,9 +61,6 @@
if entry.w_value is not None:
self.insert(entry.hash, entry.w_key, entry.w_value)
- def non_empties(self):
- return [entry for entry in self.data if entry.w_value is not None]
-
def lookdict(self, lookup_hash, w_lookup):
assert isinstance(lookup_hash, r_uint)
space = self.space
@@ -98,9 +95,10 @@
def unwrap(w_dict):
space = w_dict.space
result = {}
- for entry in w_dict.non_empties():
- # XXX generic mixed types unwrap
- result[space.unwrap(entry.w_key)] = space.unwrap(entry.w_value)
+ for entry in w_dict.data:
+ if entry.w_value is not None:
+ # XXX generic mixed types unwrap
+ result[space.unwrap(entry.w_key)] = space.unwrap(entry.w_value)
return result
registerimplementation(W_DictObject)
@@ -169,22 +167,16 @@
if space.is_true(space.is_(w_left, w_right)):
return space.w_True
- dataleft = w_left.non_empties()
- dataright = w_right.non_empties()
- if len(dataleft) != len(dataright):
+ if w_left.used != w_right.used:
return space.w_False
- for entry in dataleft:
+ for entry in w_left.data:
w_val = entry.w_value
if w_val is None:
continue
- w_key = entry.w_key
- try:
- w_rightval = space.getitem(w_right, w_key)
- except OperationError, e:
- if e.match(space, space.w_KeyError):
- return space.w_False
- raise
- if not space.is_true(space.eq(w_val, w_rightval)):
+ rightentry = w_right.lookdict(entry.hash, entry.w_key)
+ if rightentry.w_value is None:
+ return space.w_False
+ if not space.eq_w(w_val, rightentry.w_value):
return space.w_False
return space.w_True
@@ -199,33 +191,28 @@
continue
w_key = entry.w_key
if w_smallest_diff_a_key is None or space.is_true(space.lt(w_key, w_smallest_diff_a_key)):
- try:
- w_b_value = space.getitem(w_b, w_key)
- except OperationError, e:
- if not e.match(space, space.w_KeyError):
- raise
+ b_entry = w_b.lookdict(entry.hash, w_key)
+ if b_entry.w_value is None:
w_its_value = w_val
w_smallest_diff_a_key = w_key
else:
- if not space.eq_w(w_val, w_b_value):
+ if not space.eq_w(w_val, b_entry.w_value):
w_its_value = w_val
w_smallest_diff_a_key = w_key
return w_smallest_diff_a_key, w_its_value
def lt__Dict_Dict(space, w_left, w_right):
# Different sizes, no problem
- dataleft = w_left.non_empties()
- dataright = w_right.non_empties()
- if len(dataleft) < len(dataright):
+ if w_left.used < w_right.used:
return space.w_True
- if len(dataleft) > len(dataright):
+ if w_left.used > w_right.used:
return space.w_False
# Same size
- w_leftdiff, w_leftval = characterize(space, dataleft, w_right)
+ w_leftdiff, w_leftval = characterize(space, w_left.data, w_right)
if w_leftdiff is None:
return space.w_False
- w_rightdiff, w_rightval = characterize(space, dataright, w_left)
+ w_rightdiff, w_rightval = characterize(space, w_right.data, w_left)
w_res = space.w_False
if w_rightdiff is not None:
w_res = space.lt(w_leftdiff, w_rightdiff)
More information about the Pypy-commit
mailing list