[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