[pypy-svn] r53374 - pypy/branch/jit-hotpath/pypy/jit/codegen/test

fijal at codespeak.net fijal at codespeak.net
Sat Apr 5 05:36:06 CEST 2008


Author: fijal
Date: Sat Apr  5 05:36:06 2008
New Revision: 53374

Modified:
   pypy/branch/jit-hotpath/pypy/jit/codegen/test/rgenop_tests.py
Log:
add a new test for interior access of float stuff


Modified: pypy/branch/jit-hotpath/pypy/jit/codegen/test/rgenop_tests.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/codegen/test/rgenop_tests.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/codegen/test/rgenop_tests.py	Sat Apr  5 05:36:06 2008
@@ -2330,6 +2330,43 @@
         result = fnptr(42)
         assert result == 47
 
+    def test_interior_access_float(self):
+        if self.RGenOpPacked is None:
+            py.test.skip("requires RGenOpPacked")
+        T = lltype.Struct('T', ('x', lltype.Float))
+        A = lltype.Array(T)
+        S = lltype.GcStruct('S', ('a', A))
+        rgenop = self.RGenOpPacked()
+        FUNC = lltype.FuncType([lltype.Float], lltype.Float)
+        sigtoken = rgenop.sigToken(FUNC)
+        builder, gv_fn, [gv_x] = rgenop.newgraph(sigtoken,
+                                                 "interior_access_float")
+        builder.start_writing()
+        gv_s = builder.genop_malloc_varsize(rgenop.varsizeAllocToken(S),
+                                            rgenop.genconst(5))
+        # generate an expanded 'setinteriorfield'
+        gv_a1 = builder.genop_getsubstruct(rgenop.fieldToken(S, 'a'), gv_s)
+        gv_t1 = builder.genop_getarraysubstruct(rgenop.arrayToken(A),
+                                                gv_a1, rgenop.genconst(3))
+        builder.genop_setfield(rgenop.fieldToken(T, 'x'), gv_t1, gv_x)
+        # generate an expanded 'getinteriorfield'
+        gv_a1 = builder.genop_getsubstruct(rgenop.fieldToken(S, 'a'), gv_s)
+        gv_t1 = builder.genop_getarraysubstruct(rgenop.arrayToken(A),
+                                                gv_a1, rgenop.genconst(3))
+        gv_y = builder.genop_getfield(rgenop.fieldToken(T, 'x'), gv_t1)
+        # generate an expanded 'getinteriorarraysize'
+        gv_a1 = builder.genop_getsubstruct(rgenop.fieldToken(S, 'a'), gv_s)
+        gv_z = builder.genop_getarraysize(rgenop.arrayToken(A), gv_a1)
+        # return
+        gv_z1 = builder.genop1('cast_int_to_float', gv_z)
+        gv_result = builder.genop2("float_add", gv_y, gv_z1)
+        builder.finish_and_return(sigtoken, gv_result)
+        builder.end()
+
+        fnptr = self.cast_whatever(gv_fn, [lltype.Float], lltype.Float)
+        result = fnptr(42.3)
+        assert result == 42.3 + 5
+
     def test_void_return(self):
         # XXX minimal test only
         rgenop = self.RGenOp()



More information about the Pypy-commit mailing list