[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