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

cfbolz at codespeak.net cfbolz at codespeak.net
Sun Jul 3 12:23:55 CEST 2005


Author: cfbolz
Date: Sun Jul  3 12:23:54 2005
New Revision: 14121

Modified:
   pypy/dist/pypy/translator/llvm2/arraynode.py
   pypy/dist/pypy/translator/llvm2/codewriter.py
   pypy/dist/pypy/translator/llvm2/database.py
   pypy/dist/pypy/translator/llvm2/funcnode.py
   pypy/dist/pypy/translator/llvm2/test/test_genllvm.py
Log:
added support for functions returning void.


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  3 12:23:54 2005
@@ -1,9 +1,10 @@
 import py
 from pypy.rpython import lltype 
-from pypy.translator.llvm2.log import log 
+from pypy.translator.llvm2.log import log
+from pypy.translator.llvm2.node import LLVMNode
 log = log.structnode 
 
-class ArrayTypeNode(object):
+class ArrayTypeNode(LLVMNode):
     _issetup = False 
     def __init__(self, db, array): 
         self.db = db
@@ -28,7 +29,7 @@
 # Each ArrayNode is a global constant.  This needs to have a specific type of
 # a certain type.
 
-class ArrayNode(object):
+class ArrayNode(LLVMNode):
 
     _issetup = False 
     array_counter = 0

Modified: pypy/dist/pypy/translator/llvm2/codewriter.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/codewriter.py	(original)
+++ pypy/dist/pypy/translator/llvm2/codewriter.py	Sun Jul  3 12:23:54 2005
@@ -61,7 +61,10 @@
         self.append("}") 
 
     def ret(self, type_, ref): 
-        self.indent("ret %s %s" % (type_, ref)) 
+        self.indent("ret %s %s" % (type_, ref))
+
+    def ret_void(self):
+        self.indent("ret void")
 
     def phi(self, targetvar, type_, refs, blocknames): 
         assert targetvar.startswith('%')
@@ -79,6 +82,10 @@
         self.indent("%s = call %s %s(%s)" % (targetvar, returntype, functionref,
                                              ", ".join(arglist)))
 
+    def call_void(self, functionref, argrefs, argtypes):
+        arglist = ["%s %s" % item for item in zip(argtypes, argrefs)]
+        self.indent("call void %s(%s)" % (functionref, ", ".join(arglist)))
+
     def cast(self, targetvar, fromtype, fromvar, targettype):
         self.indent("%(targetvar)s = cast %(fromtype)s "
                         "%(fromvar)s to %(targettype)s" % locals())

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  3 12:23:54 2005
@@ -11,7 +11,8 @@
                       lltype.Char: "sbyte",
                       lltype.Unsigned: "uint",
                       lltype.Bool: "bool",
-                      lltype.Float: "double" }
+                      lltype.Float: "double",
+                      lltype.Void: "void"}
 
 class Database(object): 
     def __init__(self, translator): 

Modified: pypy/dist/pypy/translator/llvm2/funcnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/funcnode.py	(original)
+++ pypy/dist/pypy/translator/llvm2/funcnode.py	Sun Jul  3 12:23:54 2005
@@ -115,7 +115,8 @@
             names = self.db.repr_arg_multi([link.args[i] for link in entrylinks])
             blocknames = [self.block_to_name[link.prevblock]
                               for link in entrylinks]
-            codewriter.phi(arg, type_, names, blocknames) 
+            if type_ != "void":
+                codewriter.phi(arg, type_, names, blocknames) 
 
     def write_block_branches(self, codewriter, block):
         if len(block.exits) == 1:
@@ -138,7 +139,10 @@
         self.write_block_phi_nodes(codewriter, block)
         inputargtype = self.db.repr_arg_type(block.inputargs[0])
         inputarg = self.db.repr_arg(block.inputargs[0])
-        codewriter.ret(inputargtype, inputarg)
+        if inputargtype != "void":
+            codewriter.ret(inputargtype, inputarg)
+        else:
+            codewriter.ret_void()
 
 class OpWriter(object):
     binary_operations = {'int_mul': 'mul',
@@ -233,8 +237,11 @@
         functionref = self.db.repr_arg(op.args[0])
         argrefs = self.db.repr_arg_multi(op.args[1:])
         argtypes = self.db.repr_arg_type_multi(op.args[1:])
-        self.codewriter.call(targetvar, returntype, functionref, argrefs,
-                             argtypes)
+        if returntype != "void":
+            self.codewriter.call(targetvar, returntype, functionref, argrefs,
+                                 argtypes)
+        else:
+            self.codewriter.call_void(functionref, argrefs, argtypes)
 
     def malloc(self, op): 
         targetvar = self.db.repr_arg(op.result) 

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	Sun Jul  3 12:23:54 2005
@@ -89,6 +89,15 @@
     assert factorial(4.) == 24.
     assert factorial(5.) == 120.
 
+def test_return_void():
+    def return_void(i):
+        return None
+    def call_return_void(i):
+        return_void(i)
+        return 1
+    f = compile_function(call_return_void, [int])
+    assert f(10) == 1
+
 def test_break_while_loop():
     def factorial(i):
         r = 1
@@ -209,7 +218,7 @@
      f = compile_function(char_constant, [])
      assert f() == 7
 
-def DONOT_test_list_getitem(): 
+def Xtest_list_getitem(): 
     def list_getitem(i): 
         l = [1,2,i]
         return l[i]
@@ -218,11 +227,11 @@
     assert f(1) == 2
     assert f(3) == 3
 
-def DONOT_test_string_getitem1():
+def Xtest_string_getitem1():
     l = "Hello, World"
     def string_test(i): 
         return l[i]
-    f = compile_function(string_test, [int], view=True)
+    f = compile_function(string_test, [int], view=False)
     assert f(0) == ord("H")
 
 def DONOT_test_string_getitem2():



More information about the Pypy-commit mailing list