[pypy-svn] r71514 - in pypy/branch/guard-value-counting/pypy/jit/metainterp: . test

arigo at codespeak.net arigo at codespeak.net
Fri Feb 26 11:57:12 CET 2010


Author: arigo
Date: Fri Feb 26 11:57:11 2010
New Revision: 71514

Modified:
   pypy/branch/guard-value-counting/pypy/jit/metainterp/resume.py
   pypy/branch/guard-value-counting/pypy/jit/metainterp/test/test_resume.py
Log:
Start implementing the idea that there are really two kinds of Descrs
for guards: one before optimization, and the other after optimization.
They need slightly different attributes, and the goal is to let
optimization decide exactly which subclass of ResumeGuardDescr is
needed for each guard.


Modified: pypy/branch/guard-value-counting/pypy/jit/metainterp/resume.py
==============================================================================
--- pypy/branch/guard-value-counting/pypy/jit/metainterp/resume.py	(original)
+++ pypy/branch/guard-value-counting/pypy/jit/metainterp/resume.py	Fri Feb 26 11:57:11 2010
@@ -44,17 +44,18 @@
 
 def capture_resumedata(framestack, virtualizable_boxes, virtualref_boxes,
                        storage):
+    # store resume data on the PreOptGuardDescr 'storage'
     n = len(framestack)-1
     top = framestack[n]
     _ensure_parent_resumedata(framestack, n)
     frame_info_list = FrameInfo(top.parent_resumedata_frame_info_list,
                                 top)
-    storage.rd_frame_info_list = frame_info_list
+    storage.pd_frame_info_list = frame_info_list
     snapshot = Snapshot(top.parent_resumedata_snapshot, top.env[:])
     snapshot = Snapshot(snapshot, virtualref_boxes[:]) # xxx for now
     if virtualizable_boxes is not None:
         snapshot = Snapshot(snapshot, virtualizable_boxes[:]) # xxx for now
-    storage.rd_snapshot = snapshot
+    storage.pd_snapshot = snapshot
 
 class Numbering(object):
     __slots__ = ('prev', 'nums')
@@ -231,8 +232,9 @@
 
 class ResumeDataVirtualAdder(object):
 
-    def __init__(self, storage, memo):
-        self.storage = storage
+    def __init__(self, storage_src, storage_dst, memo):
+        self.storage_src = storage_src    # the PreOptGuardDescr that we read
+        self.storage_dst = storage_dst    # the ResumeGuardDescr that we write
         self.memo = memo
 
     def make_virtual(self, known_class, fielddescrs):
@@ -270,15 +272,15 @@
 
     def finish(self, values, pending_setfields=[]):
         # compute the numbering
-        storage = self.storage
-        # make sure that nobody attached resume data to this guard yet
-        assert storage.rd_numb is None
+        storage_src = self.storage_src
         numb, liveboxes_from_env, v = self.memo.number(values,
-                                                       storage.rd_snapshot)
+                                                       storage_src.pd_snapshot)
         self.liveboxes_from_env = liveboxes_from_env
         self.liveboxes = {}
-        storage.rd_numb = numb
-        storage.rd_snapshot = None
+        storage_dst = self.storage_dst
+        storage_dst.rd_frame_info_list = storage_src.pd_frame_info_list
+        storage_dst.rd_numb = numb
+        storage_dst.rd_snapshot = None
 
         # collect liveboxes and virtuals
         n = len(liveboxes_from_env) - v
@@ -302,8 +304,8 @@
         self._number_virtuals(liveboxes, values, v)
         self._add_pending_fields(pending_setfields)
 
-        storage.rd_consts = self.memo.consts
-        dump_storage(storage, liveboxes)
+        storage_dst.rd_consts = self.memo.consts
+        dump_storage(storage_dst, liveboxes)
         return liveboxes[:]
 
     def _number_virtuals(self, liveboxes, values, num_env_virtuals):
@@ -336,12 +338,12 @@
         liveboxes.extend(new_liveboxes)
         nholes = len(new_liveboxes) - count
 
-        storage = self.storage
-        storage.rd_virtuals = None
+        storage_dst = self.storage_dst
+        storage_dst.rd_virtuals = None
         vfieldboxes = self.vfieldboxes
         if vfieldboxes:
             length = num_env_virtuals + memo.num_cached_virtuals()
-            virtuals = storage.rd_virtuals = [None] * length
+            virtuals = storage_dst.rd_virtuals = [None] * length
             memo.nvirtuals += length
             memo.nvholes += length - len(vfieldboxes)
             for virtualbox, fieldboxes in vfieldboxes.iteritems():
@@ -376,7 +378,7 @@
                 num = self._gettagged(box)
                 fieldnum = self._gettagged(fieldbox)
                 rd_pendingfields.append((descr, num, fieldnum))
-        self.storage.rd_pendingfields = rd_pendingfields
+        self.storage_dst.rd_pendingfields = rd_pendingfields
 
     def _gettagged(self, box):
         if isinstance(box, Const):

Modified: pypy/branch/guard-value-counting/pypy/jit/metainterp/test/test_resume.py
==============================================================================
--- pypy/branch/guard-value-counting/pypy/jit/metainterp/test/test_resume.py	(original)
+++ pypy/branch/guard-value-counting/pypy/jit/metainterp/test/test_resume.py	Fri Feb 26 11:57:11 2010
@@ -8,13 +8,25 @@
 from pypy.jit.metainterp.test.test_optimizefindnode import LLtypeMixin
 from pypy.jit.metainterp import executor
 
-class Storage:
+class StoragePre(object):
+    pd_frame_info_list = None
+
+    def __setattr__(self, attr, value):   # test mixing the two storage classes
+        assert not attr.startswith('rd_')
+        object.__setattr__(self, attr, value)
+
+class Storage(object):
     rd_frame_info_list = None
     rd_numb = None
     rd_consts = []
     rd_virtuals = None
     rd_pendingfields = None
 
+    def __setattr__(self, attr, value):   # test mixing the two storage classes
+        assert not attr.startswith('pd_')
+        object.__setattr__(self, attr, value)
+
+
 def test_tag():
     assert tag(3, 1) == rffi.r_short(3<<2|1)
     assert tag(-3, 2) == rffi.r_short(-3<<2|2)
@@ -207,33 +219,33 @@
     c1, c2, c3 = [ConstInt(1), ConstInt(2), ConstInt(3)]
     fs = [FakeFrame("code0", 0, -1, b1, c1, b2)]
 
-    storage = Storage()
-    capture_resumedata(fs, None, [], storage)
+    storagepre = StoragePre()
+    capture_resumedata(fs, None, [], storagepre)
 
     assert fs[0].parent_resumedata_snapshot is None
     assert fs[0].parent_resumedata_frame_info_list is None
 
-    assert storage.rd_frame_info_list.prev is None
-    assert storage.rd_frame_info_list.jitcode == 'code0'
-    assert storage.rd_snapshot.boxes == []    # for virtualrefs
-    snapshot = storage.rd_snapshot.prev
+    assert storagepre.pd_frame_info_list.prev is None
+    assert storagepre.pd_frame_info_list.jitcode == 'code0'
+    assert storagepre.pd_snapshot.boxes == []    # for virtualrefs
+    snapshot = storagepre.pd_snapshot.prev
     assert snapshot.prev is None
     assert snapshot.boxes == fs[0].env
     assert snapshot.boxes is not fs[0].env
 
-    storage = Storage()
+    storagepre = StoragePre()
     fs = [FakeFrame("code0", 0, -1, b1, c1, b2),
           FakeFrame("code1", 3, 7, b3, c2, b1),
           FakeFrame("code2", 9, -1, c3, b2)]
-    capture_resumedata(fs, None, [], storage)
+    capture_resumedata(fs, None, [], storagepre)
 
-    frame_info_list = storage.rd_frame_info_list
+    frame_info_list = storagepre.pd_frame_info_list
     assert frame_info_list.prev is fs[2].parent_resumedata_frame_info_list
     assert frame_info_list.jitcode == 'code2'
     assert frame_info_list.pc == 9
 
-    assert storage.rd_snapshot.boxes == []    # for virtualrefs
-    snapshot = storage.rd_snapshot.prev
+    assert storagepre.pd_snapshot.boxes == []    # for virtualrefs
+    snapshot = storagepre.pd_snapshot.prev
     assert snapshot.prev is fs[2].parent_resumedata_snapshot
     assert snapshot.boxes == fs[2].env
     assert snapshot.boxes is not fs[2].env
@@ -258,14 +270,14 @@
     fs[2].pc = 15
     vbs = [b1, b2]
     vrs = [b3]
-    capture_resumedata(fs, vbs, vrs, storage)
+    capture_resumedata(fs, vbs, vrs, storagepre)
 
-    frame_info_list = storage.rd_frame_info_list
+    frame_info_list = storagepre.pd_frame_info_list
     assert frame_info_list.prev is fs[2].parent_resumedata_frame_info_list
     assert frame_info_list.jitcode == 'code2'
     assert frame_info_list.pc == 15
 
-    snapshot = storage.rd_snapshot
+    snapshot = storagepre.pd_snapshot
     assert snapshot.boxes == vbs
     assert snapshot.boxes is not vbs
 
@@ -287,13 +299,14 @@
 def test_rebuild_from_resumedata():
     b1, b2, b3 = [BoxInt(), BoxPtr(), BoxInt()]
     c1, c2, c3 = [ConstInt(1), ConstInt(2), ConstInt(3)]    
-    storage = Storage()
+    storagepre = StoragePre()
     fs = [FakeFrame("code0", 0, -1, b1, c1, b2),
           FakeFrame("code1", 3, 7, b3, c2, b1),
           FakeFrame("code2", 9, -1, c3, b2)]
-    capture_resumedata(fs, None, [], storage)
+    capture_resumedata(fs, None, [], storagepre)
     memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
-    modifier = ResumeDataVirtualAdder(storage, memo)
+    storage = Storage()
+    modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
     liveboxes = modifier.finish({})
     metainterp = MyMetaInterp()
 
@@ -311,13 +324,14 @@
 def test_rebuild_from_resumedata_with_virtualizable():
     b1, b2, b3, b4 = [BoxInt(), BoxPtr(), BoxInt(), BoxPtr()]
     c1, c2, c3 = [ConstInt(1), ConstInt(2), ConstInt(3)]    
-    storage = Storage()
+    storagepre = StoragePre()
     fs = [FakeFrame("code0", 0, -1, b1, c1, b2),
           FakeFrame("code1", 3, 7, b3, c2, b1),
           FakeFrame("code2", 9, -1, c3, b2)]
-    capture_resumedata(fs, [b4], [], storage)
+    capture_resumedata(fs, [b4], [], storagepre)
     memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
-    modifier = ResumeDataVirtualAdder(storage, memo)
+    storage = Storage()
+    modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
     liveboxes = modifier.finish({})
     metainterp = MyMetaInterp()
 
@@ -335,20 +349,22 @@
 def test_rebuild_from_resumedata_two_guards():
     b1, b2, b3, b4 = [BoxInt(), BoxPtr(), BoxInt(), BoxInt()]
     c1, c2, c3 = [ConstInt(1), ConstInt(2), ConstInt(3)]    
-    storage = Storage()
+    storagepre = StoragePre()
     fs = [FakeFrame("code0", 0, -1, b1, c1, b2),
           FakeFrame("code1", 3, 7, b3, c2, b1),
           FakeFrame("code2", 9, -1, c3, b2)]
-    capture_resumedata(fs, None, [], storage)
-    storage2 = Storage()
+    capture_resumedata(fs, None, [], storagepre)
+    storagepre2 = StoragePre()
     fs = fs[:-1] + [FakeFrame("code2", 10, -1, c3, b2, b4)]
-    capture_resumedata(fs, None, [], storage2)
-    
+    capture_resumedata(fs, None, [], storagepre2)
+
+    storage = Storage()
     memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
-    modifier = ResumeDataVirtualAdder(storage, memo)
+    modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
     liveboxes = modifier.finish({})
 
-    modifier = ResumeDataVirtualAdder(storage2, memo)
+    storage2 = Storage()
+    modifier = ResumeDataVirtualAdder(storagepre2, storage2, memo)
     liveboxes2 = modifier.finish({})
 
     metainterp = MyMetaInterp()
@@ -393,29 +409,31 @@
     b1, b2, b3, b4, b5 = [BoxInt(), BoxPtr(), BoxInt(), BoxInt(), BoxInt()]
     c1, c2, c3, c4 = [ConstInt(1), ConstInt(2), ConstInt(3),
                       LLtypeMixin.nodebox.constbox()]
-    storage = Storage()
+    storagepre = StoragePre()
     fs = [FakeFrame("code0", 0, -1, b1, c1, b2),
           FakeFrame("code1", 3, 7, b3, c2, b1),
           FakeFrame("code2", 9, -1, c3, b2)]
-    capture_resumedata(fs, None, [], storage)
-    storage2 = Storage()
+    capture_resumedata(fs, None, [], storagepre)
+    storagepre2 = StoragePre()
     fs = fs[:-1] + [FakeFrame("code2", 10, -1, c3, b2, b4)]
-    capture_resumedata(fs, None, [], storage2)
-    
+    capture_resumedata(fs, None, [], storagepre2)
+
+    storage = Storage()
     memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
     values = {b2: virtual_value(b2, b5, c4)}
-    modifier = ResumeDataVirtualAdder(storage, memo)
+    modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
     liveboxes = modifier.finish(values)
     assert len(storage.rd_virtuals) == 1
     assert storage.rd_virtuals[0].fieldnums == [tag(-1, TAGBOX),
                                                 tag(0, TAGCONST)]
 
+    storage2 = Storage()
     b6 = BoxPtr()
     v6 = virtual_value(b6, c2, None)
     v6.setfield(LLtypeMixin.nextdescr, v6)    
     values = {b2: virtual_value(b2, b4, v6), b6: v6}
     memo.clear_box_virtual_numbers()
-    modifier = ResumeDataVirtualAdder(storage2, memo)
+    modifier = ResumeDataVirtualAdder(storagepre2, storage2, memo)
     liveboxes2 = modifier.finish(values)
     assert len(storage2.rd_virtuals) == 2    
     assert storage2.rd_virtuals[0].fieldnums == [tag(len(liveboxes2)-1, TAGBOX),
@@ -454,23 +472,25 @@
     b1, b2, b3, b4, b5, b6 = [BoxPtr(), BoxPtr(), BoxInt(), BoxPtr(), BoxInt(), BoxInt()]
     c1, c2, c3, c4 = [ConstInt(1), ConstInt(2), ConstInt(3),
                       LLtypeMixin.nodebox.constbox()]
-    storage = Storage()
+    storagepre = StoragePre()
     fs = [FakeFrame("code0", 0, -1, c1, b2, b3)]
-    capture_resumedata(fs, None, [], storage)
-    
+    capture_resumedata(fs, None, [], storagepre)
+
+    storage = Storage()
     memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
     values = {b2: virtual_value(b2, b5, c4)}
-    modifier = ResumeDataVirtualAdder(storage, memo)
+    modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
     liveboxes = modifier.finish(values)
     assert len(storage.rd_virtuals) == 1
     assert storage.rd_virtuals[0].fieldnums == [tag(-1, TAGBOX),
                                                 tag(0, TAGCONST)]
 
-    storage2 = Storage()
+    storagepre2 = StoragePre()
     fs = [FakeFrame("code0", 0, -1, b1, b4, b2)]
-    capture_resumedata(fs, None, [], storage2)
+    capture_resumedata(fs, None, [], storagepre2)
     values[b4] = virtual_value(b4, b6, c4)
-    modifier = ResumeDataVirtualAdder(storage2, memo)
+    storage2 = Storage()
+    modifier = ResumeDataVirtualAdder(storagepre2, storage2, memo)
     liveboxes = modifier.finish(values)
     assert len(storage2.rd_virtuals) == 2
     assert storage2.rd_virtuals[1].fieldnums == storage.rd_virtuals[0].fieldnums
@@ -479,16 +499,17 @@
 
 def test_resumedata_top_recursive_virtuals():
     b1, b2, b3 = [BoxPtr(), BoxPtr(), BoxInt()]
-    storage = Storage()
+    storagepre = StoragePre()
     fs = [FakeFrame("code0", 0, -1, b1, b2)]
-    capture_resumedata(fs, None, [], storage)
-    
+    capture_resumedata(fs, None, [], storagepre)
+
+    storage = Storage()
     memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
     v1 = virtual_value(b1, b3, None)
     v2 = virtual_value(b2, b3, v1)
     v1.setfield(LLtypeMixin.nextdescr, v2)
     values = {b1: v1, b2: v2}
-    modifier = ResumeDataVirtualAdder(storage, memo)
+    modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
     liveboxes = modifier.finish(values)
     assert liveboxes == [b3]
     assert len(storage.rd_virtuals) == 2
@@ -685,7 +706,7 @@
 def test_register_virtual_fields():
     b1, b2 = BoxInt(), BoxInt()
     vbox = BoxPtr()
-    modifier = ResumeDataVirtualAdder(None, None)
+    modifier = ResumeDataVirtualAdder(None, None, None)
     modifier.liveboxes_from_env = {}
     modifier.liveboxes = {}
     modifier.vfieldboxes = {}
@@ -694,7 +715,7 @@
                                   b2: UNASSIGNED}
     assert modifier.vfieldboxes == {vbox: [b1, b2]}
 
-    modifier = ResumeDataVirtualAdder(None, None)
+    modifier = ResumeDataVirtualAdder(None, None, None)
     modifier.liveboxes_from_env = {vbox: tag(0, TAGVIRTUAL)}
     modifier.liveboxes = {}
     modifier.vfieldboxes = {}
@@ -711,20 +732,21 @@
     assert len(newboxes) == len(expected)
     return newboxes
 
-def make_storage(b1, b2, b3):
-    storage = Storage()
+def make_storage_pre(b1, b2, b3):
+    storagepre = StoragePre()
     snapshot = Snapshot(None, [b1, ConstInt(1), b1, b2])
     snapshot = Snapshot(snapshot, [ConstInt(2), ConstInt(3)])
     snapshot = Snapshot(snapshot, [b1, b2, b3])    
-    storage.rd_snapshot = snapshot
-    storage.rd_frame_info_list = None
-    return storage
+    storagepre.pd_snapshot = snapshot
+    storagepre.pd_frame_info_list = None
+    return storagepre
 
 def test_virtual_adder_int_constants():
     b1s, b2s, b3s = [ConstInt(sys.maxint), ConstInt(2**16), ConstInt(-65)]
-    storage = make_storage(b1s, b2s, b3s)
+    storagepre = make_storage_pre(b1s, b2s, b3s)
+    storage = Storage()
     memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())    
-    modifier = ResumeDataVirtualAdder(storage, memo)
+    modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
     liveboxes = modifier.finish({})
     assert storage.rd_snapshot is None
     metainterp = MyMetaInterp()
@@ -741,16 +763,18 @@
 
 def test_virtual_adder_memo_const_sharing():
     b1s, b2s, b3s = [ConstInt(sys.maxint), ConstInt(2**16), ConstInt(-65)]
-    storage = make_storage(b1s, b2s, b3s)
+    storagepre = make_storage_pre(b1s, b2s, b3s)
+    storage = Storage()
     memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
-    modifier = ResumeDataVirtualAdder(storage, memo)
+    modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
     modifier.finish({})
     assert len(memo.consts) == 2
     assert storage.rd_consts is memo.consts
 
     b1s, b2s, b3s = [ConstInt(sys.maxint), ConstInt(2**17), ConstInt(-65)]
-    storage2 = make_storage(b1s, b2s, b3s)
-    modifier2 = ResumeDataVirtualAdder(storage2, memo)
+    storagepre2 = make_storage_pre(b1s, b2s, b3s)
+    storage2 = Storage()
+    modifier2 = ResumeDataVirtualAdder(storagepre2, storage2, memo)
     modifier2.finish({})
     assert len(memo.consts) == 3    
     assert storage2.rd_consts is memo.consts
@@ -758,9 +782,10 @@
 
 def test_virtual_adder_no_op_renaming():
     b1s, b2s, b3s = [BoxInt(1), BoxInt(2), BoxInt(3)]
-    storage = make_storage(b1s, b2s, b3s)
+    storagepre = make_storage_pre(b1s, b2s, b3s)
+    storage = Storage()
     memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
-    modifier = ResumeDataVirtualAdder(storage, memo)
+    modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
     b1_2 = BoxInt()
     class FakeValue(object):
 
@@ -790,9 +815,10 @@
 def test_virtual_adder_make_constant():
     b1s, b2s, b3s = [BoxInt(1), BoxPtr(), BoxInt(3)]
     b1s = ConstInt(111)
-    storage = make_storage(b1s, b2s, b3s)
+    storagepre = make_storage_pre(b1s, b2s, b3s)
+    storage = Storage()
     memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())        
-    modifier = ResumeDataVirtualAdder(storage, memo)
+    modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
     liveboxes = modifier.finish({})
     b2t, b3t = [BoxPtr(demo55o), BoxInt(33)]
     newboxes = _resume_remap(liveboxes, [b2s, b3s], b2t, b3t)
@@ -811,9 +837,10 @@
 def test_virtual_adder_make_virtual():
     b2s, b3s, b4s, b5s = [BoxPtr(), BoxInt(3), BoxPtr(), BoxPtr()]  
     c1s = ConstInt(111)
+    storagepre = StoragePre()
     storage = Storage()
     memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
-    modifier = ResumeDataVirtualAdder(storage, memo)
+    modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
     modifier.liveboxes_from_env = {}
     modifier.liveboxes = {}
     modifier.vfieldboxes = {}
@@ -884,9 +911,10 @@
 def test_virtual_adder_make_varray():
     b2s, b4s = [BoxPtr(), BoxInt(4)]
     c1s = ConstInt(111)
+    storagepre = StoragePre()
     storage = Storage()
     memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
-    modifier = ResumeDataVirtualAdder(storage, memo)
+    modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
     modifier.liveboxes_from_env = {}
     modifier.liveboxes = {}
     modifier.vfieldboxes = {}
@@ -936,9 +964,10 @@
 def test_virtual_adder_make_vstruct():
     b2s, b4s = [BoxPtr(), BoxPtr()]
     c1s = ConstInt(111)
+    storagepre = StoragePre()
     storage = Storage()
     memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
-    modifier = ResumeDataVirtualAdder(storage, memo)
+    modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
     modifier.liveboxes_from_env = {}
     modifier.liveboxes = {}
     modifier.vfieldboxes = {}
@@ -978,9 +1007,10 @@
 
 def test_virtual_adder_pending_fields():
     b2s, b4s = [BoxPtr(), BoxPtr()]
+    storagepre = StoragePre()
     storage = Storage()
     memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
-    modifier = ResumeDataVirtualAdder(storage, memo)
+    modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
     modifier.liveboxes_from_env = {}
     modifier.liveboxes = {}
     modifier.vfieldboxes = {}
@@ -1023,7 +1053,7 @@
     metainterp_sd = FakeMetaInterpStaticData()
     metainterp_sd.options = options
     memo = ResumeDataLoopMemo(metainterp_sd)
-    modifier = ResumeDataVirtualAdder(None, memo)
+    modifier = ResumeDataVirtualAdder(None, None, memo)
 
     for i in range(5):
         assert not modifier._invalidation_needed(5, i)



More information about the Pypy-commit mailing list