[pypy-commit] pypy stmgc-c7: in-progress
arigo
noreply at buildbot.pypy.org
Mon Jun 30 13:04:54 CEST 2014
Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c7
Changeset: r72283:ee9beb2782fe
Date: 2014-06-30 13:04 +0200
http://bitbucket.org/pypy/pypy/changeset/ee9beb2782fe/
Log: in-progress
diff --git a/rpython/memory/gc/stmgc.py b/rpython/memory/gc/stmgc.py
--- a/rpython/memory/gc/stmgc.py
+++ b/rpython/memory/gc/stmgc.py
@@ -43,6 +43,14 @@
def get_type_id(self, obj):
return llop.stm_addr_get_tid(llgroup.HALFWORD, obj)
+ def get_card_base_itemsize(self, obj, offset_itemsize):
+ typeid = self.get_type_id(obj)
+ assert self.is_varsize(typeid)
+ ofs = self.fixed_size(typeid)
+ isz = self.varsize_item_sizes(typeid)
+ offset_itemsize[0] = rffi.cast(lltype.Unsigned, ofs)
+ offset_itemsize[1] = rffi.cast(lltype.Unsigned, isz)
+
def setup(self):
# Hack: MovingGCBase.setup() sets up stuff related to id(), which
# we implement differently anyway. So directly call GCBase.setup().
diff --git a/rpython/memory/gctransform/stmframework.py b/rpython/memory/gctransform/stmframework.py
--- a/rpython/memory/gctransform/stmframework.py
+++ b/rpython/memory/gctransform/stmframework.py
@@ -32,6 +32,16 @@
getfn(pypy_stmcb_trace, [llannotation.SomeAddress(),
llannotation.SomePtr(GCClass.VISIT_FPTR)],
annmodel.s_None))
+ #
+ def pypy_stmcb_get_card_base_itemsize(obj, offset_itemsize):
+ gc.get_card_base_itemsize(obj, offset_itemsize)
+ pypy_stmcb_get_card_base_itemsize.c_name = (
+ "pypy_stmcb_get_card_base_itemsize")
+ self.autoregister_ptrs.append(
+ getfn(pypy_stmcb_get_card_base_itemsize,
+ [llannotation.SomeAddress(),
+ llannotation.SomePtr(rffi.CArrayPtr(lltype.Unsigned))],
+ annmodel.s_None))
def build_root_walker(self):
return StmRootWalker(self)
@@ -87,6 +97,11 @@
if var_needsgc(hop.spaceop.args[-1]):
raise Exception("in stm_ignored block: write of a gc "
"pointer")
+ elif self._set_into_gc_array_part(hop.spaceop) is not None:
+ self.write_barrier_from_array_calls += 1
+ v_index = self._set_into_gc_array_part(hop.spaceop)
+ assert v_index.concretetype == lltype.Signed
+ hop.genop("stm_write", [v_struct, v_index])
else:
self.write_barrier_calls += 1
hop.genop("stm_write", [v_struct])
diff --git a/rpython/translator/stm/funcgen.py b/rpython/translator/stm/funcgen.py
--- a/rpython/translator/stm/funcgen.py
+++ b/rpython/translator/stm/funcgen.py
@@ -62,7 +62,11 @@
assert isinstance(op.args[0].concretetype, lltype.Ptr)
assert op.args[0].concretetype.TO._gckind == 'gc'
arg0 = funcgen.expr(op.args[0])
- return 'stm_write((object_t *)%s);' % (arg0,)
+ if len(op.args) == 1:
+ return 'stm_write((object_t *)%s);' % (arg0,)
+ else:
+ arg1 = funcgen.expr(op.args[1])
+ return 'stm_write_card((object_t *)%s, %s);' % (arg0, arg1)
def stm_can_move(funcgen, op):
arg0 = funcgen.expr(op.args[0])
diff --git a/rpython/translator/stm/src_stm/stmgcintf.c b/rpython/translator/stm/src_stm/stmgcintf.c
--- a/rpython/translator/stm/src_stm/stmgcintf.c
+++ b/rpython/translator/stm/src_stm/stmgcintf.c
@@ -10,6 +10,7 @@
__thread uintptr_t pypy_stm_nursery_low_fill_mark_saved;
extern Signed pypy_stmcb_size_rounded_up(void*);
+extern void pypy_stmcb_get_card_base_itemsize(void*, uintptr_t[]);
extern void pypy_stmcb_trace(void*, void(*)(void*));
inline ssize_t stmcb_size_rounded_up(struct object_s *obj) {
@@ -19,6 +20,11 @@
return result;
}
+inline void stmcb_get_card_base_itemsize(struct object_s *obj,
+ uintptr_t offset_itemsize[2]) {
+ pypy_stmcb_get_card_base_itemsize(obj, offset_itemsize);
+}
+
inline void stmcb_trace(struct object_s *obj, void visit(object_t **)) {
pypy_stmcb_trace(obj, (void(*)(void*))visit);
}
diff --git a/rpython/translator/stm/test/test_ztranslated.py b/rpython/translator/stm/test/test_ztranslated.py
--- a/rpython/translator/stm/test/test_ztranslated.py
+++ b/rpython/translator/stm/test/test_ztranslated.py
@@ -451,6 +451,20 @@
data = cbuilder.cmdexec('')
assert 'did not crash 84\n' in data
+ def test_stm_write_card(self):
+ lst = [0] * 100
+ def main(argv):
+ lst[42] = 43
+ print 'did not crash', lst[42]
+ return 0
+
+ t, cbuilder = self.compile(main)
+ first_op = t.graphs[0].startblock.operations[0]
+ assert first_op.opnames == opnames[0] == 'stm_write'
+ assert first_op.args[1].value == 42
+ data = cbuilder.cmdexec('')
+ assert 'did not crash 43\n' in data
+
def test_float_inf_nan_in_struct(self):
mylist = [float("inf"), float("-inf"), float("nan")]
def main(argv):
More information about the pypy-commit
mailing list