Author: Alex Gaynor <[email protected]>
Branch:
Changeset: r49936:f78e1babd94f
Date: 2011-11-28 19:44 -0500
http://bitbucket.org/pypy/pypy/changeset/f78e1babd94f/
Log: implement setslice in numpy's minilang and add convert a test_zjit,
it's failing
diff --git a/pypy/module/micronumpy/compile.py
b/pypy/module/micronumpy/compile.py
--- a/pypy/module/micronumpy/compile.py
+++ b/pypy/module/micronumpy/compile.py
@@ -97,7 +97,7 @@
return w_obj
def float_w(self, w_obj):
- assert isinstance(w_obj, FloatObject)
+ assert isinstance(w_obj, FloatObject)
return w_obj.floatval
def int_w(self, w_obj):
@@ -208,11 +208,15 @@
def execute(self, interp):
arr = interp.variables[self.name]
- w_index =
self.index.execute(interp).eval(arr.start_iter()).wrap(interp.space)
- # cast to int
- if isinstance(w_index, FloatObject):
- w_index = IntObject(int(w_index.floatval))
- w_val =
self.expr.execute(interp).eval(arr.start_iter()).wrap(interp.space)
+ if isinstance(self.index, SliceConstant):
+ w_index = self.index.wrap(interp.space)
+ w_val = self.expr.execute(interp)
+ else:
+ w_index =
self.index.execute(interp).eval(arr.start_iter()).wrap(interp.space)
+ # cast to int
+ if isinstance(w_index, FloatObject):
+ w_index = IntObject(int(w_index.floatval))
+ w_val =
self.expr.execute(interp).eval(arr.start_iter()).wrap(interp.space)
arr.descr_setitem(interp.space, w_index, w_val)
def __repr__(self):
@@ -246,7 +250,7 @@
elif self.name == '*':
w_res = w_lhs.descr_mul(interp.space, w_rhs)
elif self.name == '-':
- w_res = w_lhs.descr_sub(interp.space, w_rhs)
+ w_res = w_lhs.descr_sub(interp.space, w_rhs)
elif self.name == '->':
if isinstance(w_rhs, Scalar):
w_rhs = w_rhs.eval(w_rhs.start_iter()).wrap(interp.space)
@@ -477,8 +481,8 @@
else:
step = 1
return SliceConstant(start, stop, step)
-
-
+
+
def parse_expression(self, tokens):
stack = []
while tokens.remaining():
@@ -532,7 +536,7 @@
if token.name == 'array_right':
return elems
assert token.name == 'coma'
-
+
def parse_statement(self, tokens):
if (tokens.get(0).name == 'identifier' and
tokens.get(1).name == 'assign'):
diff --git a/pypy/module/micronumpy/test/test_compile.py
b/pypy/module/micronumpy/test/test_compile.py
--- a/pypy/module/micronumpy/test/test_compile.py
+++ b/pypy/module/micronumpy/test/test_compile.py
@@ -177,6 +177,16 @@
""")
assert interp.results[0].value.val == 6
+ def test_setslice(self):
+ interp = self.run("""
+ a = |30|
+ b = |10|
+ b[1] = 5
+ a[::3] = b
+ a -> 3
+ """)
+ assert interp.results[0].value.val == 5
+
def test_multidim_getitem(self):
interp = self.run("""
a = [[1,2]]
diff --git a/pypy/module/micronumpy/test/test_zjit.py
b/pypy/module/micronumpy/test/test_zjit.py
--- a/pypy/module/micronumpy/test/test_zjit.py
+++ b/pypy/module/micronumpy/test/test_zjit.py
@@ -295,6 +295,24 @@
py.test.skip("improve")
self.check_simple_loop({})
+ def define_setslice():
+ return """
+ a = |30|
+ b = |10|
+ b[1] = 5.5
+ c = b + b
+ a[0:30:3] = c
+ a -> 3
+ """
+
+ def test_setslice(self):
+ result = self.run("setslice")
+ assert result == 11.0
+ py.test.skip("generates 2 loops ATM, investigate")
+ self.check_simple_loop({'getarrayitem_raw': 2, 'float_add' : 1,
+ 'setarrayitem_raw': 1, 'int_add': 2,
+ 'int_lt': 1, 'guard_true': 1, 'jump': 1})
+
class TestNumpyOld(LLJitMixin):
def setup_class(cls):
py.test.skip("old")
@@ -326,26 +344,6 @@
'int_lt': 1, 'guard_true': 1, 'jump': 1})
assert result == f(5)
- def test_setslice(self):
- space = self.space
- float64_dtype = self.float64_dtype
-
- def f(i):
- step = NonConstant(3)
- ar = NDimArray(step*i, dtype=float64_dtype)
- ar2 = NDimArray(i, dtype=float64_dtype)
- ar2.get_concrete().setitem(1, float64_dtype.box(5.5))
- arg = ar2.descr_add(space, ar2)
- ar.setslice(space, 0, step*i, step, i, arg)
- return ar.get_concrete().eval(3).val
-
- result = self.meta_interp(f, [5], listops=True, backendopt=True)
- self.check_simple_loop({'getarrayitem_raw': 2,
- 'float_add' : 1,
- 'setarrayitem_raw': 1, 'int_add': 2,
- 'int_lt': 1, 'guard_true': 1, 'jump': 1})
- assert result == 11.0
-
def test_int32_sum(self):
py.test.skip("pypy/jit/backend/llimpl.py needs to be changed to "
"deal correctly with int dtypes for this test to "
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit