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

ericvrp at codespeak.net ericvrp at codespeak.net
Fri Jul 29 16:56:15 CEST 2005


Author: ericvrp
Date: Fri Jul 29 16:56:14 2005
New Revision: 15354

Modified:
   pypy/dist/pypy/translator/llvm2/arraynode.py
   pypy/dist/pypy/translator/llvm2/extfuncnode.py
   pypy/dist/pypy/translator/llvm2/funcnode.py
   pypy/dist/pypy/translator/llvm2/genllvm.py
   pypy/dist/pypy/translator/llvm2/node.py
   pypy/dist/pypy/translator/llvm2/opwriter.py
   pypy/dist/pypy/translator/llvm2/structnode.py
Log:
refactor to get more readable llvm code


Modified: pypy/dist/pypy/translator/llvm2/arraynode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/arraynode.py	(original)
+++ pypy/dist/pypy/translator/llvm2/arraynode.py	Fri Jul 29 16:56:14 2005
@@ -3,13 +3,12 @@
 from pypy.translator.llvm2.log import log
 from pypy.translator.llvm2.node import LLVMNode, ConstantLLVMNode
 from pypy.translator.llvm2 import varsize 
-import itertools  
+import itertools
 log = log.structnode
 
-nextnum = itertools.count().next 
+nextnum = itertools.count().next
 
 class ArrayTypeNode(LLVMNode):
-    _issetup = False
     def __init__(self, db, array):
         assert isinstance(array, lltype.Array)
 
@@ -23,7 +22,7 @@
         # for the array type (see writeimpl)
         c = nextnum()
         self.ref = "%%arraytype.%s.%s" % (c, self.arraytype)
-        self.constructor_ref = "%%new.array.%s" % c 
+        self.constructor_ref = "%%new.array.%s" % c
         self.constructor_decl = "%s * %s(int %%len)" % \
                                 (self.ref, self.constructor_ref)
 
@@ -32,7 +31,6 @@
         
     def setup(self):
         self.db.prepare_repr_arg_type(self.arraytype)
-        self._issetup = True
 
     # ______________________________________________________________________
     # entry points from genllvm
@@ -57,13 +55,12 @@
     a struct,
     pointer to struct/array
     """
-    _issetup = True 
     def __init__(self, db, value):
         assert isinstance(lltype.typeOf(value), lltype.Array)
         self.db = db
         self.value = value
         self.arraytype = lltype.typeOf(value).OF
-        self.ref = "%%arrayinstance.%s" % (nextnum(),)
+        self.ref = self.make_ref('%arrayinstance', '')
 
     def __str__(self):
         return "<ArrayNode %r>" % (self.ref,)
@@ -78,7 +75,6 @@
         self.castref = "cast (%s* %s to %s*)" % (self.get_typerepr(),
                                                  self.ref,
                                                  typeval)
-        self._issetup = True
 
     def get_typerepr(self):
         items = self.value.items

Modified: pypy/dist/pypy/translator/llvm2/extfuncnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/extfuncnode.py	(original)
+++ pypy/dist/pypy/translator/llvm2/extfuncnode.py	Fri Jul 29 16:56:14 2005
@@ -4,7 +4,6 @@
 log = log.extfuncnode
 
 class ExternalFuncNode(LLVMNode):
-
     used_external_functions = {}
 
     def __init__(self, db, value):
@@ -12,9 +11,6 @@
         self.value = value
         self.ref = "%" + value._callable.__name__
 
-    def setup(self):
-        self._issetup = True
-
     def getdecl(self):
         T = self.value._TYPE
         args = [self.db.repr_arg_type(a) for a in T.ARGS]

Modified: pypy/dist/pypy/translator/llvm2/funcnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/funcnode.py	(original)
+++ pypy/dist/pypy/translator/llvm2/funcnode.py	Fri Jul 29 16:56:14 2005
@@ -7,7 +7,6 @@
 from pypy.translator.llvm2.node import LLVMNode, ConstantLLVMNode
 from pypy.translator.llvm2.opwriter import OpWriter
 from pypy.translator.llvm2.log import log 
-nextnum = py.std.itertools.count().next
 log = log.funcnode
 
 class FuncTypeNode(LLVMNode):
@@ -17,7 +16,7 @@
         self.type_ = type_
         # XXX Make simplier for now, it is far too hard to read otherwise
         #self.ref = 'ft.%s.%s' % (type_, nextnum())
-        self.ref = '%%functiontype.%s' % (nextnum(),)
+        self.ref = self.make_ref('%functiontype', '')
         
     def __str__(self):
         return "<FuncTypeNode %r>" % self.ref
@@ -32,8 +31,6 @@
         codewriter.funcdef(self.ref, returntype, inputargtypes)
                 
 class FuncNode(ConstantLLVMNode):
-    _issetup = False 
-
     def __init__(self, db, value):
         self.db = db
         self.value = value
@@ -57,7 +54,6 @@
                     self.db.prepare_arg(op.result)
         assert self.graph, "cannot traverse"
         traverse(visit, self.graph)
-        self._issetup = True
 
     # ______________________________________________________________________
     # main entry points from genllvm 
@@ -65,7 +61,6 @@
         codewriter.declare(self.getdecl())
 
     def writeimpl(self, codewriter):
-        assert self._issetup 
         graph = self.graph
         log.writeimpl(graph.name)
         codewriter.openfunc(self.getdecl())
@@ -89,7 +84,6 @@
     # writing helpers for entry points
 
     def getdecl(self):
-        assert self._issetup 
         startblock = self.graph.startblock
         returnblock = self.graph.returnblock
         inputargs = self.db.repr_arg_multi(startblock.inputargs)

Modified: pypy/dist/pypy/translator/llvm2/genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/genllvm.py	(original)
+++ pypy/dist/pypy/translator/llvm2/genllvm.py	Fri Jul 29 16:56:14 2005
@@ -16,6 +16,7 @@
 #from pypy.translator.backendoptimization import rename_extfunc_calls
 from pypy.translator.llvm2.module.extfunction import extdeclarations, \
      extfunctions, gc_boehm, gc_disabled, dependencies
+from pypy.translator.llvm2.node import LLVMNode
 
 from pypy.translator.translator import Translator
 
@@ -24,6 +25,7 @@
 class GenLLVM(object):
 
     def __init__(self, translator, embedexterns=True):
+        LLVMNode.nodename_count = {}    #reset counters
         self.db = Database(translator)
         self.translator = translator
         self.embedexterns = embedexterns

Modified: pypy/dist/pypy/translator/llvm2/node.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/node.py	(original)
+++ pypy/dist/pypy/translator/llvm2/node.py	Fri Jul 29 16:56:14 2005
@@ -1,4 +1,18 @@
 class LLVMNode(object):
+    nodename_count = {}
+
+    def make_name(self, name):
+        if name in self.nodename_count:
+            postfix = '.%d' % self.nodename_count[name]
+            self.nodename_count[name] += 1
+        else:
+            postfix = ''
+            self.nodename_count[name] = 1
+        return name + postfix
+
+    def make_ref(self, prefix, name):
+        return self.make_name(prefix + name)
+
     def ref(): 
         def _get_ref(self):
             return self._ref 
@@ -25,7 +39,6 @@
         return property(_get_ref, _set_ref)
     constructor_ref = constructor_ref()
 
-
     def setup(self):
         pass
 

Modified: pypy/dist/pypy/translator/llvm2/opwriter.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/opwriter.py	(original)
+++ pypy/dist/pypy/translator/llvm2/opwriter.py	Fri Jul 29 16:56:14 2005
@@ -223,6 +223,29 @@
         #self.codewriter.cast(tmpvar2, tmptype1, tmpvar1, tmptype2)
         #self.codewriter.switch(tmptype2, tmpvar2, exc_error_label, value_label)
 
+        #XXX get helper function name
+        exceptiondata      = self.db._translator.rtyper.getexceptiondata()
+        
+        #functions
+        ll_exception_match = exceptiondata.ll_exception_match.__name__
+        #yield ('RPYTHON_EXCEPTION_MATCH',  exceptiondata.ll_exception_match)
+        #yield ('RPYTHON_TYPE_OF_EXC_INST', exceptiondata.ll_type_of_exc_inst)
+        #yield ('RPYTHON_PYEXCCLASS2EXC',   exceptiondata.ll_pyexcclass2exc)
+        #yield ('RAISE_OSERROR',            exceptiondata.ll_raise_OSError)
+
+        #datatypes
+        lltype_of_exception_type  = 'structtype.' + exceptiondata.lltype_of_exception_type.TO.__name__
+        lltype_of_exception_value = 'structtype.' + exceptiondata.lltype_of_exception_value.TO.__name__
+        #yield ('RPYTHON_EXCEPTION_VTABLE', exceptiondata.lltype_of_exception_type)
+        #yield ('RPYTHON_EXCEPTION',        exceptiondata.lltype_of_exception_value)
+
+        self.codewriter.newline()
+        self.codewriter.comment('HERE')
+        self.codewriter.comment(ll_exception_match)         #ll_issubclass__object_vtablePtr_object_vtablePtr
+        self.codewriter.comment(lltype_of_exception_type)   #
+        self.codewriter.comment(lltype_of_exception_value)  #
+        self.codewriter.newline()
+
         self.codewriter.switch(tmptype1, tmpvar1, exc_error_label, value_label)
         self.codewriter.label(exc_error_label)
         self.codewriter.comment('dead code ahead')

Modified: pypy/dist/pypy/translator/llvm2/structnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/structnode.py	(original)
+++ pypy/dist/pypy/translator/llvm2/structnode.py	Fri Jul 29 16:56:14 2005
@@ -4,20 +4,17 @@
 from pypy.translator.llvm2 import varsize
 from pypy.rpython import lltype
 
-import itertools  
-nextnum = itertools.count().next 
-
 log = log.structnode 
 
 class StructTypeNode(LLVMNode):
-    _issetup = False 
-
     def __init__(self, db, struct): 
         assert isinstance(struct, lltype.Struct)
         self.db = db
         self.struct = struct
-        self.name = "%s.%s" % (self.struct._name , nextnum())
-        self.ref = "%%structtype.%s" % (self.name)
+        prefix = '%structtype.'
+        name = self.struct._name
+        self.ref = self.make_ref(prefix, name)
+        self.name = self.ref[len(prefix):]
         
     def __str__(self):
         return "<StructTypeNode %r>" %(self.ref,)
@@ -26,13 +23,11 @@
         # Recurse
         for field in self.struct._flds.values():
             self.db.prepare_repr_arg_type(field)
-        self._issetup = True
 
     # ______________________________________________________________________
     # main entry points from genllvm 
 
     def writedatatypedecl(self, codewriter):
-        assert self._issetup 
         fields = [getattr(self.struct, name)
                   for name in self.struct._names_without_voids()] 
         codewriter.structdef(self.ref,
@@ -42,7 +37,7 @@
 
     def __init__(self, db, struct): 
         super(StructVarsizeTypeNode, self).__init__(db, struct)
-        self.constructor_ref = "%%newvarsizestruct.%s" % (self.name)
+        self.constructor_ref = "%%new.varsizestruct.%s" % (self.name)
         self.constructor_decl = "%s * %s(int %%len)" % \
                                 (self.ref, self.constructor_ref)
 
@@ -83,13 +78,11 @@
     a struct,
     pointer to struct/array
     """
-    _issetup = False 
-
     def __init__(self, db, value):
         self.db = db
         self.value = value
         self.structtype = self.value._TYPE
-        self.ref = "%%structinstance.%s" % (nextnum(),)
+        self.ref = self.make_ref('%structinstance', '')
         
     def __str__(self):
         return "<StructNode %r>" % (self.ref,)
@@ -111,8 +104,6 @@
             value = getattr(self.value, name)
             self.db.prepare_constant(T, value)
                 
-        self._issetup = True
-
     def get_typerepr(self):
         return self.db.repr_arg_type(self.structtype)
     



More information about the Pypy-commit mailing list