[pypy-commit] pypy default: Write a failing test for test_zjit
fijal
noreply at buildbot.pypy.org
Tue Nov 29 08:35:24 CET 2011
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch:
Changeset: r49938:83cd4d2690b1
Date: 2011-11-29 09:22 +0200
http://bitbucket.org/pypy/pypy/changeset/83cd4d2690b1/
Log: Write a failing test for test_zjit
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
@@ -208,11 +208,12 @@
def execute(self, interp):
arr = interp.variables[self.name]
- w_index = self.index.execute(interp).eval(arr.start_iter()).wrap(interp.space)
+ w_index = self.index.execute(interp)
# 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)
+ w_val = self.expr.execute(interp)
+ assert isinstance(arr, BaseArray)
arr.descr_setitem(interp.space, w_index, w_val)
def __repr__(self):
@@ -240,6 +241,10 @@
w_rhs = self.rhs.wrap(interp.space)
else:
w_rhs = self.rhs.execute(interp)
+ if not isinstance(w_lhs, BaseArray):
+ # scalar
+ dtype = interp.space.fromcache(W_Float64Dtype)
+ w_lhs = scalar_w(interp.space, dtype, w_lhs)
assert isinstance(w_lhs, BaseArray)
if self.name == '+':
w_res = w_lhs.descr_add(interp.space, w_rhs)
@@ -248,10 +253,10 @@
elif self.name == '-':
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)
- assert isinstance(w_rhs, FloatObject)
+ assert not isinstance(w_rhs, Scalar)
+ if isinstance(w_rhs, FloatObject):
w_rhs = IntObject(int(w_rhs.floatval))
+ assert isinstance(w_lhs, BaseArray)
w_res = w_lhs.descr_getitem(interp.space, w_rhs)
else:
raise NotImplementedError
@@ -274,9 +279,7 @@
return space.wrap(self.v)
def execute(self, interp):
- dtype = interp.space.fromcache(W_Float64Dtype)
- assert isinstance(dtype, W_Float64Dtype)
- return Scalar(dtype, dtype.box(self.v))
+ return FloatObject(self.v)
class RangeConstant(Node):
def __init__(self, v):
@@ -325,6 +328,9 @@
def wrap(self, space):
return SliceObject(self.start, self.stop, self.step)
+ def execute(self, interp):
+ return SliceObject(self.start, self.stop, self.step)
+
def __repr__(self):
return 'slice(%s,%s,%s)' % (self.start, self.stop, self.step)
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
@@ -191,3 +191,12 @@
b -> 1 -> 1
""")
assert interp.results[0].value.val == 8
+
+ def test_set_slice(self):
+ interp = self.run("""
+ a = |30|
+ b = |30|
+ b[:] = a + a
+ b -> 3
+ """)
+ assert interp.results[0].value.val == 6
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
@@ -11,7 +11,8 @@
from pypy.module.micronumpy import interp_ufuncs, signature
from pypy.module.micronumpy.compile import (numpy_compile, FakeSpace,
FloatObject, IntObject, BoolObject, Parser, InterpreterState)
-from pypy.module.micronumpy.interp_numarray import NDimArray, NDimSlice
+from pypy.module.micronumpy.interp_numarray import NDimArray, NDimSlice,\
+ BaseArray
from pypy.rlib.nonconst import NonConstant
from pypy.rpython.annlowlevel import llstr, hlstr
@@ -48,6 +49,7 @@
interp = InterpreterState(codes[i])
interp.run(space)
res = interp.results[-1]
+ assert isinstance(res, BaseArray)
w_res = res.eval(res.start_iter()).wrap(interp.space)
if isinstance(w_res, BoolObject):
return float(w_res.boolval)
@@ -301,6 +303,19 @@
py.test.skip("improve")
self.check_loops({})
+ def define_set_slice():
+ return """
+ a = |30|
+ b = |30|
+ b[:] = a + a
+ b -> 3
+ """
+
+ def test_set_slice(self):
+ result = self.run("set_slice")
+ assert result == 6
+ self.check_loop_count(1)
+
class TestNumpyOld(LLJitMixin):
def setup_class(cls):
py.test.skip("old")
@@ -332,26 +347,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_loops({'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 "
More information about the pypy-commit
mailing list