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

Reply via email to