[pypy-svn] r27363 - in pypy/dist/pypy: rpython/memory translator/c

mwh at codespeak.net mwh at codespeak.net
Wed May 17 15:09:30 CEST 2006


Author: mwh
Date: Wed May 17 15:09:28 2006
New Revision: 27363

Modified:
   pypy/dist/pypy/rpython/memory/gctransform.py
   pypy/dist/pypy/translator/c/funcgen.py
   pypy/dist/pypy/translator/c/gc.py
   pypy/dist/pypy/translator/c/primitive.py
Log:
do weak address hiding (if needed) in the backend rather than in the
gctransformer.


Modified: pypy/dist/pypy/rpython/memory/gctransform.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gctransform.py	(original)
+++ pypy/dist/pypy/rpython/memory/gctransform.py	Wed May 17 15:09:28 2006
@@ -660,28 +660,6 @@
         """ for boehm it is enough to do nothing"""
         return [SpaceOperation("same_as", [Constant(None, lltype.Void)], op.result)]
 
-    def replace_cast_ptr_to_weakadr(self, op, livevars, block):
-        result = []
-        intvar = varoftype(lltype.Signed)
-        invertvar = varoftype(lltype.Signed)
-        ptrvar = varoftype(op.args[0].concretetype)
-        result.append(SpaceOperation("cast_ptr_to_int", [op.args[0]], intvar))
-        result.append(SpaceOperation("int_invert", [intvar], invertvar))
-        result.append(SpaceOperation("cast_int_to_ptr", [invertvar], ptrvar))
-        result.append(SpaceOperation("cast_ptr_to_weakadr", [ptrvar], op.result))
-        return result
-
-    def replace_cast_weakadr_to_ptr(self, op, livevars, block):
-        result = []
-        intvar = varoftype(lltype.Signed)
-        invertvar = varoftype(lltype.Signed)
-        ptrvar = varoftype(op.args[0].concretetype)
-        result.append(SpaceOperation("cast_weakadr_to_ptr", [op.args[0]], ptrvar))
-        result.append(SpaceOperation("cast_ptr_to_int", [ptrvar], intvar))
-        result.append(SpaceOperation("int_invert", [intvar], invertvar))
-        result.append(SpaceOperation("cast_int_to_ptr", [invertvar], op.result))
-        return result
-
     def get_rtti(self, TYPE):
         if isinstance(TYPE, lltype.GcStruct):
             try:

Modified: pypy/dist/pypy/translator/c/funcgen.py
==============================================================================
--- pypy/dist/pypy/translator/c/funcgen.py	(original)
+++ pypy/dist/pypy/translator/c/funcgen.py	Wed May 17 15:09:28 2006
@@ -594,9 +594,18 @@
     OP_CAST_PTR_TO_ADR = OP_CAST_POINTER
     OP_CAST_ADR_TO_PTR = OP_CAST_POINTER
     OP_CAST_OPAQUE_PTR = OP_CAST_POINTER
-    OP_CAST_PTR_TO_WEAKADR = OP_CAST_POINTER
-    OP_CAST_WEAKADR_TO_PTR = OP_CAST_POINTER
 
+    def OP_CAST_PTR_TO_WEAKADR(self, op):
+        return '\t%s = HIDE_POINTER(%s);' % (self.expr(op.result),
+                                             self.expr(op.args[0]))
+
+    def OP_CAST_WEAKADR_TO_PTR(self, op):
+        TYPE = self.lltypemap(op.result)
+        assert TYPE != PyObjPtr
+        typename = self.db.gettype(TYPE)
+        return '\t%s = (%s)REVEAL_POINTER(%s);' % (self.expr(op.result),
+                                                   cdecl(typename, ''),
+                                                   self.expr(op.args[0]))
 
     def OP_CAST_INT_TO_PTR(self, op):
         TYPE = self.lltypemap(op.result)

Modified: pypy/dist/pypy/translator/c/gc.py
==============================================================================
--- pypy/dist/pypy/translator/c/gc.py	(original)
+++ pypy/dist/pypy/translator/c/gc.py	Wed May 17 15:09:28 2006
@@ -80,6 +80,12 @@
     def common_gcheader_initdata(self, defnode):
         return [REFCOUNT_IMMORTAL()]
 
+    def pre_gc_code(self):
+        return ['#define HIDE_POINTER(p) (p)',
+                '#define REVEAL_POINTER(p) (p)',
+                'typedef void *GC_hidden_pointer;']
+
+
     # for structs
 
     def struct_setup(self, structdefnode, rtti):
@@ -208,9 +214,11 @@
             yield "#define _REENTRANT 1"
             yield "#define GC_LINUX_THREADS 1"
             yield "#define GC_REDIRECT_TO_LOCAL 1"
+            yield "#define GC_I_HIDE_POINTERS 1"
             yield '#include <gc/gc_local_alloc.h>'
             yield '#define USING_BOEHM_GC'
         else:
+            yield "#define GC_I_HIDE_POINTERS 1"
             yield '#include <gc/gc.h>'
             yield '#define USING_BOEHM_GC'
 
@@ -342,6 +350,11 @@
     def pre_pre_gc_code(self):
         yield '#define USING_NO_GC'
 
+    def pre_gc_code(self):
+        return ['#define HIDE_POINTER(p) (p)',
+                '#define REVEAL_POINTER(p) (p)',
+                'typedef void *GC_hidden_pointer;']
+
 
 class FrameworkGcPolicy(BasicGcPolicy):
     transformerclass = gctransform.FrameworkGCTransformer

Modified: pypy/dist/pypy/translator/c/primitive.py
==============================================================================
--- pypy/dist/pypy/translator/c/primitive.py	(original)
+++ pypy/dist/pypy/translator/c/primitive.py	Wed May 17 15:09:28 2006
@@ -155,7 +155,7 @@
     Bool:     '((char) -1)',
     Void:     '/* error */',
     Address:  'NULL',
-    WeakGcAddress:  'NULL',
+    WeakGcAddress:  'HIDE_POINTER(NULL)',
     }
 
 def define_c_primitive(ll_type, c_name):



More information about the Pypy-commit mailing list