Author: Philip Jenvey <pjen...@underboss.org> Branch: py3k-fix-strategies Changeset: r70740:806adbe54237 Date: 2014-04-17 17:41 -0700 http://bitbucket.org/pypy/pypy/changeset/806adbe54237/
Log: more progress, have _str methods accept utf-8 encoded strs, for the sake of compat. w/ default diff --git a/pypy/objspace/std/bytesobject.py b/pypy/objspace/std/bytesobject.py --- a/pypy/objspace/std/bytesobject.py +++ b/pypy/objspace/std/bytesobject.py @@ -401,7 +401,7 @@ def buffer_w(w_self, space): return StringBuffer(w_self._value) - # XXX: could provide listview_int + # XXX: could provide listview_int? #def listview_bytes(self): # return _create_list_from_bytes(self._value) 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 @@ -117,9 +117,10 @@ w_type) byteslist = space.listview_bytes(w_keys) - if byteslist is not None: + # XXX: py3k could switch this to listview_unicode, but our + # setitem_str accepts utf-8 encoded strs, not unicode! + if False and byteslist is not None: for key in byteslist: - # XXX: bytes is tied to setitem_str here! w_dict.setitem_str(key, w_fill) else: for w_key in space.listview(w_keys): @@ -361,6 +362,9 @@ def get_empty_storage(self): raise NotImplementedError + def decodekey_str(self, key): + return key.decode('utf-8') + @jit.look_inside_iff(lambda self, w_dict: w_dict_unrolling_heuristic(w_dict)) def w_keys(self, w_dict): @@ -701,9 +705,7 @@ def setitem_str(self, w_dict, key, w_value): self.switch_to_object_strategy(w_dict) - # XXX: wrap(key) means we only allow ascii to - # setitem_str. should probaby allow utf-8 - w_dict.setitem(self.space.wrap(key), w_value) + w_dict.setitem(self.space.wrap(self.decodekey_str(key)), w_value) def setdefault(self, w_dict, w_key, w_default): if self.is_correct_type(w_key): @@ -725,9 +727,7 @@ return len(self.unerase(w_dict.dstorage)) def getitem_str(self, w_dict, key): - # XXX: wrapping here caused some issues w/ - # ByteDictStrat.. double check - return self.getitem(w_dict, self.space.wrap(key)) + return self.getitem(w_dict, self.space.wrap(self.decodekey_str(key))) def getitem(self, w_dict, w_key): space = self.space @@ -807,7 +807,7 @@ return self.space.newlist(self.unerase(w_dict.dstorage).keys()) def setitem_str(self, w_dict, s, w_value): - self.setitem(w_dict, self.space.wrap(s), w_value) + self.setitem(w_dict, self.space.wrap(self.decodekey_str(s)), w_value) def switch_to_object_strategy(self, w_dict): assert 0, "should be unreachable" @@ -907,7 +907,7 @@ def setitem_str(self, w_dict, key, w_value): assert key is not None - self.unerase(w_dict.dstorage)[key.decode('ascii')] = w_value + self.unerase(w_dict.dstorage)[self.decodekey_str(key)] = w_value def getitem(self, w_dict, w_key): space = self.space @@ -919,7 +919,7 @@ def getitem_str(self, w_dict, key): assert key is not None - return self.unerase(w_dict.dstorage).get(key.decode('utf-8'), None) + return self.unerase(w_dict.dstorage).get(self.decodekey_str(key), None) def listview_unicode(self, w_dict): return self.unerase(w_dict.dstorage).keys() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit