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

rxe at codespeak.net rxe at codespeak.net
Sat Jul 1 00:01:50 CEST 2006


Author: rxe
Date: Sat Jul  1 00:01:47 2006
New Revision: 29541

Modified:
   pypy/dist/pypy/translator/llvm/arraynode.py
   pypy/dist/pypy/translator/llvm/structnode.py
   pypy/dist/pypy/translator/llvm/test/test_lltype.py
Log:
y


Modified: pypy/dist/pypy/translator/llvm/arraynode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/arraynode.py	(original)
+++ pypy/dist/pypy/translator/llvm/arraynode.py	Sat Jul  1 00:01:47 2006
@@ -86,7 +86,6 @@
             self.db.prepare_constant(self.arraytype, item)
 
         p, c = lltype.parentlink(self.value)
-        p, c = lltype.parentlink(self.value)
         if p is not None:
             self.db.prepare_constant(lltype.typeOf(p), p)
 
@@ -109,18 +108,21 @@
 
     def get_ref(self):
         typeval = self.db.repr_type(lltype.typeOf(self.value))
+        p, c = lltype.parentlink(self.value)
+        if p is None:
+            ref = self.ref
+        else:
+            ref = self.db.get_childref(p, c)
+
         ref = "cast(%s* %s to %s*)" % (self.get_typerepr(),
-                                       self.ref,
+                                       ref,
                                        typeval)
-
-        p, c = lltype.parentlink(self.value)
-        assert p is None, "child arrays are NOT needed by rtyper"
         return ref
 
     def get_pbcref(self, toptr):
         ref = self.ref
         p, c = lltype.parentlink(self.value)
-        assert p is None, "child arrays are NOT needed by rtyper"
+        assert p is None, "child PBC arrays are NOT needed by rtyper"
 
         fromptr = "%s*" % self.get_typerepr()
         ref = "cast(%s %s to %s)" % (fromptr, ref, toptr)

Modified: pypy/dist/pypy/translator/llvm/structnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/structnode.py	(original)
+++ pypy/dist/pypy/translator/llvm/structnode.py	Sat Jul  1 00:01:47 2006
@@ -209,24 +209,37 @@
             types_repr.append(self._get_lastnode().get_typerepr())
             result = "{%s}" % ", ".join(types_repr)
             self._get_typerepr_cache = result
-            return result
-         
+            return result         
+
+    def get_childref(self, index):
+        pos = 0
+        found = False
+        for name in self.structtype._names_without_voids():
+            if name == index:
+                found = True
+                break
+            pos += 1
+
+        ref = "getelementptr(%s* %s, int 0, uint %s)" %(
+            self.get_typerepr(),
+            super(StructVarsizeNode, self).get_ref(),
+            pos)
+
+        return ref
+
     def get_ref(self):
-        if self._get_ref_cache:
-            return self._get_ref_cache
         ref = super(StructVarsizeNode, self).get_ref()
         typeval = self.db.repr_type(lltype.typeOf(self.value))
         ref = "cast(%s* %s to %s*)" % (self.get_typerepr(),
                                        ref,
                                        typeval)
-        self._get_ref_cache = ref
         return ref
     
     def get_pbcref(self, toptr):
         """ Returns a reference as used per pbc. """        
         ref = self.ref
         p, c = lltype.parentlink(self.value)
-        assert p is None, "child arrays are NOT needed by rtyper"
+        assert p is None, "child varsize struct are NOT needed by rtyper"
         fromptr = "%s*" % self.get_typerepr()
         refptr = "getelementptr(%s %s, int 0)" % (fromptr, ref)
         ref = "cast(%s %s to %s)" % (fromptr, refptr, toptr)

Modified: pypy/dist/pypy/translator/llvm/test/test_lltype.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/test/test_lltype.py	(original)
+++ pypy/dist/pypy/translator/llvm/test/test_lltype.py	Sat Jul  1 00:01:47 2006
@@ -172,7 +172,7 @@
         return s.aptr[1] - a[0]
     f = compile_function(array_constant, [])
     assert f() == array_constant()
-
+    
 def test_struct_array2():
     A = lltype.Array(lltype.Signed)
     STEST = lltype.GcStruct('test', ('a', lltype.Signed), ('b', A))
@@ -180,6 +180,7 @@
     s.a = 41
     s.b[0] = 100
     s.b[1] = 101
+
     def array_constant():
         return s.b[1] - s.b[0] + s.a
     f = compile_function(array_constant, [])



More information about the Pypy-commit mailing list