[pypy-svn] r14294 - in pypy/dist/pypy/translator/llvm2: . test

hpk at codespeak.net hpk at codespeak.net
Tue Jul 5 16:30:58 CEST 2005


Author: hpk
Date: Tue Jul  5 16:30:51 2005
New Revision: 14294

Modified:
   pypy/dist/pypy/translator/llvm2/database.py
   pypy/dist/pypy/translator/llvm2/funcnode.py
   pypy/dist/pypy/translator/llvm2/structnode.py
   pypy/dist/pypy/translator/llvm2/test/test_genllvm.py
   pypy/dist/pypy/translator/llvm2/varsize.py
Log:
(hpk, rxe) 

moving and refactoring towards varsize structs 
it still doesn't work quite yet. 



Modified: pypy/dist/pypy/translator/llvm2/database.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/database.py	(original)
+++ pypy/dist/pypy/translator/llvm2/database.py	Tue Jul  5 16:30:51 2005
@@ -152,6 +152,10 @@
     def repr_arg(self, arg):
         if (isinstance(arg, Constant) and 
             isinstance(arg.concretetype, lltype.Primitive)):
+           
+            # XXX generalize and test this 
+            if isinstance(arg.value, str) and len(arg.value) == 1: 
+                return str(ord(arg.value))
             return str(arg.value).lower() #False --> false
         elif isinstance(arg, Variable):
             return "%" + str(arg)

Modified: pypy/dist/pypy/translator/llvm2/funcnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/funcnode.py	(original)
+++ pypy/dist/pypy/translator/llvm2/funcnode.py	Tue Jul  5 16:30:51 2005
@@ -194,6 +194,15 @@
             assert meth is not None, "operation %r not found" %(op.opname,)
             meth(op)    
 
+    def int_neg(self, op): 
+        self.codewriter.binaryop("sub", 
+                                 self.db.repr_arg(op.result),
+                                 self.db.repr_arg_type(op.args[0]),
+                                 "0", 
+                                 self.db.repr_arg(op.args[0]),
+                                 )
+                    
+
     def binaryop(self, op):
         name = self.binary_operations[op.opname]
         assert len(op.args) == 2
@@ -213,6 +222,7 @@
 
     cast_bool_to_int = cast_primitive
     cast_bool_to_uint = uint_is_true = cast_primitive
+    cast_int_to_char = cast_char_to_int = cast_primitive
 
     def int_is_true(self, op):
         self.codewriter.binaryop("setne",
@@ -324,6 +334,7 @@
 
         valuevar = self.db.repr_arg(op.args[2]) 
         valuetype = self.db.repr_arg_type(op.args[2])
+        assert valuevar.strip() != '-'
         self.codewriter.store(valuetype, valuevar, tmpvar) 
 
     def getarraysize(self, op):

Modified: pypy/dist/pypy/translator/llvm2/structnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/structnode.py	(original)
+++ pypy/dist/pypy/translator/llvm2/structnode.py	Tue Jul  5 16:30:51 2005
@@ -2,6 +2,7 @@
 from pypy.objspace.flow.model import Block, Constant, Variable, Link
 from pypy.translator.llvm2.log import log
 from pypy.translator.llvm2.node import LLVMNode
+from pypy.translator.llvm2 import varsize
 from pypy.rpython import lltype
 
 import itertools  
@@ -56,38 +57,19 @@
         from pypy.translator.llvm2.atomic import is_atomic
 
         log.writeimpl(self.ref)
-        codewriter.openfunc(self.constructor_ref)
-        codewriter.label("block0")
+
+        # build up a list of indices to get to the last 
+        # var-sized struct (or rather the according array) 
         indices_to_array = [("int", 0)]
         s = self.struct
         while isinstance(s, lltype.Struct):
             last_pos = len(s._names_without_voids()) - 1
             indices_to_array.append(("uint", last_pos))
             s = s._flds[s._names_without_voids()[-1]]
-
         arraytype = self.db.repr_arg_type(s)
-
-        # Into array and length            
-        indices = indices_to_array + [("uint", 1), ("int", "%len")]
-        codewriter.getelementptr("%size", self.ref + "*",
-                                 "null", *indices)
-        
-        #XXX is this ok for 64bit?
-        codewriter.cast("%sizeu", arraytype + "*", "%size", "uint")
-        codewriter.malloc("%resulttmp", "sbyte", "%sizeu", atomic=is_atomic(self))
-        codewriter.cast("%result", "sbyte*", "%resulttmp", self.ref + "*")
-
-        # remember the allocated length for later use.
-        indices = indices_to_array + [("uint", 0)]
-        codewriter.getelementptr("%size_ptr", self.ref + "*",
-                                 "%result", *indices)
-
-        codewriter.cast("%signedsize", "uint", "%sizeu", "int")
-        codewriter.store("int", "%signedsize", "%size_ptr")
-
-        codewriter.ret(self.ref + "*", "%result")
-        codewriter.closefunc()
-
+        varsize.write_constructor(codewriter, 
+            self.ref, self.constructor_decl, arraytype, 
+            indices_to_array)
 
 def cast_global(toptr, from_, name):
     s = "cast(%s* getelementptr (%s* %s, int 0) to %s)" % (from_,

Modified: pypy/dist/pypy/translator/llvm2/test/test_genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/test/test_genllvm.py	(original)
+++ pypy/dist/pypy/translator/llvm2/test/test_genllvm.py	Tue Jul  5 16:30:51 2005
@@ -12,7 +12,7 @@
 from pypy.rpython.rtyper import RPythonTyper
 from pypy.rpython.rarithmetic import r_uint
 
-py.log.setconsumer("genllvm", py.log.STDOUT)
+#py.log.setconsumer("genllvm", py.log.STDOUT)
 py.log.setconsumer("genllvm database prepare", None)
 
 
@@ -316,7 +316,7 @@
 
 def xtest_string_simple(): 
     def string_simple(i): 
-        return str(i) 
+        return ord(str(i))
     f = compile_function(string_simple, [int], view=False)
     assert f(0) 
 

Modified: pypy/dist/pypy/translator/llvm2/varsize.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/varsize.py	(original)
+++ pypy/dist/pypy/translator/llvm2/varsize.py	Tue Jul  5 16:30:51 2005
@@ -29,11 +29,12 @@
     codewriter.cast("%usize", elemtype + "*", "%size", "uint")
     codewriter.malloc("%ptr", "sbyte", "%usize", atomic=atomicmalloc)
     codewriter.cast("%result", "sbyte*", "%ptr", ref + "*")
-    
+ 
+    indices_to_array = tuple(indices_to_array) + (("uint", 0),)
     # the following accesses the length field of the array 
     codewriter.getelementptr("%arraylength", ref + "*", 
                              "%result", 
-                             indices_to_array + ("uint", 0))
+                             *indices_to_array)
     codewriter.store("int", "%len", "%arraylength")
     codewriter.ret(ref + "*", "%result")
     codewriter.closefunc()



More information about the Pypy-commit mailing list