Author: Antonio Cuni <[email protected]>
Branch: virtual-raw-mallocs
Changeset: r59652:10697b95df08
Date: 2013-01-02 19:58 +0100
http://bitbucket.org/pypy/pypy/changeset/10697b95df08/
Log: refactor virtuals_cache and virtuals_int_cache: put them in a
separate class because it is easier to handle and to make it rpython
diff --git a/pypy/jit/metainterp/blackhole.py b/pypy/jit/metainterp/blackhole.py
--- a/pypy/jit/metainterp/blackhole.py
+++ b/pypy/jit/metainterp/blackhole.py
@@ -1546,7 +1546,7 @@
return blackholeinterp, lle
def resume_in_blackhole(metainterp_sd, jitdriver_sd, resumedescr,
- all_virtuals=None):
+ all_virtuals = None):
from pypy.jit.metainterp.resume import blackhole_from_resumedata
#debug_start('jit-blackhole')
blackholeinterp = blackhole_from_resumedata(
diff --git a/pypy/jit/metainterp/resume.py b/pypy/jit/metainterp/resume.py
--- a/pypy/jit/metainterp/resume.py
+++ b/pypy/jit/metainterp/resume.py
@@ -494,7 +494,7 @@
@specialize.argtype(1)
def allocate(self, decoder, index):
struct = decoder.allocate_with_vtable(self.known_class)
- decoder.virtuals_cache[index] = struct
+ decoder.virtuals_cache.set_ptr(index, struct)
return self.setfields(decoder, struct)
def debug_prints(self):
@@ -510,7 +510,7 @@
@specialize.argtype(1)
def allocate(self, decoder, index):
struct = decoder.allocate_struct(self.typedescr)
- decoder.virtuals_cache[index] = struct
+ decoder.virtuals_cache.set_ptr(index, struct)
return self.setfields(decoder, struct)
def debug_prints(self):
@@ -527,7 +527,7 @@
length = len(self.fieldnums)
arraydescr = self.arraydescr
array = decoder.allocate_array(length, arraydescr)
- decoder.virtuals_cache[index] = array
+ decoder.virtuals_cache.set_ptr(index, array)
# NB. the check for the kind of array elements is moved out of the loop
if arraydescr.is_array_of_pointers():
for i in range(length):
@@ -561,7 +561,7 @@
def allocate_int(self, decoder, index):
length = len(self.fieldnums)
buffer = decoder.allocate_raw_buffer(self.size)
- decoder.virtuals_int_cache[index] = buffer
+ decoder.virtuals_cache.set_int(index, buffer)
for i in range(len(self.offsets)):
offset = self.offsets[i]
descr = self.descrs[i]
@@ -587,7 +587,7 @@
@specialize.argtype(1)
def allocate(self, decoder, index):
array = decoder.allocate_array(len(self.fielddescrs), self.arraydescr)
- decoder.virtuals_cache[index] = array
+ decoder.virtuals_cache.set_ptr(index, array)
p = 0
for i in range(len(self.fielddescrs)):
for j in range(len(self.fielddescrs[i])):
@@ -604,7 +604,7 @@
def allocate(self, decoder, index):
length = len(self.fieldnums)
string = decoder.allocate_string(length)
- decoder.virtuals_cache[index] = string
+ decoder.virtuals_cache.set_ptr(index, string)
for i in range(length):
charnum = self.fieldnums[i]
if not tagged_eq(charnum, UNINITIALIZED):
@@ -626,7 +626,7 @@
# efficient. Not sure we care.
left, right = self.fieldnums
string = decoder.concat_strings(left, right)
- decoder.virtuals_cache[index] = string
+ decoder.virtuals_cache.set_ptr(index, string)
return string
def debug_prints(self):
@@ -642,7 +642,7 @@
def allocate(self, decoder, index):
largerstr, start, length = self.fieldnums
string = decoder.slice_string(largerstr, start, length)
- decoder.virtuals_cache[index] = string
+ decoder.virtuals_cache.set_ptr(index, string)
return string
def debug_prints(self):
@@ -659,7 +659,7 @@
def allocate(self, decoder, index):
length = len(self.fieldnums)
string = decoder.allocate_unicode(length)
- decoder.virtuals_cache[index] = string
+ decoder.virtuals_cache.set_ptr(index, string)
for i in range(length):
charnum = self.fieldnums[i]
if not tagged_eq(charnum, UNINITIALIZED):
@@ -681,7 +681,7 @@
# efficient. Not sure we care.
left, right = self.fieldnums
string = decoder.concat_unicodes(left, right)
- decoder.virtuals_cache[index] = string
+ decoder.virtuals_cache.set_ptr(index, string)
return string
def debug_prints(self):
@@ -698,7 +698,7 @@
def allocate(self, decoder, index):
largerstr, start, length = self.fieldnums
string = decoder.slice_unicode(largerstr, start, length)
- decoder.virtuals_cache[index] = string
+ decoder.virtuals_cache.set_ptr(index, string)
return string
def debug_prints(self):
@@ -708,6 +708,33 @@
# ____________________________________________________________
+class AbstractVirtualCache(object):
+ pass
+
+def get_VirtualCache_class(suffix):
+ # we need to create two copy of this class, because virtuals_*_cache will
+ # be lists of different types (one for ResumeDataDirectReader and one for
+ # ResumeDataBoxReader)
+ class VirtualCache(AbstractVirtualCache):
+ def __init__(self, virtuals_ptr_cache, virtuals_int_cache):
+ self.virtuals_ptr_cache = virtuals_ptr_cache
+ self.virtuals_int_cache = virtuals_int_cache
+
+ def get_ptr(self, i):
+ return self.virtuals_ptr_cache[i]
+
+ def get_int(self, i):
+ return self.virtuals_int_cache[i]
+
+ def set_ptr(self, i, v):
+ self.virtuals_ptr_cache[i] = v
+
+ def set_int(self, i, v):
+ self.virtuals_int_cache[i] = v
+
+ VirtualCache.__name__ += suffix
+ return VirtualCache
+
class AbstractResumeDataReader(object):
"""A base mixin containing the logic to reconstruct virtuals out of
guard failure. There are two implementations of this mixin:
@@ -718,10 +745,10 @@
_mixin_ = True
rd_virtuals = None
virtuals_cache = None
- virtuals_int_cache = None
- virtual_default = None
+ virtual_ref_default = None
virtual_int_default = None
+
def _init(self, cpu, storage):
self.cpu = cpu
self.cur_numb = storage.rd_numb
@@ -731,24 +758,24 @@
self._prepare_virtuals(storage.rd_virtuals)
self._prepare_pendingfields(storage.rd_pendingfields)
- def getvirtual(self, index):
+ def getvirtual_ref(self, index):
# Returns the index'th virtual, building it lazily if needed.
# Note that this may be called recursively; that's why the
# allocate() methods must fill in the cache as soon as they
# have the object, before they fill its fields.
assert self.virtuals_cache is not None
- v = self.virtuals_cache[index]
+ v = self.virtuals_cache.get_ptr(index)
if not v:
v = self.rd_virtuals[index].allocate(self, index)
- ll_assert(v == self.virtuals_cache[index], "resume.py: bad cache")
+ ll_assert(v == self.virtuals_cache.get_ptr(index), "resume.py: bad
cache")
return v
def getvirtual_int(self, index):
- assert self.virtuals_int_cache is not None
- v = self.virtuals_int_cache[index]
+ assert self.virtuals_cache is not None
+ v = self.virtuals_cache.get_int(index)
if not v:
v = self.rd_virtuals[index].allocate_int(self, index)
- ll_assert(v == self.virtuals_int_cache[index], "resume.py: bad
cache")
+ ll_assert(v == self.virtuals_cache.get_int(index), "resume.py: bad
cache")
return v
def force_all_virtuals(self):
@@ -758,12 +785,12 @@
rd_virtual = rd_virtuals[i]
if rd_virtual is not None:
if rd_virtual.kind == REF:
- self.getvirtual(i)
+ self.getvirtual_ref(i)
elif rd_virtual.kind == INT:
self.getvirtual_int(i)
else:
assert False
- return self.virtuals_cache, self.virtuals_int_cache
+ return self.virtuals_cache
def _prepare_virtuals(self, virtuals):
if virtuals:
@@ -772,8 +799,8 @@
# for REFs and one for INTs: but for each index, we are using
# either one or the other, so we should think of a way to
# "compact" them
- self.virtuals_cache = [self.virtual_default] * len(virtuals)
- self.virtuals_int_cache = [self.virtual_int_default] *
len(virtuals)
+ self.virtuals_cache = self.VirtualCache([self.virtual_ref_default]
* len(virtuals),
+ [self.virtual_int_default]
* len(virtuals))
def _prepare_pendingfields(self, pendingfields):
if pendingfields:
@@ -846,6 +873,7 @@
class ResumeDataBoxReader(AbstractResumeDataReader):
unique_id = lambda: None
+ VirtualCache = get_VirtualCache_class('BoxReader')
def __init__(self, storage, metainterp):
self._init(metainterp.cpu, storage)
@@ -1030,7 +1058,7 @@
if kind == INT:
box = self.getvirtual_int(num)
else:
- box = self.getvirtual(num)
+ box = self.getvirtual_ref(num)
elif tag == TAGINT:
box = ConstInt(num)
else:
@@ -1126,9 +1154,10 @@
class ResumeDataDirectReader(AbstractResumeDataReader):
unique_id = lambda: None
- virtual_default = lltype.nullptr(llmemory.GCREF.TO)
+ virtual_ref_default = lltype.nullptr(llmemory.GCREF.TO)
virtual_int_default = 0
resume_after_guard_not_forced = 0
+ VirtualCache = get_VirtualCache_class('DirectReader')
# 0: not a GUARD_NOT_FORCED
# 1: in handle_async_forcing
# 2: resuming from the GUARD_NOT_FORCED
@@ -1142,7 +1171,7 @@
# special case for resuming after a GUARD_NOT_FORCED: we already
# have the virtuals
self.resume_after_guard_not_forced = 2
- self.virtuals_cache, self.virtuals_int_cache = all_virtuals
+ self.virtuals_cache = all_virtuals
# self.rd_virtuals can remain None, because virtuals_cache is
# already filled
@@ -1339,7 +1368,7 @@
return self.cpu.ts.NULLREF
return self.consts[num].getref_base()
elif tag == TAGVIRTUAL:
- return self.getvirtual(num)
+ return self.getvirtual_ref(num)
else:
assert tag == TAGBOX
if num < 0:
diff --git a/pypy/jit/metainterp/test/test_resume.py
b/pypy/jit/metainterp/test/test_resume.py
--- a/pypy/jit/metainterp/test/test_resume.py
+++ b/pypy/jit/metainterp/test/test_resume.py
@@ -228,9 +228,10 @@
def test_prepare_virtuals():
class FakeVinfo(object):
+ kind = REF
def allocate(self, decoder, index):
s = "allocated"
- decoder.virtuals_cache[index] = s
+ decoder.virtuals_cache.set_ptr(index, s)
return s
class FakeStorage(object):
rd_virtuals = [FakeVinfo(), None]
@@ -241,11 +242,14 @@
_already_allocated_resume_virtuals = None
cpu = None
reader = ResumeDataDirectReader(MyMetaInterp(None), FakeStorage())
- assert reader.force_all_virtuals() == ["allocated", reader.virtual_default]
+ cache = reader.force_all_virtuals()
+ assert cache.virtuals_ptr_cache == ["allocated",
reader.virtual_ref_default]
# ____________________________________________________________
class FakeResumeDataReader(AbstractResumeDataReader):
+ VirtualCache = get_VirtualCache_class('Fake')
+
def allocate_with_vtable(self, known_class):
return FakeBuiltObject(vtable=known_class)
def allocate_struct(self, typedescr):
@@ -300,7 +304,8 @@
info.fieldnums = [tag(456, TAGINT)]
reader = FakeResumeDataReader()
reader._prepare_virtuals([info])
- assert reader.force_all_virtuals() == [
+ cache = reader.force_all_virtuals()
+ assert cache.virtuals_ptr_cache == [
FakeBuiltObject(vtable=123, fielddescr1=tag(456, TAGINT))]
def test_vstructinfo():
@@ -308,7 +313,8 @@
info.fieldnums = [tag(456, TAGINT)]
reader = FakeResumeDataReader()
reader._prepare_virtuals([info])
- assert reader.force_all_virtuals() == [
+ cache = reader.force_all_virtuals()
+ assert cache.virtuals_ptr_cache == [
FakeBuiltObject(typedescr=124, fielddescr1=tag(456, TAGINT))]
def test_varrayinfo():
@@ -317,7 +323,7 @@
info.fieldnums = [tag(456, TAGINT)]
reader = FakeResumeDataReader()
reader._prepare_virtuals([info])
- assert reader.force_all_virtuals() == [
+ assert reader.force_all_virtuals().virtuals_ptr_cache == [
FakeBuiltObject(arraydescr=arraydescr, items=[tag(456, TAGINT)])]
def test_vstrplaininfo():
@@ -325,7 +331,7 @@
info.fieldnums = [tag(60, TAGINT)]
reader = FakeResumeDataReader()
reader._prepare_virtuals([info])
- assert reader.force_all_virtuals() == [
+ assert reader.force_all_virtuals().virtuals_ptr_cache == [
FakeBuiltObject(string=[60])]
def test_vstrconcatinfo():
@@ -333,7 +339,7 @@
info.fieldnums = [tag(10, TAGBOX), tag(20, TAGBOX)]
reader = FakeResumeDataReader()
reader._prepare_virtuals([info])
- assert reader.force_all_virtuals() == [
+ assert reader.force_all_virtuals().virtuals_ptr_cache == [
FakeBuiltObject(strconcat=info.fieldnums)]
def test_vstrsliceinfo():
@@ -341,7 +347,7 @@
info.fieldnums = [tag(10, TAGBOX), tag(20, TAGBOX), tag(30, TAGBOX)]
reader = FakeResumeDataReader()
reader._prepare_virtuals([info])
- assert reader.force_all_virtuals() == [
+ assert reader.force_all_virtuals().virtuals_ptr_cache == [
FakeBuiltObject(strslice=info.fieldnums)]
def test_vuniplaininfo():
@@ -349,7 +355,7 @@
info.fieldnums = [tag(60, TAGINT)]
reader = FakeResumeDataReader()
reader._prepare_virtuals([info])
- assert reader.force_all_virtuals() == [
+ assert reader.force_all_virtuals().virtuals_ptr_cache == [
FakeBuiltObject(unistring=[60])]
def test_vuniconcatinfo():
@@ -357,7 +363,7 @@
info.fieldnums = [tag(10, TAGBOX), tag(20, TAGBOX)]
reader = FakeResumeDataReader()
reader._prepare_virtuals([info])
- assert reader.force_all_virtuals() == [
+ assert reader.force_all_virtuals().virtuals_ptr_cache == [
FakeBuiltObject(uniconcat=info.fieldnums)]
def test_vunisliceinfo():
@@ -365,7 +371,7 @@
info.fieldnums = [tag(10, TAGBOX), tag(20, TAGBOX), tag(30, TAGBOX)]
reader = FakeResumeDataReader()
reader._prepare_virtuals([info])
- assert reader.force_all_virtuals() == [
+ assert reader.force_all_virtuals().virtuals_ptr_cache == [
FakeBuiltObject(unislice=info.fieldnums)]
# ____________________________________________________________
@@ -1116,7 +1122,7 @@
metainterp = MyMetaInterp()
reader = ResumeDataFakeReader(storage, newboxes, metainterp)
- assert len(reader.virtuals_cache) == 2
+ assert len(reader.virtuals_cache.virtuals_ptr_cache) == 2
b2t = reader.decode_ref(modifier._gettagged(b2s))
b4t = reader.decode_ref(modifier._gettagged(b4s))
trace = metainterp.trace
@@ -1184,7 +1190,7 @@
# resume
metainterp = MyMetaInterp()
reader = ResumeDataFakeReader(storage, newboxes, metainterp)
- assert len(reader.virtuals_cache) == 1
+ assert len(reader.virtuals_cache.virtuals_ptr_cache) == 1
b2t = reader.decode_ref(tag(0, TAGVIRTUAL))
trace = metainterp.trace
expected = [
@@ -1230,7 +1236,7 @@
NULL = ConstPtr.value
metainterp = MyMetaInterp()
reader = ResumeDataFakeReader(storage, newboxes, metainterp)
- assert len(reader.virtuals_cache) == 1
+ assert len(reader.virtuals_cache.virtuals_ptr_cache) == 1
b2t = reader.decode_ref(tag(0, TAGVIRTUAL))
trace = metainterp.trace
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit