[pypy-svn] pypy 32ptr-on-64bit: merge heads

arigo commits-noreply at bitbucket.org
Sun Apr 17 11:49:58 CEST 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: 32ptr-on-64bit
Changeset: r43425:023210fffbc7
Date: 2011-04-17 11:32 +0200
http://bitbucket.org/pypy/pypy/changeset/023210fffbc7/

Log:	merge heads

diff --git a/pypy/jit/metainterp/test/test_rcompressed.py b/pypy/jit/metainterp/test/test_rcompressed.py
--- a/pypy/jit/metainterp/test/test_rcompressed.py
+++ b/pypy/jit/metainterp/test/test_rcompressed.py
@@ -4,6 +4,7 @@
 from pypy.rpython.lltypesystem import lltype, llmemory
 from pypy.rpython.lltypesystem.lloperation import llop
 from pypy.rlib import jit
+from pypy.rlib.jit import JitDriver
 
 
 class TestRCompressed(LLJitMixin):
@@ -45,6 +46,9 @@
         res = self.interp_operations(f, [42])
         assert res == 42063
 
+    def test_store_load_array(self):
+        py.test.skip("write me")
+
     def test_call_argument(self):
         # the issue here is that even if we wrote this test, for now, it's
         # not going to really test the interesting parts, which are in
@@ -53,3 +57,28 @@
 
     def test_call_result(self):
         py.test.skip("write me")
+
+    def test_jit_merge_point(self):
+        jitdriver = JitDriver(greens=[], reds=['total', 'a'])
+        S = lltype.GcStruct('S', ('n', lltype.Signed))
+        def main(n):
+            a = f(n)
+            s = llop.show_from_ptr32(lltype.Ptr(S), a)
+            return s.n
+        def f(n):
+            s = lltype.malloc(S)
+            s.n = n
+            total = 0
+            while s.n > 0:
+                a = llop.hide_into_ptr32(llmemory.HiddenGcRef32, s)
+                jitdriver.jit_merge_point(a=a, total=total)
+                s = llop.show_from_ptr32(lltype.Ptr(S), a)
+                n = s.n
+                total += n
+                s = lltype.malloc(S)
+                s.n = n - 1
+            s = lltype.malloc(S)
+            s.n = total
+            return llop.hide_into_ptr32(llmemory.HiddenGcRef32, s)
+        res = self.meta_interp(main, [8])
+        assert res == 36

diff --git a/pypy/jit/metainterp/warmstate.py b/pypy/jit/metainterp/warmstate.py
--- a/pypy/jit/metainterp/warmstate.py
+++ b/pypy/jit/metainterp/warmstate.py
@@ -1,5 +1,6 @@
 import sys, weakref
 from pypy.rpython.lltypesystem import lltype, llmemory, rstr, rffi
+from pypy.rpython.lltypesystem.lloperation import llop
 from pypy.rpython.ootypesystem import ootype
 from pypy.rpython.annlowlevel import hlstr, llstr, cast_base_ptr_to_instance
 from pypy.rpython.annlowlevel import cast_object_to_ptr
@@ -30,21 +31,26 @@
     elif INPUT is longlong.FLOATSTORAGE:
         assert TYPE is lltype.Float
         return longlong.getrealfloat(x)
+    elif TYPE == llmemory.HiddenGcRef32:
+        return llop.hide_into_ptr32(llmemory.HiddenGcRef32, x)
     else:
         return lltype.cast_opaque_ptr(TYPE, x)
 
 @specialize.ll()
 def unspecialize_value(value):
     """Casts 'value' to a Signed, a GCREF or a FLOATSTORAGE."""
-    if isinstance(lltype.typeOf(value), lltype.Ptr):
-        if lltype.typeOf(value).TO._gckind == 'gc':
+    TYPE = lltype.typeOf(value)
+    if isinstance(TYPE, lltype.Ptr):
+        if TYPE.TO._gckind == 'gc':
+            if TYPE == llmemory.HiddenGcRef32:
+                return llop.show_from_ptr32(llmemory.GCREF, value)
             return lltype.cast_opaque_ptr(llmemory.GCREF, value)
         else:
             adr = llmemory.cast_ptr_to_adr(value)
             return heaptracker.adr2int(adr)
-    elif isinstance(lltype.typeOf(value), ootype.OOType):
+    elif isinstance(TYPE, ootype.OOType):
         return ootype.cast_to_object(value)
-    elif isinstance(value, float):
+    elif TYPE == lltype.Float:
         return longlong.getfloatstorage(value)
     else:
         return lltype.cast_primitive(lltype.Signed, value)


More information about the Pypy-commit mailing list