[pypy-svn] r67332 - in pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport: . test
arigo at codespeak.net
arigo at codespeak.net
Sat Aug 29 23:21:09 CEST 2009
Author: arigo
Date: Sat Aug 29 23:21:08 2009
New Revision: 67332
Modified:
pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/gc.py
pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/test/test_gc.py
Log:
Test for do_write_barrier.
Modified: pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/gc.py
==============================================================================
--- pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/gc.py (original)
+++ pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/gc.py Sat Aug 29 23:21:08 2009
@@ -266,6 +266,7 @@
def __init__(self, gcdescr, translator, llop1=llop):
from pypy.rpython.memory.gc.base import choose_gc_from_config
+ from pypy.rpython.memory.gcheader import GCHeaderBuilder
from pypy.rpython.memory.gctransform import framework
GcLLDescription.__init__(self, gcdescr, translator)
assert self.translate_support_code, "required with the framework GC"
@@ -299,6 +300,7 @@
self.GCClass, _ = choose_gc_from_config(gcdescr.config)
self.moving_gc = self.GCClass.moving_gc
self.HDRPTR = lltype.Ptr(self.GCClass.HDR)
+ self.gcheaderbuilder = GCHeaderBuilder(self.HDRPTR.TO)
self.fielddescr_tid = get_field_descr(self, self.GCClass.HDR, 'tid')
(self.array_basesize, _, self.array_length_ofs) = \
symbolic.get_array_token(lltype.GcArray(lltype.Signed), True)
@@ -383,17 +385,16 @@
def args_for_new(self, sizedescr):
assert isinstance(sizedescr, BaseSizeDescr)
- size = descrsize.v0
- type_id = descrsize.type_id
- has_finalizer = descrsize.flag2
+ size = sizedescr.size
+ type_id = sizedescr.type_id
+ has_finalizer = sizedescr.has_finalizer
return [size, type_id, has_finalizer]
def args_for_new_array(self, arraydescr):
- assert isinstance(arraydescr, ConstDescr3)
- basesize = arraydescr.v0
- itemsize = arraydescr.v1
+ assert isinstance(arraydescr, BaseArrayDescr)
+ itemsize = arraydescr.get_item_size(self.translate_support_code)
type_id = arraydescr.type_id
- return [basesize, itemsize, type_id]
+ return [itemsize, type_id]
def get_funcptr_for_new(self):
return llhelper(self.GC_MALLOC_BASIC, self.malloc_basic)
@@ -409,6 +410,7 @@
def do_write_barrier(self, gcref_struct, gcref_newptr):
hdr_addr = llmemory.cast_ptr_to_adr(gcref_struct)
+ hdr_addr -= self.gcheaderbuilder.size_gc_header
hdr = llmemory.cast_adr_to_ptr(hdr_addr, self.HDRPTR)
if hdr.tid & self.GCClass.JIT_WB_IF_FLAG:
# get a pointer to the 'remember_young_pointer' function from
Modified: pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/test/test_gc.py
==============================================================================
--- pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/test/test_gc.py (original)
+++ pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/test/test_gc.py Sat Aug 29 23:21:08 2009
@@ -121,50 +121,84 @@
repr(offset_to_length), p))
return p
+ def _write_barrier_failing_case(self, adr_struct, adr_newptr):
+ self.record.append(('barrier', adr_struct, adr_newptr))
-def test_framework_malloc():
- class FakeTranslator:
- pass
- class config:
- class translation:
- gc = 'hybrid'
- gcrootfinder = 'asmgcc'
- gctransformer = 'framework'
- gcdescr = get_description(config)
- translator = FakeTranslator()
- llop1 = FakeLLOp()
- gc_ll_descr = GcLLDescr_framework(gcdescr, FakeTranslator(), llop1)
- #
- # ---------- gc_malloc ----------
- S = lltype.GcStruct('S', ('x', lltype.Signed))
- sizedescr = get_size_descr(gc_ll_descr, S)
- p = gc_ll_descr.gc_malloc(sizedescr)
- assert llop1.record == [("fixedsize", sizedescr.type_id,
- repr(sizedescr.size), False, p)]
- del llop1.record[:]
- # ---------- gc_malloc_array ----------
- A = lltype.GcArray(lltype.Signed)
- arraydescr = get_array_descr(gc_ll_descr, A)
- p = gc_ll_descr.gc_malloc_array(arraydescr, 10)
- assert llop1.record == [("varsize", arraydescr.type_id, 10,
- repr(arraydescr.get_base_size(True)),
- repr(arraydescr.get_item_size(True)),
- repr(arraydescr.get_ofs_length(True)), p)]
- del llop1.record[:]
- # ---------- gc_malloc_str ----------
- p = gc_ll_descr.gc_malloc_str(10)
- type_id = gc_ll_descr.layoutbuilder.get_type_id(rstr.STR)
- basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR, True)
- assert llop1.record == [("varsize", type_id, 10,
- repr(basesize), repr(itemsize), repr(ofs_length),
- p)]
- del llop1.record[:]
- # ---------- gc_malloc_unicode ----------
- p = gc_ll_descr.gc_malloc_unicode(10)
- type_id = gc_ll_descr.layoutbuilder.get_type_id(rstr.UNICODE)
- basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE,
- True)
- assert llop1.record == [("varsize", type_id, 10,
- repr(basesize), repr(itemsize), repr(ofs_length),
- p)]
- del llop1.record[:]
+ def get_write_barrier_failing_case(self, FUNCTYPE):
+ return self._write_barrier_failing_case
+
+
+class TestFramework:
+
+ def setup_method(self, meth):
+ class FakeTranslator:
+ pass
+ class config:
+ class translation:
+ gc = 'hybrid'
+ gcrootfinder = 'asmgcc'
+ gctransformer = 'framework'
+ gcdescr = get_description(config)
+ translator = FakeTranslator()
+ self.llop1 = FakeLLOp()
+ self.gc_ll_descr = GcLLDescr_framework(gcdescr, FakeTranslator(),
+ self.llop1)
+
+ def test_gc_malloc(self):
+ S = lltype.GcStruct('S', ('x', lltype.Signed))
+ sizedescr = get_size_descr(self.gc_ll_descr, S)
+ p = self.gc_ll_descr.gc_malloc(sizedescr)
+ assert self.llop1.record == [("fixedsize", sizedescr.type_id,
+ repr(sizedescr.size), False, p)]
+ assert repr(self.gc_ll_descr.args_for_new(sizedescr)) == repr(
+ [sizedescr.size, sizedescr.type_id, False])
+
+ def test_gc_malloc_array(self):
+ A = lltype.GcArray(lltype.Signed)
+ arraydescr = get_array_descr(self.gc_ll_descr, A)
+ p = self.gc_ll_descr.gc_malloc_array(arraydescr, 10)
+ assert self.llop1.record == [("varsize", arraydescr.type_id, 10,
+ repr(arraydescr.get_base_size(True)),
+ repr(arraydescr.get_item_size(True)),
+ repr(arraydescr.get_ofs_length(True)),
+ p)]
+ assert repr(self.gc_ll_descr.args_for_new_array(arraydescr)) == repr(
+ [arraydescr.get_item_size(True), arraydescr.type_id])
+
+ def test_gc_malloc_str(self):
+ p = self.gc_ll_descr.gc_malloc_str(10)
+ type_id = self.gc_ll_descr.layoutbuilder.get_type_id(rstr.STR)
+ basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR,
+ True)
+ assert self.llop1.record == [("varsize", type_id, 10,
+ repr(basesize), repr(itemsize),
+ repr(ofs_length), p)]
+
+ def test_gc_malloc_unicode(self):
+ p = self.gc_ll_descr.gc_malloc_unicode(10)
+ type_id = self.gc_ll_descr.layoutbuilder.get_type_id(rstr.UNICODE)
+ basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE,
+ True)
+ assert self.llop1.record == [("varsize", type_id, 10,
+ repr(basesize), repr(itemsize),
+ repr(ofs_length), p)]
+
+ def test_do_write_barrier(self):
+ gc_ll_descr = self.gc_ll_descr
+ R = lltype.GcStruct('R')
+ S = lltype.GcStruct('S', ('r', lltype.Ptr(R)))
+ s = lltype.malloc(S)
+ r = lltype.malloc(R)
+ s_hdr = gc_ll_descr.gcheaderbuilder.new_header(s)
+ s_gcref = lltype.cast_opaque_ptr(llmemory.GCREF, s)
+ r_gcref = lltype.cast_opaque_ptr(llmemory.GCREF, r)
+ s_adr = llmemory.cast_ptr_to_adr(s)
+ r_adr = llmemory.cast_ptr_to_adr(r)
+ #
+ s_hdr.tid &= ~gc_ll_descr.GCClass.JIT_WB_IF_FLAG
+ gc_ll_descr.do_write_barrier(s_gcref, r_gcref)
+ assert self.llop1.record == [] # not called
+ #
+ s_hdr.tid |= gc_ll_descr.GCClass.JIT_WB_IF_FLAG
+ gc_ll_descr.do_write_barrier(s_gcref, r_gcref)
+ assert self.llop1.record == [('barrier', s_adr, r_adr)]
More information about the Pypy-commit
mailing list