Author: fijal
Branch: compress-numbering
Changeset: r80930:9661ee702ee2
Date: 2015-11-25 10:45 +0200
http://bitbucket.org/pypy/pypy/changeset/9661ee702ee2/

Log:    whack enough to start passing first blackhole resume

diff --git a/rpython/jit/codewriter/jitcode.py 
b/rpython/jit/codewriter/jitcode.py
--- a/rpython/jit/codewriter/jitcode.py
+++ b/rpython/jit/codewriter/jitcode.py
@@ -141,18 +141,14 @@
     def get_register_index_f(self, index):
         return ord(self.live_f[index])
 
-    def enumerate_vars(self, callback_i, callback_r, callback_f, spec):
-        xxx
-        index = 0
+    def enumerate_vars(self, callback_i, callback_r, callback_f, spec, index):
         for i in range(self.get_register_count_i()):
-            callback_i(index, self.get_register_index_i(i))
-            index += 1
+            index = callback_i(index, self.get_register_index_i(i))
         for i in range(self.get_register_count_r()):
-            callback_r(index, self.get_register_index_r(i))
-            index += 1
+            index = callback_r(index, self.get_register_index_r(i))
         for i in range(self.get_register_count_f()):
-            callback_f(index, self.get_register_index_f(i))
-            index += 1
+            index = callback_f(index, self.get_register_index_f(i))
+        return index
     enumerate_vars._annspecialcase_ = 'specialize:arg(4)'
 
 _liveness_cache = {}
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -211,7 +211,7 @@
 class NumberingState(object):
     def __init__(self, snapshot_list):
         self.liveboxes = {}
-        self.current = [None] * self.count_boxes(snapshot_list)
+        self.current = [rffi.cast(rffi.SHORT, 0)] * 
self.count_boxes(snapshot_list)
         self.position = len(self.current)
         self.n = 0
         self.v = 0
@@ -285,7 +285,6 @@
         v = state.v
         liveboxes = state.liveboxes
         length = len(boxes)
-        state.position -= length
         for i in range(length):
             box = boxes[i]
             box = optimizer.get_box_replacement(box)
@@ -312,7 +311,7 @@
             state.append(tagged)
         state.n = n
         state.v = v
-        state.position -= length
+        state.position -= length + 2
 
 #    def _get_prev_snapshot(self, snapshot):
 #        cur_snapshot = snapshot
@@ -341,17 +340,17 @@
         # we want to number snapshots starting from the back, but ending
         # with a forward list
         for i in range(len(snapshot_list) - 1, -1, -1):
-            self._number_boxes(snapshot_list[i].boxes, optimizer, state)
+            state.position -= len(snapshot_list[i].boxes)
             if i != 0:
                 frameinfo = framestack_list[i - 1]
                 jitcode_pos, pc = unpack_uint(frameinfo.packed_jitcode_pc)
                 state.position -= 2
                 state.append(rffi.cast(rffi.USHORT, jitcode_pos))
                 state.append(rffi.cast(rffi.USHORT, pc))
-                state.position -= 2
+            self._number_boxes(snapshot_list[i].boxes, optimizer, state)
 
         numb = resumecode.create_numbering(state.current,
-            lltype.nullptr(resumecode.NUMBERING), 0)
+            lltype.nullptr(resumecode.NUMBERING), 0, len(vref_snapshot.boxes))
 
         return numb, state.liveboxes, state.v
         
@@ -1003,6 +1002,16 @@
         self._prepare_virtuals(storage.rd_virtuals)
         self._prepare_pendingfields(storage.rd_pendingfields)
 
+    def read_jitcode_pos_pc(self):
+        jitcode_pos, self.cur_index = resumecode.numb_next_item(self.numb,
+            self.cur_index)
+        pc, self.cur_index = resumecode.numb_next_item(self.numb,
+            self.cur_index)
+        return jitcode_pos, pc
+
+    def done_reading(self):
+        return self.cur_index >= len(self.numb.code)
+
     def getvirtual_ptr(self, index):
         # Returns the index'th virtual, building it lazily if needed.
         # Note that this may be called recursively; that's why the
@@ -1388,33 +1397,26 @@
         rstack._stack_criticalcode_stop()
     #
     # First get a chain of blackhole interpreters whose length is given
-    # by the depth of rd_frame_info_list.  The first one we get must be
+    # by the positions in the numbering.  The first one we get must be
     # the bottom one, i.e. the last one in the chain, in order to make
     # the comment in BlackholeInterpreter.setposition() valid.
-    nextbh = None
-    numbering = storage.rd_numb.prev
+    prevbh = None
+    firstbh = None
+    curbh = None
     while True:
         curbh = blackholeinterpbuilder.acquire_interp()
-        curbh.nextblackholeinterp = nextbh
-        nextbh = curbh
-        numbering = numbering.prev
-        if not numbering:
-            break
-    firstbh = nextbh
-    #
-    # Now fill the blackhole interpreters with resume data.
-    curbh = firstbh
-    xxxx
-    numbering = storage.rd_numb.prev
-    while True:
-        jitcode_pos, pc = unpack_uint(numbering.packed_jitcode_pc)
+        if prevbh is not None:
+            prevbh.nextblackholeinterp = curbh
+        else:
+            firstbh = curbh
+        prevbh = curbh
+        jitcode_pos, pc = resumereader.read_jitcode_pos_pc()
         jitcode = jitcodes[jitcode_pos]
         curbh.setposition(jitcode, pc)
         resumereader.consume_one_section(curbh)
-        curbh = curbh.nextblackholeinterp
-        numbering = numbering.prev
-        if not numbering:
+        if resumereader.done_reading():
             break
+    curbh.nextblackholeinterp = None
     return firstbh
 
 def force_from_resumedata(metainterp_sd, storage, deadframe, vinfo, ginfo):
@@ -1457,7 +1459,7 @@
         info = blackholeinterp.get_current_position_info()
         self._prepare_next_section(info)
 
-    def consume_virtualref_info(self, vrefinfo, numb, end):
+    def consume_virtualref_info(self, vrefinfo, end):
         # we have to decode a list of references containing pairs
         # [..., virtual, vref, ...]  stopping at 'end'
         if vrefinfo is None:
@@ -1470,12 +1472,15 @@
             # For each pair, we store the virtual inside the vref.
             vrefinfo.continue_tracing(vref, virtual)
 
-    def consume_vable_info(self, vinfo, numb):
+    def consume_vable_info(self, vinfo):
         # we have to ignore the initial part of 'nums' (containing vrefs),
         # find the virtualizable from nums[-1], load all other values
         # from the CPU stack, and copy them into the virtualizable
+        numb = self.numb
+        first_snapshot_size = rffi.cast(lltype.Signed, 
numb.first_snapshot_size)
         if vinfo is None:
-            return len(numb.nums)
+            return first_snapshot_size
+        xxx
         index = len(numb.nums) - 1
         virtualizable = self.decode_ref(numb.nums[index])
         # just reset the token, we'll force it later
@@ -1497,14 +1502,11 @@
     load_value_of_type._annspecialcase_ = 'specialize:arg(1)'
 
     def consume_vref_and_vable(self, vrefinfo, vinfo, ginfo):
-        xxx
-        numb = self.cur_numb
-        self.cur_numb = numb.prev
         if self.resume_after_guard_not_forced != 2:
-            end_vref = self.consume_vable_info(vinfo, numb)
+            end_vref = self.consume_vable_info(vinfo)
             if ginfo is not None:
                 end_vref -= 1
-            self.consume_virtualref_info(vrefinfo, numb, end_vref)
+            self.consume_virtualref_info(vrefinfo, end_vref)
 
     def allocate_with_vtable(self, descr=None):
         from rpython.jit.metainterp.executor import exec_new_with_vtable
diff --git a/rpython/jit/metainterp/resumecode.py 
b/rpython/jit/metainterp/resumecode.py
--- a/rpython/jit/metainterp/resumecode.py
+++ b/rpython/jit/metainterp/resumecode.py
@@ -15,19 +15,21 @@
 NUMBERING = lltype.GcStruct('Numbering',
                             ('prev', NUMBERINGP),
                             ('prev_index', rffi.USHORT),
+                            ('first_snapshot_size', rffi.USHORT), # ugh, ugly
                             ('code', lltype.Array(rffi.SHORT)))
 NUMBERINGP.TO.become(NUMBERING)
 NULL_NUMBER = lltype.nullptr(NUMBERING)
 
-def create_numbering(lst, prev, prev_index):
+def create_numbering(lst, prev, prev_index, first_snapshot_size):
     numb = lltype.malloc(NUMBERING, len(lst))
     for i in range(len(lst)):
         numb.code[i] = rffi.cast(rffi.SHORT, lst[i])
     numb.prev = prev
     numb.prev_index = rffi.cast(rffi.USHORT, prev_index)
+    numb.first_snapshot_size = rffi.cast(rffi.USHORT, first_snapshot_size)
     return numb
 
-def _create_numbering(lst, prev, prev_index):
+def _create_numbering(lst, prev, prev_index, first_snapshot_size):
     count = 0
     for item in lst:
         if item < 0:
@@ -39,6 +41,7 @@
     numb = lltype.malloc(NUMBERING, count)
     numb.prev = prev
     numb.prev_index = rffi.cast(rffi.USHORT, prev_index)
+    numb.first_snapshot_size = rffi.cast(rffi.USHORT, first_snapshot_size)
     index = 0
     for item in lst:
         if 0 <= item <= 128:
diff --git a/rpython/jit/metainterp/test/test_resume.py 
b/rpython/jit/metainterp/test/test_resume.py
--- a/rpython/jit/metainterp/test/test_resume.py
+++ b/rpython/jit/metainterp/test/test_resume.py
@@ -279,7 +279,7 @@
 
 
 def Numbering(nums):
-    numb = create_numbering(nums, NULL_NUMBER, 0)
+    numb = create_numbering(nums, NULL_NUMBER, 0, 0)
     return numb
 
 def tagconst(i):
@@ -947,8 +947,9 @@
     assert v == 0
     
     assert liveboxes3 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX)}
-    assert unpack_numbering(numb3) == [tag(3, TAGINT), tag(4, TAGINT), tag(0, 
TAGBOX),
-                                tag(3, TAGINT), 0, 0] + base
+    assert unpack_numbering(numb3) == [tag(3, TAGINT), tag(4, TAGINT),
+                                       tag(0, TAGBOX),
+                                       tag(3, TAGINT), 0, 0] + base
 
     # virtual
     env4 = [c3, b4, b1, c3]
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to