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

rxe at codespeak.net rxe at codespeak.net
Sun Jul 31 23:07:24 CEST 2005


Author: rxe
Date: Sun Jul 31 23:07:22 2005
New Revision: 15490

Modified:
   pypy/dist/pypy/translator/llvm2/arraynode.py
   pypy/dist/pypy/translator/llvm2/database.py
   pypy/dist/pypy/translator/llvm2/opwriter.py
   pypy/dist/pypy/translator/llvm2/test/test_typed.py
Log:
An implementation of array of voids.  Cleanup required (when I get home).


Modified: pypy/dist/pypy/translator/llvm2/arraynode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/arraynode.py	(original)
+++ pypy/dist/pypy/translator/llvm2/arraynode.py	Sun Jul 31 23:07:22 2005
@@ -49,6 +49,16 @@
                                   self.constructor_decl,
                                   fromtype)
 
+class VoidArrayTypeNode(LLVMNode):
+
+    def __init__(self, db, array):
+        assert isinstance(array, lltype.Array)
+        self.ref = "%arraytype.Void"
+
+    def writedatatypedecl(self, codewriter):
+        td = "%s = type { int }" % self.ref
+        codewriter.append(td)
+        
 class ArrayNode(ConstantLLVMNode):
     """ An arraynode.  Elements can be
     a primitive,
@@ -159,3 +169,31 @@
         if len(items) == 0 or items[-1] != chr(0):
             items = items + [chr(0)]
         return [self.db.repr_constant(v)[1] for v in items]
+
+class VoidArrayNode(ConstantLLVMNode):
+
+    def __init__(self, db, value):
+        assert isinstance(lltype.typeOf(value), lltype.Array)
+        self.ref = self.make_ref('%arrayinstance', '')
+        self.value = value
+
+    def get_length(self):
+        """ returns logical length of array """
+        items = self.value.items
+        return len(items)
+
+    def get_typerepr(self):
+        return "{ int }"
+
+    def get_arrayvalues(self):
+        return []
+
+    def constantvalue(self):
+        value = "int %s" % (self.get_length(),)
+        s = "%s {%s}" % (self.get_typerepr(), value)
+        return s
+    
+    def writeglobalconstants(self, codewriter):
+        p, c = lltype.parentlink(self.value)
+        if p is None:
+            codewriter.globalinstance(self.ref, self.constantvalue())

Modified: pypy/dist/pypy/translator/llvm2/database.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/database.py	(original)
+++ pypy/dist/pypy/translator/llvm2/database.py	Sun Jul 31 23:07:22 2005
@@ -4,7 +4,7 @@
 from pypy.translator.llvm2.structnode import StructNode, StructVarsizeNode, \
      StructTypeNode, StructVarsizeTypeNode
 from pypy.translator.llvm2.arraynode import ArrayNode, StrArrayNode, \
-     ArrayTypeNode 
+     VoidArrayNode, ArrayTypeNode, VoidArrayTypeNode
 from pypy.translator.llvm2.opaquenode import OpaqueNode, OpaqueTypeNode
 from pypy.translator.llvm2.node import ConstantLLVMNode
 from pypy.rpython import lltype
@@ -124,6 +124,8 @@
         elif isinstance(type_, lltype.Array):
             if type_ is STR.chars:
                 node = StrArrayNode(self, value)
+            elif type_.OF is lltype.Void:
+                node = VoidArrayNode(self, value)
             else:
                 node = ArrayNode(self, value)
 
@@ -195,7 +197,10 @@
             self.addpending(type_, FuncTypeNode(self, type_))
 
         elif isinstance(type_, lltype.Array): 
-            self.addpending(type_, ArrayTypeNode(self, type_))
+            if type_.OF is lltype.Void:
+                self.addpending(type_, VoidArrayTypeNode(self, type_))
+            else:
+                self.addpending(type_, ArrayTypeNode(self, type_))
 
         elif isinstance(type_, lltype.OpaqueType):
             self.addpending(type_, OpaqueTypeNode(self, type_))            

Modified: pypy/dist/pypy/translator/llvm2/opwriter.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/opwriter.py	(original)
+++ pypy/dist/pypy/translator/llvm2/opwriter.py	Sun Jul 31 23:07:22 2005
@@ -135,7 +135,14 @@
                                  self.db.repr_arg_type(op.args[0]),
                                  self.db.repr_arg(op.args[0]), 
                                  "true")
-                    
+
+    def uint_invert(self, op):
+        self.codewriter.binaryop("xor",
+                                 self.db.repr_arg(op.result),
+                                 self.db.repr_arg_type(op.args[0]),
+                                 self.db.repr_arg(op.args[0]), 
+                                 1)
+
     def binaryop(self, op):
         name = self.binary_operations[op.opname]
         assert len(op.args) == 2
@@ -306,9 +313,19 @@
         arg_type = op.args[0]
         assert (isinstance(arg_type, Constant) and 
                 isinstance(arg_type.value, (lltype.Array, lltype.Struct)))
+
         #XXX unclean
-        struct_type = self.db.obj2node[arg_type.value].ref
-        struct_cons = self.db.obj2node[arg_type.value].constructor_ref
+        node = self.db.obj2node[arg_type.value]
+
+        #XXX AAARRRRRRRRRGFFFFFFFFFFFFGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHH
+        from pypy.translator.llvm2.arraynode import VoidArrayTypeNode
+        if isinstance(node, VoidArrayTypeNode):
+            type_ = node.ref
+            self.codewriter.malloc(targetvar, type_, atomic=is_atomic(node)) 
+            return
+        
+        struct_type = node.ref
+        struct_cons = node.constructor_ref
         argrefs = self.db.repr_arg_multi(op.args[1:])
         argtypes = self.db.repr_arg_type_multi(op.args[1:])
         self.codewriter.call(targetvar, struct_type + "*", struct_cons,
@@ -356,13 +373,14 @@
         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, arraytype, array,
-                                      ("uint", 1), (indextype, index))
         targetvar = self.db.repr_arg(op.result)
         targettype = self.db.repr_arg_type(op.result)
-        #XXX These should skip too if the case comes up
-        assert targettype != "void"
-        self.codewriter.load(targetvar, targettype, tmpvar)
+        if targettype != "void":
+            self.codewriter.getelementptr(tmpvar, arraytype, array,
+                                          ("uint", 1), (indextype, index))
+            self.codewriter.load(targetvar, targettype, tmpvar)
+        else:
+            self.codewriter.comment("***Skipping operation getarrayitem()***")
 
     def getarraysubstruct(self, op):        
         array, arraytype = self.db.repr_argwithtype(op.args[0])
@@ -378,14 +396,17 @@
         indextype = self.db.repr_arg_type(op.args[1])
 
         tmpvar = self.db.repr_tmpvar()
-        self.codewriter.getelementptr(tmpvar, arraytype, array,
-                                      ("uint", 1), (indextype, index))
 
         valuevar = self.db.repr_arg(op.args[2]) 
         valuetype = self.db.repr_arg_type(op.args[2])
         #XXX These should skip too if the case comes up
-        assert valuetype != "void"
-        self.codewriter.store(valuetype, valuevar, tmpvar) 
+        if valuetype != "void":
+            self.codewriter.getelementptr(tmpvar, arraytype, array,
+                                      ("uint", 1), (indextype, index))
+            self.codewriter.store(valuetype, valuevar, tmpvar) 
+        else:
+            self.codewriter.comment("***Skipping operation setarrayitem()***")
+
 
     def getarraysize(self, op):
         array, arraytype = self.db.repr_argwithtype(op.args[0])

Modified: pypy/dist/pypy/translator/llvm2/test/test_typed.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/test/test_typed.py	(original)
+++ pypy/dist/pypy/translator/llvm2/test/test_typed.py	Sun Jul 31 23:07:22 2005
@@ -55,19 +55,27 @@
     assert result 
 
 def test_is():
-    py.test.skip("array type of void")
     def testfn():
         l1 = []
         return l1 is l1
     fn = compile_function(testfn, [])
     result = fn()
-    assert result is True
+    assert result == True
     def testfn():
         l1 = []
-        return l1 is None
+        return l1 == None
     fn = compile_function(testfn, [])
     result = fn()
-    assert result is False
+    assert result == False
+
+def test_nones():
+    a = [None] * 4
+    def nones():        
+        a.append(None)
+        return len(a)
+    fn = compile_function(nones, [])
+    result = fn()
+    assert result == 4
 
 def test_str_compare():
     def testfn(i, j):
@@ -203,7 +211,7 @@
 
 # floats 
 def test_float_operations(): 
-    py.test.skip("strangness with llvm rem operation...")    
+    py.test.skip("llvm rem operation doesnt seem to work...")    
     def func(x, y): 
         z = x + y / 2.1 * x 
         z = z % 60.0
@@ -257,8 +265,8 @@
     f = compile_function(wrapper, [int])
     assert f(42)
 
-def test_float2int():
-    py.test.skip("XXX dont understand")
+def Xtest_float2int():
+    """ RTyper is cheating...."""
     def fn(f):
         return str(f)
     def wrapper():
@@ -269,7 +277,7 @@
     assert f()
 
 def test_uint_arith():
-    py.test.skip("uint_invert operation missing")
+    py.test.skip("uint_floordiv_zer operation missing (raises)")
     def fn(i):
         try:
             return ~(i*(i+1))/(i-1)



More information about the Pypy-commit mailing list