[pypy-svn] r54055 - in pypy/branch/io-improvements/pypy/rpython: . memory memory/test
fijal at codespeak.net
fijal at codespeak.net
Wed Apr 23 16:51:50 CEST 2008
Author: fijal
Date: Wed Apr 23 16:51:48 2008
New Revision: 54055
Modified:
pypy/branch/io-improvements/pypy/rpython/llinterp.py
pypy/branch/io-improvements/pypy/rpython/memory/gcwrapper.py
pypy/branch/io-improvements/pypy/rpython/memory/test/test_gc.py
pypy/branch/io-improvements/pypy/rpython/memory/test/test_transformed_gc.py
Log:
* Add tests to test_gc
* Simplify tests in test_tranformed_gc
* support in llinterp for malloc_nonmoving (still, pretty basic)
Modified: pypy/branch/io-improvements/pypy/rpython/llinterp.py
==============================================================================
--- pypy/branch/io-improvements/pypy/rpython/llinterp.py (original)
+++ pypy/branch/io-improvements/pypy/rpython/llinterp.py Wed Apr 23 16:51:48 2008
@@ -685,11 +685,17 @@
except MemoryError:
self.make_llexception()
- def op_malloc_nonmovable(self, obj, flags, size):
- return self.op_malloc(obj, flags, size)
+ def op_malloc_nonmovable(self, obj, flags):
+ flavor = flags['flavor']
+ assert flavor == 'gc'
+ zero = flags.get('zero', False)
+ return self.heap.malloc_nonmovable(obj, zero=zero)
def op_malloc_nonmovable_varsize(self, obj, flags, size):
- return self.op_malloc_varsize(obj, flags, size)
+ flavor = flags['flavor']
+ assert flavor == 'gc'
+ zero = flags.get('zero', False)
+ return self.heap.malloc_nonmovable(obj, size, zero=zero)
def op_free(self, obj, flavor):
assert isinstance(flavor, str)
Modified: pypy/branch/io-improvements/pypy/rpython/memory/gcwrapper.py
==============================================================================
--- pypy/branch/io-improvements/pypy/rpython/memory/gcwrapper.py (original)
+++ pypy/branch/io-improvements/pypy/rpython/memory/gcwrapper.py Wed Apr 23 16:51:48 2008
@@ -42,6 +42,16 @@
else:
return lltype.malloc(TYPE, n, flavor=flavor, zero=zero)
+ def malloc_nonmovable(self, TYPE, n=None, zero=False):
+ typeid = self.get_type_id(TYPE)
+ if self.gc.moving_gc:
+ return lltype.nullptr(TYPE)
+ addr = self.gc.malloc(typeid, n, zero=zero)
+ result = llmemory.cast_adr_to_ptr(addr, lltype.Ptr(TYPE))
+ if not self.gc.malloc_zero_filled:
+ gctypelayout.zero_gc_pointers(result)
+ return result
+
def free(self, TYPE, flavor='gc'):
assert flavor != 'gc'
return lltype.free(TYPE, flavor=flavor)
Modified: pypy/branch/io-improvements/pypy/rpython/memory/test/test_gc.py
==============================================================================
--- pypy/branch/io-improvements/pypy/rpython/memory/test/test_gc.py (original)
+++ pypy/branch/io-improvements/pypy/rpython/memory/test/test_gc.py Wed Apr 23 16:51:48 2008
@@ -396,6 +396,39 @@
return rgc.can_move(lltype.malloc(TP, 1))
assert self.interpret(func, []) == self.GC_CAN_MOVE
+
+ def test_malloc_nonmovable(self):
+ TP = lltype.GcArray(lltype.Char)
+ def func():
+ try:
+ from pypy.rlib import rgc
+ a = rgc.malloc_nonmovable(TP, 3)
+ if a:
+ assert not rgc.can_move(a)
+ return 0
+ return 1
+ except Exception, e:
+ return 2
+
+ assert self.interpret(func, []) == int(self.GC_CAN_MOVE)
+
+ def test_malloc_nonmovable_fixsize(self):
+ S = lltype.GcStruct('S', ('x', lltype.Float))
+ TP = lltype.GcStruct('T', ('s', lltype.Ptr(S)))
+ def func():
+ try:
+ from pypy.rlib import rgc
+ a = rgc.malloc_nonmovable(TP)
+ rgc.collect()
+ if a:
+ assert not rgc.can_move(a)
+ return 0
+ return 1
+ except Exception, e:
+ return 2
+
+ assert self.interpret(func, []) == int(self.GC_CAN_MOVE)
+
class TestMarkSweepGC(GCTest):
from pypy.rpython.memory.gc.marksweep import MarkSweepGC as GCClass
Modified: pypy/branch/io-improvements/pypy/rpython/memory/test/test_transformed_gc.py
==============================================================================
--- pypy/branch/io-improvements/pypy/rpython/memory/test/test_transformed_gc.py (original)
+++ pypy/branch/io-improvements/pypy/rpython/memory/test/test_transformed_gc.py Wed Apr 23 16:51:48 2008
@@ -457,12 +457,13 @@
res = run([])
assert res == self.GC_CAN_MOVE
- def _test_malloc_nonmovable(self):
+ 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
@@ -470,12 +471,10 @@
except Exception, e:
return 2
- # this test would have different outcome for different
- # gcs, please assert differently
run = self.runner(func)
- return run([])
+ assert int(self.GC_CAN_MOVE) == run([])
- def _test_malloc_nonmovable_fixsize(self):
+ def test_malloc_nonmovable_fixsize(self):
S = lltype.GcStruct('S', ('x', lltype.Float))
TP = lltype.GcStruct('T', ('s', lltype.Ptr(S)))
def func():
@@ -490,26 +489,23 @@
except Exception, e:
return 2
- # this test would have different outcome for different
- # gcs, please assert differently
run = self.runner(func)
- return run([])
+ assert run([]) == int(self.GC_CAN_MOVE)
- def test_malloc_nonmovable(self):
- res = self._test_malloc_nonmovable()
- if self.GC_CAN_MOVE:
- expected = 1
- else:
- expected = 0
- assert res == expected
+ def test_raw_array(self):
+ from pypy.rpython.lltypesystem.rstr import STR
+ from pypy.rpython.annlowlevel import hlstr
+ from pypy.rlib import rgc
- def test_malloc_nonmovable_fixsize(self):
- res = self._test_malloc_nonmovable_fixsize()
- if self.GC_CAN_MOVE:
- expected = 1
- else:
- expected = 0
- assert res == expected
+ def f():
+ arr = rgc.raw_array_of_shape(STR, 1)
+ arr[0] = 'a'
+ arr = rgc.resize_raw_array(arr, 1, 2)
+ arr[1] = 'b'
+ return len(hlstr(rgc.cast_raw_array_to_shape(STR, arr, 2)))
+
+ run = self.runner(f)
+ assert run([]) == 2
class GenericMovingGCTests(GenericGCTests):
GC_CAN_MOVE = True
More information about the Pypy-commit
mailing list