[pypy-svn] r14083 - pypy/dist/pypy/translator/llvm2

cfbolz at codespeak.net cfbolz at codespeak.net
Sat Jul 2 13:38:22 CEST 2005


Author: cfbolz
Date: Sat Jul  2 13:38:22 2005
New Revision: 14083

Added:
   pypy/dist/pypy/translator/llvm2/node.py
Modified:
   pypy/dist/pypy/translator/llvm2/codewriter.py
   pypy/dist/pypy/translator/llvm2/database.py
   pypy/dist/pypy/translator/llvm2/funcnode.py
Log:
(ericvrp, cfbolz):

fixed FuncTypeNode to use the prepare properly, not change ref after construction etc.



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 13:38:22 2005
@@ -10,12 +10,7 @@
 
     def append(self, line): 
         if show_line_numbers:
-            global  line_number
-            try:
-                line_number += 1
-            except:
-                line_number = 1
-            line = "%-80s; %d" % (line, line_number)
+            line = "%-75s; %d" % (line, len(self._lines) + 1)
         self._lines.append(line) 
         log(line) 
 
@@ -34,6 +29,10 @@
     def arraydef(self, name, typerepr):
         self.append("%s = type { int, [0 x %s] }" % (name, typerepr))
 
+    def funcdef(self, name, rettyperepr, argtypereprs):
+        self.append("%s = type %s (%s)" % (name, rettyperepr,
+                                           ", ".join(argtypereprs)))
+
     def declare(self, decl):
         self.append("declare %s" %(decl,))
 

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 13:38:22 2005
@@ -1,8 +1,7 @@
 from pypy.translator.llvm2.log import log 
-from pypy.translator.llvm2.funcnode import FuncNode, FuncSig
+from pypy.translator.llvm2.funcnode import FuncNode, FuncTypeNode
 from pypy.translator.llvm2.structnode import StructNode, StructInstance
 from pypy.translator.llvm2.arraynode import ArrayNode
-ArrayNode
 from pypy.rpython import lltype
 from pypy.objspace.flow.model import Block, Constant, Variable
 
@@ -55,7 +54,11 @@
                 else:
                     log.XXX("not sure what to do about %s(%s)" % (ct, const_or_var))
         else:
-            log.prepare.ignore(const_or_var) 
+            log.prepare.ignore(const_or_var)
+
+    def prepare_repr_arg_multi(self, args):
+        for const_or_var in args:
+            self.prepare_repr_arg(const_or_var)
 
     def prepare_repr_arg_type(self, type_):
         if type_ in self.obj2node:
@@ -69,7 +72,7 @@
             self.addpending(type_, StructNode(self, type_))
 
         elif isinstance(type_, lltype.FuncType): 
-            self.addpending(type_, FuncSig(self, type_))
+            self.addpending(type_, FuncTypeNode(self, type_))
 
         elif isinstance(type_, lltype.Array): 
             self.addpending(type_, ArrayNode(self, type_))
@@ -77,6 +80,10 @@
         else:     
             log.XXX("need to prepare typerepr", type_)
 
+    def prepare_repr_arg_type_multi(self, types):
+        for type_ in types:
+            self.prepare_repr_arg_type(type_)
+
     def prepare_arg(self, const_or_var):
         log.prepare(const_or_var)
         self.prepare_repr_arg_type(const_or_var.concretetype)
@@ -95,7 +102,7 @@
         return res
 
     def get_typedecls(self):
-        return self.getobjects((StructNode, ArrayNode))
+        return self.getobjects((StructNode, ArrayNode, FuncTypeNode))
 
     def get_globaldata(self):
         return self.getobjects((StructInstance))
@@ -132,7 +139,7 @@
                 
         log.dump_db("*** unknown ***")
         for k,v in all_objs:
-            if isinstance(v, (FuncSig)):
+            if isinstance(v, (FuncTypeNode)):
                 log.dump_db("%s ---> %s" % (k, v))
         
     # __________________________________________________________

Modified: pypy/dist/pypy/translator/llvm2/funcnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/funcnode.py	(original)
+++ pypy/dist/pypy/translator/llvm2/funcnode.py	Sat Jul  2 13:38:22 2005
@@ -3,28 +3,36 @@
 from pypy.objspace.flow.model import flatten, mkentrymap, traverse
 from pypy.rpython import lltype
 from pypy.translator.llvm2.cfgtransform import prepare_graph
+from pypy.translator.llvm2.node import LLVMNode
 from pypy.translator.llvm2.log import log 
 log = log.funcnode
 
-class FuncSig(object):
-    """ XXX Not sure about this - should be combined with FuncNode?
-    Abstract function signature. """
-    def __init__(self, db, typ):
+class FuncTypeNode(LLVMNode):
+    func_type_node_counter = 0
+
+    def __init__(self, db, type_):
         self.db = db
-        self.typ = typ
-        # Hack around some debug statements
-        self.ref = "pending setup!"
+        self.type_ = type_
+        ref = '"ft.%s.%s"' % (type_, FuncTypeNode.func_type_node_counter)
+        self.ref = ref.replace(" ", "")
+        FuncTypeNode.func_type_node_counter += 1
         
     def __str__(self):
-        return "<FuncSig %r>" % self.ref
+        return "<FuncTypeNode %r>" % self.ref
 
     def setup(self):
-        returntype = self.db.repr_arg_type(self.typ.RESULT)
-        inputargtypes = self.db.repr_arg_type_multi(self.typ.ARGS)
-        self.ref = "%s (%s)" % (returntype, ", ".join(inputargtypes))
+        self.db.prepare_repr_arg_type(self.type_.RESULT)
+        self.db.prepare_repr_arg_type(self.type_.ARGS)
+
+    def writedatatypedecl(self, codewriter):
+        returntype = self.db.repr_arg_type(self.type_.RESULT)
+        inputargtypes = self.db.repr_arg_type_multi(self.type_.ARGS)
+        decl = "%s type %s (%s)*" % (self.ref, returntype,
+                                     ", ".join(inputargtypes))
+        codewriter.funcdef(self.ref, returntype, inputargtypes)
 
 
-class FuncNode(object):
+class FuncNode(LLVMNode):
     _issetup = False 
 
     def __init__(self, db, const_ptr_func):

Added: pypy/dist/pypy/translator/llvm2/node.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/translator/llvm2/node.py	Sat Jul  2 13:38:22 2005
@@ -0,0 +1,9 @@
+class LLVMNode(object):
+    def _get_ref(self):
+        return self._ref
+    def _set_ref(self, ref):
+        if hasattr(self, "_ref"):
+            raise TypeError, ("can only set ref once! currently: %s" %
+                               (self._ref,))
+        self._ref = ref
+    ref = property(_get_ref, _set_ref)



More information about the Pypy-commit mailing list