[pypy-svn] r54656 - in pypy/branch/hybrid-io/pypy/rpython/memory: gc gctransform test
fijal at codespeak.net
fijal at codespeak.net
Sun May 11 20:32:01 CEST 2008
Author: fijal
Date: Sun May 11 20:32:00 2008
New Revision: 54656
Modified:
pypy/branch/hybrid-io/pypy/rpython/memory/gc/hybrid.py
pypy/branch/hybrid-io/pypy/rpython/memory/gctransform/framework.py
pypy/branch/hybrid-io/pypy/rpython/memory/gctransform/transform.py
pypy/branch/hybrid-io/pypy/rpython/memory/test/test_transformed_gc.py
Log:
Implement basic version of malloc_nonmovable for hybrid gc
Modified: pypy/branch/hybrid-io/pypy/rpython/memory/gc/hybrid.py
==============================================================================
--- pypy/branch/hybrid-io/pypy/rpython/memory/gc/hybrid.py (original)
+++ pypy/branch/hybrid-io/pypy/rpython/memory/gc/hybrid.py Sun May 11 20:32:00 2008
@@ -200,6 +200,9 @@
malloc_varsize_slowpath._dont_inline_ = True
malloc_varsize_slowpath._annspecialcase_ = 'specialize:arg(3)'
+ def malloc_varsize_nonmovable(self, typeid, length):
+ return self.malloc_varsize_slowpath(typeid, length, True)
+
def malloc_nonmovable(self, typeid, length, zero):
# helper for testing, same as GCBase.malloc
if self.is_varsize(typeid):
Modified: pypy/branch/hybrid-io/pypy/rpython/memory/gctransform/framework.py
==============================================================================
--- pypy/branch/hybrid-io/pypy/rpython/memory/gctransform/framework.py (original)
+++ pypy/branch/hybrid-io/pypy/rpython/memory/gctransform/framework.py Sun May 11 20:32:00 2008
@@ -273,6 +273,17 @@
else:
self.malloc_varsize_clear_fast_ptr = None
+ if getattr(GCClass, 'malloc_varsize_nonmovable', False):
+ malloc_nonmovable = func_with_new_name(
+ GCClass.malloc_varsize_nonmovable.im_func,
+ "malloc_varsize_nonmovable")
+ self.malloc_varsize_nonmovable_ptr = getfn(
+ malloc_nonmovable,
+ [s_gc, annmodel.SomeInteger(nonneg=True),
+ annmodel.SomeInteger(nonneg=True)], s_gcref)
+ else:
+ self.malloc_varsize_nonmovable_ptr = None
+
if GCClass.moving_gc:
self.id_ptr = getfn(GCClass.id.im_func,
[s_gc, s_gcref], annmodel.SomeInteger(),
@@ -456,14 +467,22 @@
v_length = op.args[-1]
c_ofstolength = rmodel.inputconst(lltype.Signed, info.ofstolength)
c_varitemsize = rmodel.inputconst(lltype.Signed, info.varitemsize)
- if (self.malloc_varsize_clear_fast_ptr is not None and
- c_can_collect.value and not c_has_finalizer.value):
- malloc_ptr = self.malloc_varsize_clear_fast_ptr
+ if flags.get('nonmovable') and self.malloc_varsize_nonmovable_ptr:
+ # we don't have tests for such cases, let's fail
+ # explicitely
+ assert c_can_collect.value
+ assert not c_has_finalizer.value
+ malloc_ptr = self.malloc_varsize_nonmovable_ptr
+ args = [self.c_const_gc, c_type_id, v_length]
else:
- malloc_ptr = self.malloc_varsize_clear_ptr
- args = [self.c_const_gc, c_type_id, v_length, c_size,
- c_varitemsize, c_ofstolength, c_can_collect,
- c_has_finalizer]
+ if (self.malloc_varsize_clear_fast_ptr is not None and
+ c_can_collect.value and not c_has_finalizer.value):
+ malloc_ptr = self.malloc_varsize_clear_fast_ptr
+ else:
+ malloc_ptr = self.malloc_varsize_clear_ptr
+ args = [self.c_const_gc, c_type_id, v_length, c_size,
+ c_varitemsize, c_ofstolength, c_can_collect,
+ c_has_finalizer]
livevars = self.push_roots(hop)
v_result = hop.genop("direct_call", [malloc_ptr] + args,
resulttype=llmemory.GCREF)
@@ -593,19 +612,17 @@
def gct_malloc_nonmovable_varsize(self, hop):
TYPE = hop.spaceop.result.concretetype
- if self.gcdata.gc.moving_gc:
- # first approximation
- c = rmodel.inputconst(TYPE, lltype.nullptr(TYPE.TO))
- return hop.cast_result(c)
- return self.gct_malloc_varsize(hop)
+ if self.gcdata.gc.can_malloc_nonmovable():
+ return self.gct_malloc_varsize(hop, {'nonmovable':True})
+ c = rmodel.inputconst(TYPE, lltype.nullptr(TYPE.TO))
+ return hop.cast_result(c)
def gct_malloc_nonmovable(self, hop):
TYPE = hop.spaceop.result.concretetype
- if self.gcdata.gc.moving_gc:
- # first approximation
- c = rmodel.inputconst(TYPE, lltype.nullptr(TYPE.TO))
- return hop.cast_result(c)
- return self.gct_malloc(hop)
+ if self.gcdata.gc.can_malloc_nonmovable():
+ return self.gct_malloc(hop, {'nonmovable':True})
+ c = rmodel.inputconst(TYPE, lltype.nullptr(TYPE.TO))
+ return hop.cast_result(c)
def transform_generic_set(self, hop):
from pypy.objspace.flow.model import Constant
Modified: pypy/branch/hybrid-io/pypy/rpython/memory/gctransform/transform.py
==============================================================================
--- pypy/branch/hybrid-io/pypy/rpython/memory/gctransform/transform.py (original)
+++ pypy/branch/hybrid-io/pypy/rpython/memory/gctransform/transform.py Sun May 11 20:32:00 2008
@@ -495,7 +495,7 @@
self.stack_malloc_fixedsize_ptr = self.inittime_helper(
ll_stack_malloc_fixedsize, [lltype.Signed], llmemory.Address)
- def gct_malloc(self, hop):
+ def gct_malloc(self, hop, add_flags=None):
TYPE = hop.spaceop.result.concretetype.TO
assert not TYPE._is_varsize()
flags = hop.spaceop.args[1].value
@@ -520,17 +520,21 @@
hop.genop("raw_memclear", [v_raw, c_size])
return v_raw
- def gct_malloc_varsize(self, hop):
-
+ def gct_malloc_varsize(self, hop, add_flags=None):
flags = hop.spaceop.args[1].value
+ if add_flags:
+ flags.update(add_flags)
flavor = flags['flavor']
assert flavor != 'cpy', "cannot malloc CPython objects directly"
meth = getattr(self, 'gct_fv_%s_malloc_varsize' % flavor, None)
assert meth, "%s has no support for malloc_varsize with flavor %r" % (self, flavor)
return self.varsize_malloc_helper(hop, flags, meth, [])
- gct_malloc_nonmovable = gct_malloc
- gct_malloc_nonmovable_varsize = gct_malloc_varsize
+ def gct_malloc_nonmovable(self, *args, **kwds):
+ return self.gct_malloc(*args, **kwds)
+
+ def gct_malloc_nonmovable_varsize(self, *args, **kwds):
+ return self.gct_malloc_varsize(*args, **kwds)
def gct_malloc_resizable_buffer(self, hop):
flags = hop.spaceop.args[1].value
Modified: pypy/branch/hybrid-io/pypy/rpython/memory/test/test_transformed_gc.py
==============================================================================
--- pypy/branch/hybrid-io/pypy/rpython/memory/test/test_transformed_gc.py (original)
+++ pypy/branch/hybrid-io/pypy/rpython/memory/test/test_transformed_gc.py Sun May 11 20:32:00 2008
@@ -37,6 +37,7 @@
gcpolicy = None
stacklessgc = False
GC_CAN_MOVE = False
+ GC_CANNOT_MALLOC_NONMOVABLE = False
def runner(self, f, nbargs=0, statistics=False, transformer=False,
**extraconfigopts):
@@ -459,19 +460,19 @@
def test_malloc_nonmovable(self):
TP = lltype.GcArray(lltype.Char)
def func():
- try:
- from pypy.rlib import rgc
- a = rgc.malloc_nonmovable(TP, 3)
- rgc.collect()
- if a:
- assert not rgc.can_move(a)
- return 0
- return 1
- except Exception, e:
- return 2
+ #try:
+ from pypy.rlib import rgc
+ a = rgc.malloc_nonmovable(TP, 3)
+ rgc.collect()
+ if a:
+ assert not rgc.can_move(a)
+ return 0
+ return 1
+ #except Exception, e:
+ # return 2
run = self.runner(func)
- assert int(self.GC_CAN_MOVE) == run([])
+ assert int(self.GC_CANNOT_MALLOC_NONMOVABLE) == run([])
def test_malloc_nonmovable_fixsize(self):
S = lltype.GcStruct('S', ('x', lltype.Float))
@@ -489,7 +490,7 @@
return 2
run = self.runner(func)
- assert run([]) == int(self.GC_CAN_MOVE)
+ assert run([]) == int(self.GC_CANNOT_MALLOC_NONMOVABLE)
def test_resizable_buffer(self):
from pypy.rpython.lltypesystem.rstr import STR
@@ -508,6 +509,7 @@
class GenericMovingGCTests(GenericGCTests):
GC_CAN_MOVE = True
+ GC_CANNOT_MALLOC_NONMOVABLE = True
def test_many_ids(self):
py.test.skip("fails for bad reasons in lltype.py :-(")
@@ -956,6 +958,7 @@
class TestHybridGC(TestGenerationGC):
gcname = "hybrid"
+ GC_CANNOT_MALLOC_NONMOVABLE = False
class gcpolicy(gc.FrameworkGcPolicy):
class transformerclass(framework.FrameworkGCTransformer):
@@ -986,3 +989,6 @@
run = self.runner(f, nbargs=2)
res = run([100, 100])
assert res == 200
+
+ def test_malloc_nonmovable_fixsize(self):
+ py.test.skip("not supported")
More information about the Pypy-commit
mailing list