[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