[pypy-svn] r14195 - pypy/dist/pypy/translator/llvm2

rxe at codespeak.net rxe at codespeak.net
Mon Jul 4 11:43:32 CEST 2005


Author: rxe
Date: Mon Jul  4 11:43:31 2005
New Revision: 14195

Modified:
   pypy/dist/pypy/translator/llvm2/funcnode.py
Log:
Fix getarrayitem and getfield to only load pointers and primitives in
to registers.



Modified: pypy/dist/pypy/translator/llvm2/funcnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/funcnode.py	(original)
+++ pypy/dist/pypy/translator/llvm2/funcnode.py	Mon Jul  4 11:43:31 2005
@@ -273,18 +273,16 @@
         typevar = self.db.repr_arg(op.args[0])
         fieldnames = list(op.args[0].concretetype.TO._names)
         index = fieldnames.index(op.args[1].value)
-        self.codewriter.getelementptr(tmpvar, typ, typevar, ("uint", index))
-        
+        self.codewriter.getelementptr(tmpvar, typ, typevar, ("uint", index))        
         targetvar = self.db.repr_arg(op.result)
         targettype = self.db.repr_arg_type(op.result)
         assert targettype != "void"
-        #XXX This doesnt work - yet
-        #if isinstance(op.result.concretetype, lltype.Ptr):        
-        #    self.codewriter.cast(targetvar, targettype, tmpvar, targettype)
-        #else:
-            # Moving to correct result variable
-            #self.codewriter.load(targetvar, targettype, tmpvar)
-        self.codewriter.load(targetvar, targettype, tmpvar)    
+        if isinstance(op.result.concretetype, lltype.ContainerType):
+            # noop
+            self.codewriter.cast(targetvar, targettype, tmpvar, targettype)
+        else:
+            self.codewriter.load(targetvar, targettype, tmpvar)
+
     getsubstruct = getfield
 
     def setfield(self, op): 
@@ -304,20 +302,16 @@
         vartype = self.db.repr_arg_type(op.args[0])
         index = self.db.repr_arg(op.args[1])
         indextype = self.db.repr_arg_type(op.args[1])
-
         tmpvar = self.db.repr_tmpvar()
         self.codewriter.getelementptr(tmpvar, vartype, var,
                                       ("uint", 1), (indextype, index))
-
         targetvar = self.db.repr_arg(op.result)
         targettype = self.db.repr_arg_type(op.result)
-
-        # Ditto see getfield
-        if not isinstance(op.result.concretetype, lltype.Ptr):        
-            self.codewriter.load(targetvar, targettype, tmpvar)
-        else:
-            # XXX noop
+        if isinstance(op.result.concretetype, lltype.ContainerType):
+            # noop
             self.codewriter.cast(targetvar, targettype, tmpvar, targettype)
+        else:
+            self.codewriter.load(targetvar, targettype, tmpvar)
 
     def setarrayitem(self, op):
         array = self.db.repr_arg(op.args[0])



More information about the Pypy-commit mailing list