[pypy-svn] r14098 - in pypy/dist/pypy/translator/llvm2: . test
rxe at codespeak.net
rxe at codespeak.net
Sat Jul 2 16:41:53 CEST 2005
Author: rxe
Date: Sat Jul 2 16:41:52 2005
New Revision: 14098
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/structnode.py
pypy/dist/pypy/translator/llvm2/test/test_genllvm.py
Log:
Small developments towards varsized structs/arrays.
Renamed StructInstance to StructNode and StructNode to StructTypeNode.
Modified: pypy/dist/pypy/translator/llvm2/arraynode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/arraynode.py (original)
+++ pypy/dist/pypy/translator/llvm2/arraynode.py Sat Jul 2 16:41:52 2005
@@ -1,21 +1,21 @@
import py
+from pypy.rpython import lltype
from pypy.translator.llvm2.log import log
log = log.structnode
-class ArrayNode(object):
+class ArrayTypeNode(object):
_issetup = False
- array_counter = 0
-
def __init__(self, db, array):
self.db = db
self.array = array
- self.ref = "%%array.%s.%s" % (array.OF, ArrayNode.array_counter)
- ArrayNode.array_counter += 1
-
+ self.ref_template = "%%array.%s" % array.OF
+ self.ref = self.ref_template + ".0"
+
def __str__(self):
- return "<ArrayNode %r>" % self.ref
+ return "<ArrayTypeNode %r>" % self.ref
def setup(self):
+ self.db.prepare_repr_arg_type(self.array.OF)
self._issetup = True
# ______________________________________________________________________
@@ -23,3 +23,55 @@
#
def writedatatypedecl(self, codewriter):
codewriter.arraydef(self.ref, self.db.repr_arg_type(self.array.OF))
+
+
+# Each ArrayNode is a global constant. This needs to have a specific type of
+# a certain type.
+
+class ArrayNode(object):
+
+ _issetup = False
+ array_counter = 0
+
+ def __init__(self, db, value):
+ self.db = db
+ self.name = "%s.%s" % (value._TYPE.OF, ArrayNode.array_counter)
+ self.ref = "%%stinstance.%s" % self.name
+ self.value = value
+ ArrayNode.array_counter += 1
+
+ def __str__(self):
+ return "<ArrayNode %r>" %(self.ref,)
+
+ def setup(self):
+ T = self.value._TYPE.OF
+ for item in self.value.items:
+ if not isinstance(T, lltype.Primitive):
+ value = getattr(self.value, name)
+ # Create a dummy constant hack XXX
+ c = Constant(value, T)
+ self.db.prepare_arg(c)
+
+ self._issetup = True
+
+ def get_values(self):
+ res = []
+
+ T = self.value._TYPE.OF
+ typval = self.db.repr_arg_type(self.value._TYPE.OF)
+ for value in self.value.items:
+ if not isinstance(T, lltype.Primitive):
+ # Create a dummy constant hack XXX
+ value = self.db.repr_arg(Constant(value, T))
+ else:
+ value = repr(value)
+ res.append((typval, value))
+
+ return ", ".join(["%s %s" % (t, v) for t, v in res])
+
+ def writedata(self, codewriter):
+ lenitems = len(self.value.items)
+ lenstr = ".%s" % lenitems
+ codewriter.globalinstance(self.ref,
+ self.db.repr_arg_type() + lenstr,
+ self.get_values())
Modified: pypy/dist/pypy/translator/llvm2/codewriter.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/codewriter.py (original)
+++ pypy/dist/pypy/translator/llvm2/codewriter.py Sat Jul 2 16:41:52 2005
@@ -26,6 +26,9 @@
def label(self, name):
self.append(" %s:" % name)
+ def globalinstance(self, name, type, data):
+ self.append("%s = internal constant %s {%s}" % (name, type, data))
+
def structdef(self, name, typereprs):
self.append("%s = type { %s }" %(name, ", ".join(typereprs)))
Modified: pypy/dist/pypy/translator/llvm2/database.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/database.py (original)
+++ pypy/dist/pypy/translator/llvm2/database.py Sat Jul 2 16:41:52 2005
@@ -1,7 +1,7 @@
from pypy.translator.llvm2.log import log
from pypy.translator.llvm2.funcnode import FuncNode, FuncTypeNode
-from pypy.translator.llvm2.structnode import StructNode, StructInstance
-from pypy.translator.llvm2.arraynode import ArrayNode
+from pypy.translator.llvm2.structnode import StructNode, StructTypeNode
+from pypy.translator.llvm2.arraynode import ArrayNode, ArrayTypeNode
from pypy.rpython import lltype
from pypy.objspace.flow.model import Block, Constant, Variable
@@ -42,19 +42,22 @@
if isinstance(ct, lltype.FuncType):
self.addpending(const_or_var, FuncNode(self, const_or_var))
else:
- #value = const_or_var.value
- #while hasattr(value, "_obj"):
- # value = value._obj
-
+ value = const_or_var.value
+ while hasattr(value, "_obj"):
+ value = value._obj
+
if isinstance(ct, lltype.Struct):
- self.addpending(const_or_var, StructInstance(self, value))
+ self.addpending(const_or_var, StructNode(self, value))
+
+ elif isinstance(ct, lltype.Array):
+ self.addpending(const_or_var, ArrayNode(self, value))
elif isinstance(ct, lltype.Primitive):
log.prepare(const_or_var, "(is primitive)")
else:
log.XXX("not sure what to do about %s(%s)" % (ct, const_or_var))
else:
- log.prepare.ignore(const_or_var)
+ log.prepare(const_or_var, type(const_or_var)) #XXX dont checkin
def prepare_repr_arg_multi(self, args):
for const_or_var in args:
@@ -69,13 +72,13 @@
self.prepare_repr_arg_type(type_.TO)
elif isinstance(type_, lltype.Struct):
- self.addpending(type_, StructNode(self, type_))
+ self.addpending(type_, StructTypeNode(self, type_))
elif isinstance(type_, lltype.FuncType):
self.addpending(type_, FuncTypeNode(self, type_))
elif isinstance(type_, lltype.Array):
- self.addpending(type_, ArrayNode(self, type_))
+ self.addpending(type_, ArrayTypeNode(self, type_))
else:
log.XXX("need to prepare typerepr", type_)
@@ -91,7 +94,9 @@
def setup_all(self):
while self._pendingsetup:
- self._pendingsetup.pop().setup()
+ x = self._pendingsetup.pop()
+ log.setup_all(x)
+ x.setup()
def getobjects(self, subset_types=None):
res = []
@@ -102,13 +107,13 @@
return res
def get_typedecls(self):
- return self.getobjects((StructNode, ArrayNode, FuncTypeNode))
+ return self.getobjects((StructTypeNode, ArrayTypeNode, FuncTypeNode))
def get_globaldata(self):
- return self.getobjects((StructInstance))
+ return self.getobjects((StructNode, ArrayNode))
def get_functions(self):
- struct_nodes = [n for n in self.getobjects(StructNode) if n.inline_struct]
+ struct_nodes = [n for n in self.getobjects(StructTypeNode) if n.inline_struct]
return struct_nodes + self.getobjects(FuncNode)
def dump(self):
@@ -119,12 +124,12 @@
log.dump_db("*** type declarations ***")
for k,v in all_objs:
- if isinstance(v, (StructNode, ArrayNode)):
+ if isinstance(v, (StructTypeNode, ArrayTypeNode)):
log.dump_db("%s ---> %s" % (k, v))
log.dump_db("*** global data ***")
for k,v in all_objs:
- if isinstance(v, (StructInstance)):
+ if isinstance(v, (StructNode)):
log.dump_db("%s ---> %s" % (k, v))
log.dump_db("*** function protos ***")
Modified: pypy/dist/pypy/translator/llvm2/structnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/structnode.py (original)
+++ pypy/dist/pypy/translator/llvm2/structnode.py Sat Jul 2 16:41:52 2005
@@ -4,7 +4,7 @@
from pypy.rpython import lltype
log = log.structnode
-class StructNode(object):
+class StructTypeNode(object):
_issetup = False
struct_counter = 0
@@ -14,24 +14,20 @@
self.db = db
self.struct = struct
- self.name = "%s.%s" % (self.struct._name, StructNode.struct_counter)
+ self.name = "%s.%s" % (self.struct._name, StructTypeNode.struct_counter)
self.ref = "%%st.%s" % self.name
self.inline_struct = self.struct._arrayfld
- StructNode.struct_counter += 1
+ StructTypeNode.struct_counter += 1
def __str__(self):
- return "<StructNode %r>" %(self.ref,)
+ return "<StructTypeNode %r>" %(self.ref,)
def setup(self):
# Recurse
for fieldname in self.struct._names:
field_type = getattr(self.struct, fieldname)
self.db.prepare_repr_arg_type(field_type)
-
- if self.inline_struct:
- log.XXX("Register me", self)
-
self._issetup = True
def get_decl_for_varsize(self):
@@ -57,7 +53,6 @@
codewriter.declare(self.get_decl_for_varsize())
def writeimpl(self, codewriter):
-
if self.inline_struct:
log.writeimpl(self.ref)
codewriter.openfunc(self.get_decl_for_varsize())
@@ -89,42 +84,46 @@
codewriter.closefunc()
-class StructInstance(object):
+class StructNode(object):
_issetup = False
struct_counter = 0
def __init__(self, db, value):
self.db = db
- self.name = "%s.%s" % (value._TYPE._name, StructInstance.struct_counter)
+ self.name = "%s.%s" % (value._TYPE._name, StructNode.struct_counter)
self.ref = "%%stinstance.%s" % self.name
self.value = value
- StructInstance.struct_counter += 1
+ StructNode.struct_counter += 1
def __str__(self):
- return "<StructInstance %r>" %(self.ref,)
+ return "<StructNode %r>" %(self.ref,)
def setup(self):
- # Recurse fields (XXX Messy!)
for name in self.value._TYPE._names:
T = self.value._TYPE._flds[name]
- self.db.prepare_repr_arg_type(T)
if not isinstance(T, lltype.Primitive):
value = getattr(self.value, name)
- self.db.prepare_repr_arg(value)
+ # Create a dummy constant hack XXX
+ c = Constant(value, T)
+ self.db.prepare_arg(c)
self._issetup = True
-# def struct_repr(self):
-# typ = repr_arg_type(self.value)
-# self.value._TYPE._names
-# typevaluepairs = ["%s %s" % for t, v in
-# typevaluepairsstr = ", ".join(typevaluepairs)
-# return "%s { %s }" % (typ, typevaluepairsstr)
+ def get_values(self):
+ res = []
+ for name in self.value._TYPE._names:
+ T = self.value._TYPE._flds[name]
+ value = getattr(self.value, name)
+ if not isinstance(T, lltype.Primitive):
+ # Create a dummy constant hack XXX
+ value = self.db.repr_arg(Constant(value, T))
+ else:
+ value = str(value)
+ res.append((self.db.repr_arg_type(T), value))
+ return ", ".join(["%s %s" % (t, v) for t, v in res])
def writedata(self, codewriter):
- log.XXXXXXXXXX("ooops TODO should write - ", self.ref)
- for name in self.value._TYPE._names:
- log.XXXXXXXXXX("ooops ", getattr(self.value, name))
- typ = self.db.repr_arg_type(self.value._TYPE)
- # XXX constant you say?
- codewriter.append("%s = internal constant %s* null" % (self.ref, typ))
+ codewriter.globalinstance(self.ref,
+ self.db.repr_arg_type(self.value._TYPE),
+ self.get_values())
+
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 Sat Jul 2 16:41:52 2005
@@ -23,11 +23,10 @@
a = t.annotate(annotate)
t.specialize()
a.simplify()
- if view:
+ if view:
t.view()
return genllvm(t)
-
def test_return1():
def simple1():
return 1
@@ -201,16 +200,6 @@
assert f(-1) == 3
assert f(0) == 5
-def test_list_getitem():
- def list_getitem(i):
- l = [1,2,i]
- return l[i]
- f = compile_function(list_getitem, [int])
- assert f(0) == 1
- assert f(1) == 2
- assert f(3) == 3
-
-
def DONOT_test_simple_chars():
def char_constant2(s):
s = s + s + s
@@ -220,7 +209,23 @@
f = compile_function(char_constant, [])
assert f() == 7
-def DONOTtest_string_getitem():
+def DONOT_test_list_getitem():
+ def list_getitem(i):
+ l = [1,2,i]
+ return l[i]
+ f = compile_function(list_getitem, [int])
+ assert f(0) == 1
+ assert f(1) == 2
+ assert f(3) == 3
+
+def DONOT_test_string_getitem1():
+ l = "Hello, World"
+ def string_test(i):
+ return l[i]
+ f = compile_function(string_test, [int], view=True)
+ assert f(0) == ord("H")
+
+def DONOT_test_string_getitem2():
def string_test(i):
l = "Hello, World"
return l[i]
More information about the Pypy-commit
mailing list