[pypy-commit] pypy refactor-signature: invent numbering

fijal noreply at buildbot.pypy.org
Wed Dec 14 11:28:52 CET 2011


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: refactor-signature
Changeset: r50492:3edbb810b5a0
Date: 2011-12-14 12:28 +0200
http://bitbucket.org/pypy/pypy/changeset/3edbb810b5a0/

Log:	invent numbering

diff --git a/pypy/module/micronumpy/signature.py b/pypy/module/micronumpy/signature.py
--- a/pypy/module/micronumpy/signature.py
+++ b/pypy/module/micronumpy/signature.py
@@ -35,7 +35,36 @@
         raise NotImplementedError
 
     def invent_numbering(self):
-        pass # XXX
+        cache = r_dict(sigeq, sighash)
+        self._invent_numbering(cache)
+
+    def _invent_numbering(self, cache):
+        try:
+            no = cache[self]
+        except KeyError:
+            no = len(cache)
+            cache[self] = no
+        self.iter_no = no    
+
+class ConcreteSignature(Signature):
+    def __init__(self, dtype):
+        self.dtype = dtype
+
+    def eq(self, other):
+        if type(self) is not type(other):
+            return False
+        return self.dtype is other.dtype
+
+    def hash(self):
+        return compute_identity_hash(self.dtype)
+
+class ArraySignature(ConcreteSignature):
+    def debug_repr(self):
+        return 'Array'
+
+class ScalarSignature(ConcreteSignature):
+    def debug_repr(self):
+        return 'Scalar'
 
 class ViewSignature(Signature):
     def __init__(self, child):
@@ -52,36 +81,6 @@
     def debug_repr(self):
         return 'Slice(%s)' % self.child.debug_repr()
 
-class ArraySignature(Signature):
-    def __init__(self, dtype):
-        self.dtype = dtype
-
-    def eq(self, other):
-        if type(self) is not type(other):
-            return False
-        return self.dtype is other.dtype
-
-    def hash(self):
-        return compute_identity_hash(self.dtype)
-
-    def debug_repr(self):
-        return 'Array'
-
-class ScalarSignature(Signature):
-    def __init__(self, dtype):
-        self.dtype = dtype
-
-    def eq(self, other):
-        if type(self) is not type(other):
-            return False
-        return self.dtype is other.dtype
-
-    def hash(self):
-        return compute_identity_hash(self.dtype)
-
-    def debug_repr(self):
-        return 'Scalar'
-
 class FlatiterSignature(ViewSignature):
     def debug_repr(self):
         return 'FlatIter(%s)' % self.child.debug_repr()
@@ -103,6 +102,9 @@
         return 'Call1(%s, %s)' % (self.name,
                                   self.child.debug_repr())
 
+    def _invent_numbering(self, cache):
+        self.values._invent_numbering(cache)
+
 class Call2(Signature):
     def __init__(self, func, left, right):
         self.binfunc = func
@@ -119,6 +121,10 @@
         return (self.binfunc is other.binfunc and
                 self.left.eq(other.left) and self.right.eq(other.right))
 
+    def _invent_numbering(self, cache):
+        self.left._invent_numbering(cache)
+        self.right._invent_numbering(cache)
+
     def debug_repr(self):
         return 'Call2(%s, %s, %s)' % (self.name,
                                       self.left.debug_repr(),
diff --git a/pypy/module/micronumpy/test/test_base.py b/pypy/module/micronumpy/test/test_base.py
--- a/pypy/module/micronumpy/test/test_base.py
+++ b/pypy/module/micronumpy/test/test_base.py
@@ -17,9 +17,14 @@
         ar = W_NDimArray(10, [10], dtype=float64_dtype)
         v1 = ar.descr_add(space, ar)
         v2 = ar.descr_add(space, Scalar(float64_dtype, 2.0))
-        assert v1.find_sig() is not v2.find_sig()
+        sig1 = v1.find_sig()
+        sig2 = v2.find_sig()
+        assert v1 is not v2
+        assert sig1.left.iter_no == sig1.right.iter_no
+        assert sig2.left.iter_no != sig2.right.iter_no
         v3 = ar.descr_add(space, Scalar(float64_dtype, 1.0))
-        assert v2.find_sig() is v3.find_sig()
+        sig3 = v3.find_sig()
+        assert sig2 is sig3
         v4 = ar.descr_add(space, ar)
         assert v1.find_sig() is v4.find_sig()
 


More information about the pypy-commit mailing list