[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