[pypy-svn] r51207 - in pypy/branch/jit-refactoring/pypy/jit/timeshifter: . test

cfbolz at codespeak.net cfbolz at codespeak.net
Sat Feb 2 13:34:40 CET 2008


Author: cfbolz
Date: Sat Feb  2 13:34:40 2008
New Revision: 51207

Modified:
   pypy/branch/jit-refactoring/pypy/jit/timeshifter/greenkey.py
   pypy/branch/jit-refactoring/pypy/jit/timeshifter/test/test_greenkey.py
Log:
some cleanups, introduce a special empty key


Modified: pypy/branch/jit-refactoring/pypy/jit/timeshifter/greenkey.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/timeshifter/greenkey.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/timeshifter/greenkey.py	Sat Feb  2 13:34:40 2008
@@ -7,10 +7,16 @@
 class KeyDesc(object):
     __metaclass__ = cachedtype
 
-    def __init__(self, RGenOp, *TYPES):
+    def __init__(self, RGenOp=None, *TYPES):
         self.RGenOp = RGenOp
         self.TYPES = TYPES
         TARGETTYPES = []
+
+        if RGenOp is None:
+            assert len(TYPES) == 0
+            self.hash = lambda self: 0
+            self.compare = lambda self, other: True
+
         for TYPE in TYPES:
             # XXX more cases?
             TARGET = lltype.Signed
@@ -20,7 +26,7 @@
 
         iterator = unrolling_iterable(enumerate(TARGETTYPES))
         length = len(TYPES)
-        def greenhash(self, rgenop):
+        def greenhash(self):
             retval = 0x345678
             mult = 1000003
             for i, TARGET in iterator:
@@ -30,7 +36,7 @@
                 mult = mult + 82520 + 2*length
             return retval
         self.hash = greenhash
-        def greencompare(self, other, rgenop):
+        def greencompare(self, other):
             for i, TARGET in iterator:
                 genconst = self.values[i]
                 item_self = genconst.revealconst(TARGET)
@@ -46,10 +52,9 @@
 
 
 class GreenKey(object):
-    def __init__(self, values, desc, rgenop):
+    def __init__(self, values, desc):
         self.desc = desc
         self.values = values
-        self.rgenop = rgenop
 
     def __eq__(self, other):
         raise TypeError("don't store GreenKeys in a normal dict")
@@ -61,17 +66,16 @@
         raise TypeError("not hashable")
 
 def greenkey_eq(self, other):
-    assert self.rgenop is other.rgenop
     if self is other:
         return True
     if self.desc is not other.desc:
         return False
-    return self.desc.compare(self, other, self.rgenop)
+    return self.desc.compare(self, other)
 
 def greenkey_hash(self):
-    return self.desc.hash(self, self.rgenop)
+    return self.desc.hash(self)
 
 def newgreendict():
     return r_dict(greenkey_eq, greenkey_hash)
 
-
+empty_key = GreenKey([], KeyDesc())

Modified: pypy/branch/jit-refactoring/pypy/jit/timeshifter/test/test_greenkey.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/timeshifter/test/test_greenkey.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/timeshifter/test/test_greenkey.py	Sat Feb  2 13:34:40 2008
@@ -1,5 +1,5 @@
 from pypy.jit.timeshifter.greenkey import GreenKey, KeyDesc, newgreendict
-from pypy.jit.timeshifter.greenkey import greenkey_hash, greenkey_eq
+from pypy.jit.timeshifter.greenkey import greenkey_hash, greenkey_eq, empty_key
 from pypy.jit.codegen.llgraph.rgenop import RGenOp
 from pypy.rpython.lltypesystem import lltype
 
@@ -8,7 +8,7 @@
 class TestGreenKeys(object):
     def newkey(self, *values):
         desc = KeyDesc(RGenOp, *[lltype.typeOf(val) for val in values])
-        return GreenKey([rgenop.genconst(val) for val in values], desc, rgenop)
+        return GreenKey([rgenop.genconst(val) for val in values], desc)
 
     def test_simple(self):
         d = newgreendict()
@@ -24,3 +24,10 @@
         d = newgreendict()
         d[self.newkey(1, 2)] = 1
         assert self.newkey(1, 2, 0) not in d
+
+    def test_empty_key(self):
+        d = newgreendict()
+        assert empty_key not in d
+        d[empty_key] = 1
+        assert d[empty_key] == 1
+        assert self.newkey(1, 2, 0) not in d



More information about the Pypy-commit mailing list