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

rxe at codespeak.net rxe at codespeak.net
Wed Aug 3 10:59:10 CEST 2005


Author: rxe
Date: Wed Aug  3 10:59:08 2005
New Revision: 15543

Removed:
   pypy/dist/pypy/translator/llvm2/atomic.py
Modified:
   pypy/dist/pypy/translator/llvm2/arraynode.py
   pypy/dist/pypy/translator/llvm2/opwriter.py
   pypy/dist/pypy/translator/llvm2/structnode.py
Log:
Rationalise atomic malloc a little.



Modified: pypy/dist/pypy/translator/llvm2/arraynode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/arraynode.py	(original)
+++ pypy/dist/pypy/translator/llvm2/arraynode.py	Wed Aug  3 10:59:08 2005
@@ -32,6 +32,15 @@
     def setup(self):
         self.db.prepare_repr_arg_type(self.arraytype)
 
+    def is_atomic(self):
+        if isinstance(self.arraytype, lltype.Primitive):
+            return True
+        elif isinstance(self.arraytype, lltype.Ptr):
+            return False
+        else:
+            # XXX Recurse...
+            return False
+
     # ______________________________________________________________________
     # entry points from genllvm
     #
@@ -47,7 +56,8 @@
         fromtype = self.db.repr_arg_type(self.arraytype) 
         varsize.write_constructor(codewriter, self.ref, 
                                   self.constructor_decl,
-                                  fromtype)
+                                  fromtype,
+                                  atomicmalloc=self.is_atomic())
 
 class VoidArrayTypeNode(LLVMNode):
 
@@ -181,5 +191,4 @@
 
     def constantvalue(self):
         return "{ int } {int %s}" % len(self.value.items)
-    
 

Deleted: /pypy/dist/pypy/translator/llvm2/atomic.py
==============================================================================
--- /pypy/dist/pypy/translator/llvm2/atomic.py	Wed Aug  3 10:59:08 2005
+++ (empty file)
@@ -1,20 +0,0 @@
-from pypy.translator.llvm2.log import log
-from pypy.translator.llvm2.structnode import StructTypeNode
-from pypy.translator.llvm2.arraynode import ArrayTypeNode
-from pypy.rpython import lltype
-
-log = log.atomic
-
-def is_atomic(node):
-    # XXX is the below really right? 
-    if isinstance(node, StructTypeNode):
-        fields = [getattr(node.struct, name) 
-                    for name in node.struct._names_without_voids()]
-        fields = [x for x in fields if isinstance(x, lltype.Ptr)]
-        if not fields: 
-            return True #non-pointers only
-        return False    #contains pointer(s)
-    elif isinstance(node, ArrayTypeNode):
-        return not isinstance(node.array.OF, lltype.Ptr)
-    log("unknown type %s, assuming non-atomic" % str(type(node)))
-    return False    

Modified: pypy/dist/pypy/translator/llvm2/opwriter.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/opwriter.py	(original)
+++ pypy/dist/pypy/translator/llvm2/opwriter.py	Wed Aug  3 10:59:08 2005
@@ -1,7 +1,6 @@
 import py
 from pypy.objspace.flow.model import Constant
 from pypy.rpython import lltype
-from pypy.translator.llvm2.atomic import is_atomic
 from pypy.translator.llvm2.log import log 
 log = log.opwriter
 
@@ -310,7 +309,7 @@
         #XXX unclean
         node  = self.db.obj2node[arg.value]
         type_ = node.ref
-        self.codewriter.malloc(targetvar, type_, atomic=is_atomic(node)) 
+        self.codewriter.malloc(targetvar, type_, atomic=node.is_atomic())
 
     def malloc_varsize(self, op):
         targetvar = self.db.repr_arg(op.result)
@@ -325,7 +324,7 @@
         from pypy.translator.llvm2.arraynode import VoidArrayTypeNode
         if isinstance(node, VoidArrayTypeNode):
             type_ = node.ref
-            self.codewriter.malloc(targetvar, type_, atomic=is_atomic(node)) 
+            self.codewriter.malloc(targetvar, type_, atomic=True) 
             return
         
         struct_type = node.ref

Modified: pypy/dist/pypy/translator/llvm2/structnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/structnode.py	(original)
+++ pypy/dist/pypy/translator/llvm2/structnode.py	Wed Aug  3 10:59:08 2005
@@ -18,18 +18,31 @@
         
     def __str__(self):
         return "<StructTypeNode %r>" %(self.ref,)
+
+    def _fields(self):
+        return [getattr(self.struct, name) 
+                for name in self.struct._names_without_voids()]
     
     def setup(self):
         # Recurse
-        for field in self.struct._flds.values():
+        for field in self._fields():
             self.db.prepare_repr_arg_type(field)
 
+    def is_atomic(self):
+        for f in self._fields():
+            if isinstance(f, lltype.Ptr):
+                return False
+
+            if not isinstance(f, lltype.Primitive):
+                # XXX Recurse
+                return False
+
+        return True
     # ______________________________________________________________________
     # main entry points from genllvm 
 
     def writedatatypedecl(self, codewriter):
-        fields = [getattr(self.struct, name)
-                  for name in self.struct._names_without_voids()] 
+        fields = self._fields()
         codewriter.structdef(self.ref,
                              self.db.repr_arg_type_multi(fields))
 
@@ -52,8 +65,6 @@
         codewriter.declare(self.constructor_decl)
 
     def writeimpl(self, codewriter):
-        from pypy.translator.llvm2.atomic import is_atomic
-
         log.writeimpl(self.ref)
 
         # build up a list of indices to get to the last 
@@ -70,7 +81,8 @@
         # XXX write type info as a comment 
         varsize.write_constructor(codewriter, 
             self.ref, self.constructor_decl, arraytype, 
-            indices_to_array)
+            indices_to_array,
+            atomicmalloc=self.is_atomic())
 
 class StructNode(ConstantLLVMNode):
     """ A struct constant.  Can simply contain



More information about the Pypy-commit mailing list