[pypy-svn] r15465 - pypy/dist/pypy/translator/llvm2
rxe at codespeak.net
rxe at codespeak.net
Sun Jul 31 14:45:42 CEST 2005
Author: rxe
Date: Sun Jul 31 14:45:40 2005
New Revision: 15465
Modified:
pypy/dist/pypy/translator/llvm2/arraynode.py
pypy/dist/pypy/translator/llvm2/database.py
Log:
Check in a null terminated str array nodes - fwiw (it doesnt break anything).
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 14:45:40 2005
@@ -75,6 +75,7 @@
self.db.prepare_constant(lltype.typeOf(p), p)
def get_length(self):
+ """ returns logical length of array """
items = self.value.items
return len(items)
@@ -83,8 +84,9 @@
return [self.db.repr_constant(v)[1] for v in items]
def get_typerepr(self):
+ arraylen = len(self.get_arrayvalues())
typeval = self.db.repr_arg_type(self.arraytype)
- return "{ int, [%s x %s] }" % (self.get_length(), typeval)
+ return "{ int, [%s x %s] }" % (arraylen, typeval)
def get_ref(self):
""" Returns a reference as used for operations in blocks. """
@@ -118,16 +120,17 @@
def constantvalue(self):
""" Returns the constant representation for this node. """
- arraylen = self.get_length()
arrayvalues = self.get_arrayvalues()
typeval = self.db.repr_arg_type(self.arraytype)
- value = "int %s, [%s x %s] [ %s ]" % (arraylen,
- arraylen,
+ # first length is logical, second is physical
+ value = "int %s, [%s x %s] [ %s ]" % (self.get_length(),
+ len(arrayvalues),
typeval,
", ".join(arrayvalues))
s = "%s {%s}" % (self.get_typerepr(), value)
+
#XXXX ????????
#XXX this does not work for arrays inlined in struct. How else to do this?
#if typeval == 'sbyte': #give more feedback for strings
@@ -149,12 +152,10 @@
if p is None:
codewriter.globalinstance(self.ref, self.constantvalue())
-class StrArrayNode(ConstantLLVMNode):
-
- def get_length(self):
- # For null character
- return super(StrArrayNode, self).get_length() + 1
+class StrArrayNode(ArrayNode):
def get_arrayvalues(self):
- items = self.value.items + [chr(0)]
+ items = self.value.items
+ if len(items) == 0 or items[-1] != chr(0):
+ items = items + [chr(0)]
return [self.db.repr_constant(v)[1] for v in items]
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 14:45:40 2005
@@ -3,12 +3,14 @@
from pypy.translator.llvm2.extfuncnode import ExternalFuncNode
from pypy.translator.llvm2.structnode import StructNode, StructVarsizeNode, \
StructTypeNode, StructVarsizeTypeNode
-from pypy.translator.llvm2.arraynode import ArrayNode, ArrayTypeNode
+from pypy.translator.llvm2.arraynode import ArrayNode, StrArrayNode, \
+ ArrayTypeNode
from pypy.translator.llvm2.opaquenode import OpaqueNode, OpaqueTypeNode
from pypy.translator.llvm2.node import ConstantLLVMNode
from pypy.rpython import lltype
from pypy.objspace.flow.model import Block, Constant, Variable
-
+from pypy.rpython.rstr import STR
+
log = log.database
PRIMITIVES_TO_LLVM = {lltype.Signed: "int",
@@ -122,7 +124,10 @@
node = StructNode(self, value)
elif isinstance(type_, lltype.Array):
- node = ArrayNode(self, value)
+ if type_ is STR.chars:
+ node = StrArrayNode(self, value)
+ else:
+ node = ArrayNode(self, value)
elif isinstance(type_, lltype.OpaqueType):
node = OpaqueNode(self, value)
More information about the Pypy-commit
mailing list