[pypy-svn] r29541 - in pypy/dist/pypy/translator/llvm: . test
rxe at codespeak.net
rxe at codespeak.net
Sat Jul 1 00:01:50 CEST 2006
Author: rxe
Date: Sat Jul 1 00:01:47 2006
New Revision: 29541
Modified:
pypy/dist/pypy/translator/llvm/arraynode.py
pypy/dist/pypy/translator/llvm/structnode.py
pypy/dist/pypy/translator/llvm/test/test_lltype.py
Log:
y
Modified: pypy/dist/pypy/translator/llvm/arraynode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/arraynode.py (original)
+++ pypy/dist/pypy/translator/llvm/arraynode.py Sat Jul 1 00:01:47 2006
@@ -86,7 +86,6 @@
self.db.prepare_constant(self.arraytype, item)
p, c = lltype.parentlink(self.value)
- p, c = lltype.parentlink(self.value)
if p is not None:
self.db.prepare_constant(lltype.typeOf(p), p)
@@ -109,18 +108,21 @@
def get_ref(self):
typeval = self.db.repr_type(lltype.typeOf(self.value))
+ p, c = lltype.parentlink(self.value)
+ if p is None:
+ ref = self.ref
+ else:
+ ref = self.db.get_childref(p, c)
+
ref = "cast(%s* %s to %s*)" % (self.get_typerepr(),
- self.ref,
+ ref,
typeval)
-
- p, c = lltype.parentlink(self.value)
- assert p is None, "child arrays are NOT needed by rtyper"
return ref
def get_pbcref(self, toptr):
ref = self.ref
p, c = lltype.parentlink(self.value)
- assert p is None, "child arrays are NOT needed by rtyper"
+ assert p is None, "child PBC arrays are NOT needed by rtyper"
fromptr = "%s*" % self.get_typerepr()
ref = "cast(%s %s to %s)" % (fromptr, ref, toptr)
Modified: pypy/dist/pypy/translator/llvm/structnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/structnode.py (original)
+++ pypy/dist/pypy/translator/llvm/structnode.py Sat Jul 1 00:01:47 2006
@@ -209,24 +209,37 @@
types_repr.append(self._get_lastnode().get_typerepr())
result = "{%s}" % ", ".join(types_repr)
self._get_typerepr_cache = result
- return result
-
+ return result
+
+ def get_childref(self, index):
+ pos = 0
+ found = False
+ for name in self.structtype._names_without_voids():
+ if name == index:
+ found = True
+ break
+ pos += 1
+
+ ref = "getelementptr(%s* %s, int 0, uint %s)" %(
+ self.get_typerepr(),
+ super(StructVarsizeNode, self).get_ref(),
+ pos)
+
+ return ref
+
def get_ref(self):
- if self._get_ref_cache:
- return self._get_ref_cache
ref = super(StructVarsizeNode, self).get_ref()
typeval = self.db.repr_type(lltype.typeOf(self.value))
ref = "cast(%s* %s to %s*)" % (self.get_typerepr(),
ref,
typeval)
- self._get_ref_cache = ref
return ref
def get_pbcref(self, toptr):
""" Returns a reference as used per pbc. """
ref = self.ref
p, c = lltype.parentlink(self.value)
- assert p is None, "child arrays are NOT needed by rtyper"
+ assert p is None, "child varsize struct are NOT needed by rtyper"
fromptr = "%s*" % self.get_typerepr()
refptr = "getelementptr(%s %s, int 0)" % (fromptr, ref)
ref = "cast(%s %s to %s)" % (fromptr, refptr, toptr)
Modified: pypy/dist/pypy/translator/llvm/test/test_lltype.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/test/test_lltype.py (original)
+++ pypy/dist/pypy/translator/llvm/test/test_lltype.py Sat Jul 1 00:01:47 2006
@@ -172,7 +172,7 @@
return s.aptr[1] - a[0]
f = compile_function(array_constant, [])
assert f() == array_constant()
-
+
def test_struct_array2():
A = lltype.Array(lltype.Signed)
STEST = lltype.GcStruct('test', ('a', lltype.Signed), ('b', A))
@@ -180,6 +180,7 @@
s.a = 41
s.b[0] = 100
s.b[1] = 101
+
def array_constant():
return s.b[1] - s.b[0] + s.a
f = compile_function(array_constant, [])
More information about the Pypy-commit
mailing list