[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