[pypy-svn] r30186 - in pypy/dist/pypy/translator/llvm: . test

rxe at codespeak.net rxe at codespeak.net
Tue Jul 18 23:17:32 CEST 2006


Author: rxe
Date: Tue Jul 18 23:17:29 2006
New Revision: 30186

Modified:
   pypy/dist/pypy/translator/llvm/database.py
   pypy/dist/pypy/translator/llvm/test/test_lladdresses.py
Log:
Tentatively (very) add support for fixedaddress.



Modified: pypy/dist/pypy/translator/llvm/database.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/database.py	(original)
+++ pypy/dist/pypy/translator/llvm/database.py	Tue Jul 18 23:17:29 2006
@@ -145,8 +145,7 @@
             #log.prepareconstant(value, "(is primitive)")
             return
         
-        if isinstance(type_, lltype.Ptr):        
-            
+        if isinstance(type_, lltype.Ptr):
             type_ = type_.TO
             value = value._obj
 
@@ -170,11 +169,23 @@
         if isinstance(const_or_var, Constant):
             ct = const_or_var.concretetype
             if isinstance(ct, lltype.Primitive):
-                #log.prepare(const_or_var, "(is primitive)")
-                return
-
-            assert isinstance(ct, lltype.Ptr), "Preparation of non primitive and non pointer" 
-            value = const_or_var.value._obj
+                # special cases for address
+                if ct is llmemory.Address:
+                    fakedaddress = const_or_var.value
+                    if fakedaddress is not None and fakedaddress.ob is not None:
+                        ptrvalue = fakedaddress.ob
+                        ct = lltype.typeOf(ptrvalue)
+                    else:
+                        return                        
+                elif ct is llmemory.WeakGcAddress:
+                    return # XXX sometime soon
+                else:
+                    return
+            else:
+                assert isinstance(ct, lltype.Ptr), "Preparation of non primitive and non pointer" 
+                ptrvalue = const_or_var.value
+                
+            value = ptrvalue._obj
 
             # Only prepare root values at this point 
             if isinstance(ct, lltype.Array) or isinstance(ct, lltype.Struct):
@@ -264,7 +275,7 @@
 
             # special case, null pointer
             if value is None:
-                return None, "%s null" % (toptr,)
+                return None, "%s null" % toptr
 
             node = self.obj2node[value]
             ref = node.get_pbcref(toptr)
@@ -290,6 +301,7 @@
         return self.obj2node[type_].constructor_ref
 
     def repr_name(self, obj):
+        " simply returns a reference to constant value "
         return self.obj2node[obj].ref
 
     def repr_value(self, value):
@@ -358,7 +370,7 @@
             lltype.Bool : self.repr_bool,
             lltype.Void : self.repr_void,
             llmemory.Address : self.repr_address,
-            llmemory.WeakGcAddress : self.repr_address,
+            llmemory.WeakGcAddress : self.repr_weakgcaddress,
             }        
         #XXX
 #         try:
@@ -420,9 +432,37 @@
         return repr
 
     def repr_address(self, type_, value):
-        # XXX fix this
-        assert value == NULL
-        return 'null' 
+        if value is NULL:
+            return 'null'
+
+        assert isinstance(value, llmemory.fakeaddress)
+
+        if value.offset is None:
+            if value.ob is None:
+                return 'null'
+            else:
+                obj = value.ob._obj
+                typename = self.database.repr_type(lltype.typeOf(obj))
+                ref = self.database.repr_name(obj)
+        else:
+            from_, indices, to = self.get_offset(value.offset)
+            indices_as_str = ", ".join("%s %s" % (w, i) for w, i in indices)
+
+            original_typename = self.database.repr_type(from_)
+            orignal_ref = self.database.repr_name(value.ob._obj)
+
+            typename = self.database.repr_type(to)
+            ref = "getelementptr(%s* %s, %s)" % (original_typename,
+                                                 orignal_ref,
+                                                 indices_as_str)
+            
+        res = "cast(%s* %s to sbyte*)" % (typename, ref)
+        return res    
+    
+    def repr_weakgcaddress(self, type_, value):
+        assert isinstance(value, llmemory.fakeweakaddress)
+        log.settingup("XXXX weakgcaddress completely ignored...")
+        return 'null'
 
     def repr_signed(self, type_, value):
         if isinstance(value, Symbolic):
@@ -433,20 +473,14 @@
         return str(value)
 
     def repr_symbolic(self, type_, value):
+        """ returns an int value for pointer arithmetic - not sure this is the
+        llvm way, but well XXX need to fix adr_xxx operations  """
         if isinstance(value, llmemory.AddressOffset):
-            if isinstance(value, llmemory.CompositeOffset):
-                # add offsets together...
-                from_, indices, to = self.get_offset(value.offsets[0])
-                indices = list(indices)
-                for item in value.offsets[1:]:
-                    _, more, to = self.get_offset(item, fromoffset=True)
-                    indices.extend(more)
-            else:
-                from_, indices, to = self.get_offset(value)
-
+            from_, indices, to = self.get_offset(value)
             indices_as_str = ", ".join("%s %s" % (w, i) for w, i in indices)
-            repr = "cast(%s* getelementptr(%s* null, %s) to int)" % (to,
-                                                                     from_,
+            r = self.database.repr_type
+            repr = "cast(%s* getelementptr(%s* null, %s) to int)" % (r(to),
+                                                                     r(from_),
                                                                      indices_as_str)
         elif isinstance(value, ComputedIntSymbolic):
             # XXX what does this do?  Is this safe?
@@ -485,8 +519,15 @@
                 indices.append((uword, 1))
             from_ = value.TYPE
             to = value.TYPE.OF
+
+        elif isinstance(value, llmemory.CompositeOffset):
+            from_, indices, to = self.get_offset(value.offsets[0])
+            indices = list(indices)
+            for item in value.offsets[1:]:
+                _, more, to = self.get_offset(item, fromoffset=True)
+                indices.extend(more)
         else:
             raise Exception("unsupported offset")
 
-        return self.database.repr_type(from_), indices, self.database.repr_type(to)
+        return from_, indices, to
     

Modified: pypy/dist/pypy/translator/llvm/test/test_lladdresses.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/test/test_lladdresses.py	(original)
+++ pypy/dist/pypy/translator/llvm/test/test_lladdresses.py	Tue Jul 18 23:17:29 2006
@@ -137,6 +137,39 @@
     fn = compile_function(f, [int])
     assert fn(1) == 2 
 
+def test_fakeaddress():
+    S = lltype.GcStruct('s', ('val', lltype.Signed))
+    s = lltype.malloc(S)
+    s.val = 10
+    PtrS = lltype.Ptr(S)
+    adr = llmemory.cast_ptr_to_adr(s)
+    def f(n):
+        s1 = llmemory.cast_adr_to_ptr(adr, PtrS)
+        old = s1.val
+        s1.val = n
+        return old + s1.val
+    fn = compile_function(f, [int])
+    assert fn(32) == 42
+
+def test_fakeaddress2():
+    S1 = lltype.GcStruct("S1", ("x", lltype.Signed), ("y", lltype.Signed))
+    PtrS1 = lltype.Ptr(S1)
+    S2 = lltype.GcStruct("S2", ("s", S1))
+
+    s2 = lltype.malloc(S2)
+    s2.s.x = 123
+    s2.s.y = 456
+
+    addr_s2 = llmemory.cast_ptr_to_adr(s2)
+    addr_s1 = addr_s2 + llmemory.FieldOffset(S2, 's')
+
+    def f():
+        s1 = llmemory.cast_adr_to_ptr(addr_s1, PtrS1)
+        return s1.x + s1.y
+    
+    fn = compile_function(f, [])
+    assert f() == 579
+    
 def test_weakaddress():
     from pypy.rpython.objectmodel import cast_object_to_weakgcaddress
     from pypy.rpython.objectmodel import cast_weakgcaddress_to_object
@@ -153,3 +186,4 @@
         return len(l1) == len(l2)
     fn = compile_function(func, [int])
     assert fn(10)
+    



More information about the Pypy-commit mailing list