[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