Author: Carl Friedrich Bolz <cfb...@gmx.de> Branch: list-strategies Changeset: r47677:cb61b577bb9f Date: 2011-09-29 11:30 +0200 http://bitbucket.org/pypy/pypy/changeset/cb61b577bb9f/
Log: implement id to match the new is behaviour. diff --git a/pypy/objspace/std/objspace.py b/pypy/objspace/std/objspace.py --- a/pypy/objspace/std/objspace.py +++ b/pypy/objspace/std/objspace.py @@ -472,6 +472,30 @@ self.unicode_w(w_one) is self.unicode_w(w_two)) return w_one is w_two + def id(self, w_obj): + from pypy.rlib import objectmodel, rbigint + from pypy.rlib.rstruct import ieee + w_type = self.type(w_obj) + if w_type is self.w_int: + tag = 1 + return self.or_(self.lshift(w_obj, self.wrap(3)), self.wrap(tag)) + elif w_type is self.w_long: + tag = 3 + return self.or_(self.lshift(w_obj, self.wrap(3)), self.wrap(tag)) + elif w_type is self.w_float: + tag = 5 + val = ieee.float_pack(self.float_w(w_obj), 8) + w_obj = self.newlong_from_rbigint(rbigint.rbigint.fromrarith_int(val)) + return self.or_(self.lshift(w_obj, self.wrap(3)), self.wrap(tag)) + # XXX complex? + elif w_type is self.w_str: + res = objectmodel.compute_unique_id(self.str_w(w_obj)) + elif w_type is self.w_unicode: + res = objectmodel.compute_unique_id(self.unicode_w(w_obj)) + else: + res = objectmodel.compute_unique_id(w_obj) + return self.wrap(res) + def is_true(self, w_obj): # a shortcut for performance # NOTE! this method is typically overridden by builtinshortcut.py. diff --git a/pypy/objspace/std/test/test_obj.py b/pypy/objspace/std/test/test_obj.py --- a/pypy/objspace/std/test/test_obj.py +++ b/pypy/objspace/std/test/test_obj.py @@ -16,6 +16,9 @@ def w_unwrap_wrap_unicode(space, w_obj): return space.wrap(space.unicode_w(w_obj)) cls.w_unwrap_wrap_unicode = space.wrap(gateway.interp2app(w_unwrap_wrap_unicode)) + def w_unwrap_wrap_str(space, w_obj): + return space.wrap(space.str_w(w_obj)) + cls.w_unwrap_wrap_str = space.wrap(gateway.interp2app(w_unwrap_wrap_str)) def test_hash_builtin(self): if not self.cpython_behavior: @@ -130,3 +133,19 @@ u = u"a" assert self.unwrap_wrap_unicode(u) is u + def test_id(self): + assert id(1) == (1 << 3) + 1 + assert id(1l) == (1 << 3) + 3 + class myint(int): + pass + assert id(myint(1)) != id(1) + + assert id(1.0) & 7 == 5 + assert id(-0.0) != id(0.0) + assert hex(id(2.0)) == '0x20000000000000005L' + assert id(0.0) == 5 + + u = u"a" + assert id(self.unwrap_wrap_unicode(u)) == id(u) + s = "a" + assert id(self.unwrap_wrap_str(s)) == id(s) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit