Author: fijal
Branch: compress-numbering
Changeset: r80879:d42389c1c4d6
Date: 2015-11-24 11:40 +0200
http://bitbucket.org/pypy/pypy/changeset/d42389c1c4d6/
Log: fix parts of test resume
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
@@ -208,6 +208,13 @@
UNINITIALIZED = tag(-2, TAGCONST) # used for uninitialized string characters
+class NumberingState(object):
+ def __init__(self):
+ self.liveboxes = {}
+ self.current = []
+ self.n = 0
+ self.v = 0
+
class ResumeDataLoopMemo(object):
def __init__(self, metainterp_sd):
@@ -259,9 +266,13 @@
# env numbering
- def _number_boxes(self, boxes, liveboxes, optimizer, v, n):
+ def _number_boxes(self, boxes, optimizer, state):
+ """ Number boxes from one snapshot
+ """
+ n = state.n
+ v = state.v
+ liveboxes = state.liveboxes
length = len(boxes)
- current = []
for i in range(length):
box = boxes[i]
box = optimizer.get_box_replacement(box)
@@ -285,57 +296,48 @@
tagged = tag(n, TAGBOX)
n += 1
liveboxes[box] = tagged
- current.append(tagged)
- return v, n, current
+ state.current.append(tagged)
+ state.n = n
+ state.v = v
- def _get_prev_snapshot(self, snapshot):
- cur_snapshot = snapshot
- while True:
- try:
- return self.numberings[cur_snapshot], cur_snapshot
- except KeyError:
- pass
- cur_snapshot = cur_snapshot.prev
- if not cur_snapshot:
- return (lltype.nullptr(resumecode.NUMBERING), 0, {}, 0), None
+# def _get_prev_snapshot(self, snapshot):
+# cur_snapshot = snapshot
+# while True:
+# try:
+# return self.numberings[cur_snapshot], cur_snapshot
+# except KeyError:
+# pass
+# cur_snapshot = cur_snapshot.prev
+# if not cur_snapshot:
+# return (lltype.nullptr(resumecode.NUMBERING), 0, {}, 0), None
def number(self, optimizer, snapshot, frameinfo):
- # find the parent
+ # flatten the list
+ cur = snapshot
+ snapshot_list = []
+ framestack_list = []
+ while cur:
+ if cur is not snapshot:
+ framestack_list.append(frameinfo)
+ frameinfo = frameinfo.prev
+ snapshot_list.append(cur)
+ cur = cur.prev
+ snapshot_list.reverse()
+ framestack_list.reverse()
+ state = NumberingState()
- p = self._get_prev_snapshot(snapshot)
- (prev_numb, prev_numb_index, liveboxes, v), s = p
- n = len(liveboxes) - v
- first = True
- all_lists = []
- total_lgt = 0
- cur_snapshot = snapshot
- liveboxes_to_save = []
- while cur_snapshot != s:
- liveboxes_to_save.append((liveboxes.copy(), v))
- v, n, current = self._number_boxes(cur_snapshot.boxes, liveboxes,
optimizer,
- v, n)
- cur_snapshot = cur_snapshot.prev
- if first:
- first = False
- else:
+ for i in range(len(snapshot_list)):
+ self._number_boxes(snapshot_list[i].boxes, optimizer, state)
+ if i != 0:
+ frameinfo = framestack_list[i - 1]
jitcode_pos, pc = unpack_uint(frameinfo.packed_jitcode_pc)
- current.append(rffi.cast(rffi.USHORT, jitcode_pos))
- current.append(rffi.cast(rffi.USHORT, pc))
- lst = resumecode.create_numbering(current)
- total_lgt += len(lst)
- all_lists.append(lst)
- numb = lltype.malloc(resumecode.NUMBERING, total_lgt)
- numb.prev = prev_numb
- numb.prev_index = rffi.cast(rffi.USHORT, prev_numb_index)
- index = 0
- for i in range(len(all_lists)):
- lst = all_lists[i]
- liveboxes_snapshot, v = liveboxes_to_save[i]
- self.numberings[snapshot] = (numb, index, liveboxes_snapshot, v)
- resumecode.copy_from_list_to_numb(lst, numb, index)
- index += len(lst)
- snapshot = snapshot.prev
- return numb, liveboxes, v
+ state.current.append(rffi.cast(rffi.USHORT, jitcode_pos))
+ state.current.append(rffi.cast(rffi.USHORT, pc))
+
+ numb = resumecode.create_numbering(state.current,
+ lltype.nullptr(resumecode.NUMBERING), 0)
+
+ return numb, state.liveboxes, state.v
def forget_numberings(self):
# XXX ideally clear only the affected numberings
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
@@ -18,22 +18,24 @@
('code', lltype.Array(rffi.UCHAR)))
NUMBERINGP.TO.become(NUMBERING)
-def create_numbering(lst):
+def create_numbering(lst, prev, prev_index):
count = 0
for item in lst:
if item > 127:
count += 1
count += 1
- numb = [rffi.cast(rffi.UCHAR, 0)] * count
+ numb = lltype.malloc(NUMBERING, count)
+ numb.prev = prev
+ numb.prev_index = rffi.cast(rffi.USHORT, prev_index)
index = 0
for item in lst:
if item <= 128:
- numb[index] = rffi.cast(rffi.UCHAR, item)
+ numb.code[index] = rffi.cast(rffi.UCHAR, item)
index += 1
else:
assert (item >> 8) <= 127
- numb[index] = rffi.cast(rffi.UCHAR, (item >> 8) | 0x80)
- numb[index + 1] = rffi.cast(rffi.UCHAR, item & 0xff)
+ numb.code[index] = rffi.cast(rffi.UCHAR, (item >> 8) |
0x80)
+ numb.code[index + 1] = rffi.cast(rffi.UCHAR, item &
0xff)
index += 2
return numb
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
@@ -11,6 +11,7 @@
VUniPlainInfo, VUniConcatInfo, VUniSliceInfo, Snapshot, FrameInfo,\
capture_resumedata, ResumeDataLoopMemo, UNASSIGNEDVIRTUAL, INT,\
annlowlevel, PENDINGFIELDSP, unpack_uint
+from rpython.jit.metainterp.resumecode import unpack_numbering
from rpython.jit.metainterp.optimizeopt import info
from rpython.jit.metainterp.history import ConstInt, Const, AbstractDescr
from rpython.jit.metainterp.history import ConstPtr, ConstFloat
@@ -926,21 +927,19 @@
assert liveboxes == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX),
b3: tag(2, TAGBOX)}
- assert list(numb.nums) == [tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX),
- tag(1, TAGINT)]
- assert list(numb.prev.nums) == [tag(0, TAGBOX), tag(1, TAGINT),
- tag(1, TAGBOX),
- tag(0, TAGBOX), tag(2, TAGINT)]
- assert not numb.prev.prev
+ base = [tag(0, TAGBOX), tag(1, TAGINT), tag(1, TAGBOX), tag(0, TAGBOX),
tag(2, TAGINT)]
- numb2, liveboxes2, v = memo.number(FakeOptimizer(), snap2)
+ assert unpack_numbering(numb) == base + [
+ tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX), tag(1, TAGINT), 0, 0]
+
+ numb2, liveboxes2, v = memo.number(FakeOptimizer(), snap2, frameinfo)
assert v == 0
assert liveboxes2 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX),
b3: tag(2, TAGBOX)}
assert liveboxes2 is not liveboxes
- assert list(numb2.nums) == [tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX),
- tag(3, TAGINT)]
+ assert unpack_numbering(numb2) == base + [
+ tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX), tag(3, TAGINT), 0, 0]
assert numb2.prev == numb.prev
env3 = [c3, b3, b1, c3]
@@ -955,41 +954,39 @@
# renamed
b3.set_forwarded(c4)
- numb3, liveboxes3, v = memo.number(FakeOptimizer(), snap3)
+ numb3, liveboxes3, v = memo.number(FakeOptimizer(), snap3, frameinfo)
assert v == 0
assert liveboxes3 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX)}
- assert list(numb3.nums) == [tag(3, TAGINT), tag(4, TAGINT), tag(0, TAGBOX),
- tag(3, TAGINT)]
- assert numb3.prev == numb.prev
+ assert unpack_numbering(numb3) == base + [tag(3, TAGINT), tag(4, TAGINT),
tag(0, TAGBOX),
+ tag(3, TAGINT), 0, 0]
# virtual
env4 = [c3, b4, b1, c3]
snap4 = Snapshot(snap, env4)
b4.set_forwarded(FakeVirtualInfo(True))
- numb4, liveboxes4, v = memo.number(FakeOptimizer(), snap4)
+ numb4, liveboxes4, v = memo.number(FakeOptimizer(), snap4, frameinfo)
assert v == 1
assert liveboxes4 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX),
b4: tag(0, TAGVIRTUAL)}
- assert list(numb4.nums) == [tag(3, TAGINT), tag(0, TAGVIRTUAL),
- tag(0, TAGBOX), tag(3, TAGINT)]
- assert numb4.prev == numb.prev
+ assert unpack_numbering(numb4) == base + [tag(3, TAGINT), tag(0,
TAGVIRTUAL),
+ tag(0, TAGBOX), tag(3, TAGINT), 0, 0]
env5 = [b1, b4, b5]
snap5 = Snapshot(snap4, env5)
b4.set_forwarded(FakeVirtualInfo(True))
b5.set_forwarded(FakeVirtualInfo(True))
- numb5, liveboxes5, v = memo.number(FakeOptimizer(), snap5)
+ frameinfo = FrameInfo(frameinfo, FakeJitCode("foo", 2), 1)
+ numb5, liveboxes5, v = memo.number(FakeOptimizer(), snap5, frameinfo)
assert v == 2
assert liveboxes5 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX),
b4: tag(0, TAGVIRTUAL), b5: tag(1, TAGVIRTUAL)}
- assert list(numb5.nums) == [tag(0, TAGBOX), tag(0, TAGVIRTUAL),
- tag(1, TAGVIRTUAL)]
- assert numb5.prev == numb4
+ assert unpack_numbering(numb5) == unpack_numbering(numb4) + [tag(0,
TAGBOX), tag(0, TAGVIRTUAL),
+ tag(1, TAGVIRTUAL), 2, 1]
def test_ResumeDataLoopMemo_number_boxes():
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit