[pypy-commit] pypy refactor-signature: makes tests pass, they're super slow though
fijal
noreply at buildbot.pypy.org
Wed Dec 14 13:32:38 CET 2011
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: refactor-signature
Changeset: r50501:a2834b804b57
Date: 2011-12-14 14:32 +0200
http://bitbucket.org/pypy/pypy/changeset/a2834b804b57/
Log: makes tests pass, they're super slow though
diff --git a/pypy/module/micronumpy/interp_numarray.py b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -7,7 +7,7 @@
from pypy.rpython.lltypesystem import lltype, rffi
from pypy.tool.sourcetools import func_with_new_name
from pypy.rlib.rstring import StringBuilder
-from pypy.module.micronumpy.interp_iter import ArrayIterator
+from pypy.module.micronumpy.interp_iter import ArrayIterator, ViewIterator
numpy_driver = jit.JitDriver(
greens=['shapelen', 'sig'],
@@ -15,16 +15,19 @@
reds=['result_size', 'frame', 'ri', 'self', 'result']
)
all_driver = jit.JitDriver(
- greens=['shapelen', 'signature'],
- reds=['i', 'self', 'dtype']
+ greens=['shapelen', 'sig'],
+ virtualizables=['frame'],
+ reds=['frame', 'self', 'dtype']
)
any_driver = jit.JitDriver(
- greens=['shapelen', 'signature'],
- reds=['i', 'self', 'dtype']
+ greens=['shapelen', 'sig'],
+ virtualizables=['frame'],
+ reds=['frame', 'self', 'dtype']
)
slice_driver = jit.JitDriver(
- greens=['shapelen', 'signature'],
- reds=['self', 'source', 'source_iter', 'res_iter']
+ greens=['shapelen', 'sig'],
+ virtualizables=['frame'],
+ reds=['self', 'frame', 'source', 'res_iter']
)
def _find_shape_and_elems(space, w_iterable):
@@ -340,15 +343,16 @@
def _all(self):
dtype = self.find_dtype()
- i = self.start_iter()
+ sig = self.find_sig()
+ frame = sig.create_frame(self)
shapelen = len(self.shape)
- while not i.done():
- all_driver.jit_merge_point(signature=self.signature,
+ while not frame.done():
+ all_driver.jit_merge_point(sig=sig,
shapelen=shapelen, self=self,
- dtype=dtype, i=i)
- if not dtype.itemtype.bool(self.eval(i)):
+ dtype=dtype, frame=frame)
+ if not dtype.itemtype.bool(sig.eval(frame, self)):
return False
- i = i.next(shapelen)
+ frame.next(shapelen)
return True
def descr_all(self, space):
@@ -356,15 +360,16 @@
def _any(self):
dtype = self.find_dtype()
- i = self.start_iter()
+ sig = self.find_sig()
+ frame = sig.create_frame(self)
shapelen = len(self.shape)
- while not i.done():
- any_driver.jit_merge_point(signature=self.signature,
+ while not frame.done():
+ any_driver.jit_merge_point(sig=sig, frame=frame,
shapelen=shapelen, self=self,
- dtype=dtype, i=i)
- if dtype.itemtype.bool(self.eval(i)):
+ dtype=dtype)
+ if dtype.itemtype.bool(sig.eval(frame, self)):
return True
- i = i.next(shapelen)
+ frame.next(shapelen)
return False
def descr_any(self, space):
@@ -950,6 +955,10 @@
def __init__(self, parent, start, strides, backstrides, shape):
if isinstance(parent, W_NDimSlice):
parent = parent.parent
+ else:
+ # XXX this should not force the array, but it did before the
+ # refactoring anyway, just in a more obscure way
+ parent = parent.get_concrete()
ViewArray.__init__(self, parent, strides, backstrides, shape)
self.start = start
self.size = 1
@@ -967,18 +976,19 @@
self._sliceloop(w_value, res_shape)
def _sliceloop(self, source, res_shape):
- source_iter = source.start_iter(res_shape)
- res_iter = self.start_iter(res_shape)
+ sig = source.find_sig()
+ frame = sig.create_frame(source)
+ res_iter = ViewIterator(self)
shapelen = len(res_shape)
while not res_iter.done():
- slice_driver.jit_merge_point(signature=source.signature,
+ slice_driver.jit_merge_point(sig=sig,
+ frame=frame,
shapelen=shapelen,
self=self, source=source,
- res_iter=res_iter,
- source_iter=source_iter)
- self.setitem(res_iter.offset, source.eval(source_iter).convert_to(
+ res_iter=res_iter)
+ self.setitem(res_iter.offset, sig.eval(frame, source).convert_to(
self.find_dtype()))
- source_iter = source_iter.next(shapelen)
+ frame.next(shapelen)
res_iter = res_iter.next(shapelen)
def setitem(self, item, value):
@@ -986,8 +996,8 @@
def copy(self):
array = W_NDimArray(self.size, self.shape[:], self.find_dtype())
- iter = self.start_iter()
- a_iter = array.start_iter()
+ iter = ViewIterator(self)
+ a_iter = ArrayIterator(array.size)
while not iter.done():
array.setitem(a_iter.offset, self.getitem(iter.offset))
iter = iter.next(len(self.shape))
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,7 @@
return sig
class NumpyEvalFrame(object):
- _virtualizable2_ = ['iterators[*]']
+ _virtualizable2_ = ['iterators[*]', 'final_iter']
def __init__(self, iterators):
self = hint(self, access_directly=True)
@@ -131,6 +131,10 @@
iter = ViewIterator(arr)
iterlist.append(iter)
+ def eval(self, frame, arr):
+ iter = frame.iterators[self.iter_no]
+ return arr.find_dtype().getitem(arr.parent.storage, iter.offset)
+
class FlatiterSignature(ViewSignature):
def debug_repr(self):
return 'FlatIter(%s)' % self.child.debug_repr()
@@ -156,7 +160,7 @@
self.child.debug_repr())
def _invent_numbering(self, cache):
- self.values._invent_numbering(cache)
+ self.child._invent_numbering(cache)
def _create_iter(self, iterlist, arr, res_shape):
self.child._create_iter(iterlist, arr.values, res_shape)
More information about the pypy-commit
mailing list