[pypy-commit] pypy gc_no_cleanup_nursery: implement size descr storing offsets of gc pointers
fijal
noreply at buildbot.pypy.org
Wed Sep 10 05:28:04 CEST 2014
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: gc_no_cleanup_nursery
Changeset: r73415:6dfd216b0e8d
Date: 2014-09-09 21:27 -0600
http://bitbucket.org/pypy/pypy/changeset/6dfd216b0e8d/
Log: implement size descr storing offsets of gc pointers
diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -630,17 +630,17 @@
def bh_new(self, sizedescr):
return lltype.cast_opaque_ptr(llmemory.GCREF,
- lltype.malloc(sizedescr.S))
+ lltype.malloc(sizedescr.S, zero=True))
def bh_new_with_vtable(self, vtable, descr):
- result = lltype.malloc(descr.S)
+ result = lltype.malloc(descr.S, zero=True)
result_as_objptr = lltype.cast_pointer(rclass.OBJECTPTR, result)
result_as_objptr.typeptr = support.cast_from_int(rclass.CLASSTYPE,
vtable)
return lltype.cast_opaque_ptr(llmemory.GCREF, result)
def bh_new_array(self, length, arraydescr):
- array = lltype.malloc(arraydescr.A, length)
+ array = lltype.malloc(arraydescr.A, length, zero=True)
return lltype.cast_opaque_ptr(llmemory.GCREF, array)
def bh_classof(self, struct):
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_gcptrs=None):
self.size = size
self.count_fields_if_immut = count_fields_if_immut
+ self.offsets_of_gcptrs = offsets_of_gcptrs
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_gcptrs = heaptracker.offsets_of_gcptrs(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_gcptrs)
else:
- sizedescr = SizeDescr(size, count_fields_if_immut)
+ sizedescr = SizeDescr(size, count_fields_if_immut,
+ offsets_of_gcptrs)
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
@@ -15,6 +15,9 @@
('y', lltype.Ptr(T)))
descr_s = get_size_descr(c0, S)
descr_t = get_size_descr(c0, T)
+ assert descr_t.offsets_of_gcptrs == []
+ assert descr_s.offsets_of_gcptrs == [
+ symbolic.get_field_token(S, "y", False)[0]]
assert descr_s.size == symbolic.get_size(S, False)
assert descr_t.size == symbolic.get_size(T, False)
assert descr_s.count_fields_if_immutable() == -1
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
@@ -1,5 +1,6 @@
from rpython.rtyper.lltypesystem import lltype, llmemory, rclass
from rpython.rlib.objectmodel import we_are_translated
+from rpython.jit.backend.llsupport import symbolic
def adr2int(addr):
@@ -125,3 +126,16 @@
vtable = descr.as_vtable_size_descr()._corresponding_vtable
vtable = llmemory.cast_ptr_to_adr(vtable)
return adr2int(vtable)
+
+def offsets_of_gcptrs(gccache, STRUCT, res=None):
+ if res is None:
+ res = []
+ 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_gcptrs(gccache, FIELD, res)
+ return res
More information about the pypy-commit
mailing list