[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