Author: Maciej Fijalkowski <[email protected]>
Branch: gc_no_cleanup_nursery
Changeset: r73538:5ba9f2d2ffbe
Date: 2014-09-14 16:36 -0600
http://bitbucket.org/pypy/pypy/changeset/5ba9f2d2ffbe/
Log: implement offsets_of_gcfields in sizedescr
diff --git a/rpython/jit/backend/llsupport/descr.py
b/rpython/jit/backend/llsupport/descr.py
--- a/rpython/jit/backend/llsupport/descr.py
+++ b/rpython/jit/backend/llsupport/descr.py
@@ -35,9 +35,11 @@
size = 0 # help translation
tid = llop.combine_ushort(lltype.Signed, 0, 0)
- def __init__(self, size, count_fields_if_immut=-1):
+ def __init__(self, size, count_fields_if_immut=-1,
+ offsets_of_gcfields=None):
self.size = size
self.count_fields_if_immut = count_fields_if_immut
+ self.offsets_of_gcfields = offsets_of_gcfields
def count_fields_if_immutable(self):
return self.count_fields_if_immut
@@ -58,10 +60,13 @@
except KeyError:
size = symbolic.get_size(STRUCT, gccache.translate_support_code)
count_fields_if_immut = heaptracker.count_fields_if_immutable(STRUCT)
+ offsets_of_gcfields = heaptracker.offsets_of_gcfields(gccache, STRUCT)
if heaptracker.has_gcstruct_a_vtable(STRUCT):
- sizedescr = SizeDescrWithVTable(size, count_fields_if_immut)
+ sizedescr = SizeDescrWithVTable(size, count_fields_if_immut,
+ offsets_of_gcfields)
else:
- sizedescr = SizeDescr(size, count_fields_if_immut)
+ sizedescr = SizeDescr(size, count_fields_if_immut,
+ offsets_of_gcfields)
gccache.init_size_descr(STRUCT, sizedescr)
cache[STRUCT] = sizedescr
return sizedescr
diff --git a/rpython/jit/backend/llsupport/test/test_descr.py
b/rpython/jit/backend/llsupport/test/test_descr.py
--- a/rpython/jit/backend/llsupport/test/test_descr.py
+++ b/rpython/jit/backend/llsupport/test/test_descr.py
@@ -19,6 +19,9 @@
assert descr_t.size == symbolic.get_size(T, False)
assert descr_s.count_fields_if_immutable() == -1
assert descr_t.count_fields_if_immutable() == -1
+ assert descr_t.offsets_of_gcfields == []
+ assert descr_s.offsets_of_gcfields == [
+ symbolic.get_field_token(S, 'y', False)[0]]
assert descr_s == get_size_descr(c0, S)
assert descr_s != get_size_descr(c1, S)
#
@@ -26,6 +29,14 @@
assert isinstance(descr_s.size, Symbolic)
assert descr_s.count_fields_if_immutable() == -1
+ PARENT = lltype.Struct('P', ('x', lltype.Ptr(T)))
+ STRUCT = lltype.GcStruct('S', ('parent', PARENT), ('y', lltype.Ptr(T)))
+ descr_struct = get_size_descr(c0, STRUCT)
+ assert descr_struct.offsets_of_gcfields == [
+ symbolic.get_field_token(PARENT, 'x', False)[0],
+ symbolic.get_field_token(STRUCT, 'y', False)[0],
+ ]
+
def test_get_size_descr_immut():
S = lltype.GcStruct('S', hints={'immutable': True})
T = lltype.GcStruct('T', ('parent', S),
diff --git a/rpython/jit/backend/llsupport/test/test_gc.py
b/rpython/jit/backend/llsupport/test/test_gc.py
--- a/rpython/jit/backend/llsupport/test/test_gc.py
+++ b/rpython/jit/backend/llsupport/test/test_gc.py
@@ -70,6 +70,8 @@
self.record.append(("fixedsize", repr(size), tid, p))
return p
+ do_malloc_fixedsize_clear = do_malloc_fixedsize
+
def do_malloc_varsize(self, RESTYPE, type_id, length, size,
itemsize, offset_to_length):
p, tid = self._malloc(type_id, size + itemsize * length)
@@ -80,6 +82,8 @@
repr(offset_to_length), p))
return p
+ do_malloc_varsize_clear = do_malloc_varsize
+
def _write_barrier_failing_case(self, adr_struct):
self.record.append(('barrier', adr_struct))
diff --git a/rpython/jit/codewriter/heaptracker.py
b/rpython/jit/codewriter/heaptracker.py
--- a/rpython/jit/codewriter/heaptracker.py
+++ b/rpython/jit/codewriter/heaptracker.py
@@ -126,3 +126,19 @@
vtable = llmemory.cast_ptr_to_adr(vtable)
return adr2int(vtable)
+def offsets_of_gcfields(gccache, STRUCT, res=None):
+ from rpython.jit.backend.llsupport import symbolic
+
+ if res is None:
+ res = []
+ # order is not relevant, except for tests
+ for name, FIELD in STRUCT._flds.iteritems():
+ if isinstance(FIELD, lltype.Ptr) and FIELD._needsgc():
+ offset, _ = symbolic.get_field_token(STRUCT, name,
+ gccache.translate_support_code)
+ res.append(offset)
+ elif isinstance(FIELD, lltype.Struct):
+ offsets_of_gcfields(gccache, FIELD, res)
+ if not we_are_translated():
+ res.sort()
+ return res
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py
b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -161,7 +161,6 @@
subbox = value.force_box(optforce)
op = ResOperation(rop.SETFIELD_GC, [box, subbox], None,
descr=ofs)
-
optforce.emit_operation(op)
def _get_field_descr_list(self):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit