[pypy-commit] pypy optinfo-into-bridges: also add a Writer class
cfbolz
pypy.commits at gmail.com
Sat Oct 15 07:02:31 EDT 2016
Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: optinfo-into-bridges
Changeset: r87809:e1832b3ddde9
Date: 2016-10-14 17:28 +0200
http://bitbucket.org/pypy/pypy/changeset/e1832b3ddde9/
Log: also add a Writer class
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
@@ -256,7 +256,7 @@
def number(self, optimizer, position, trace):
snapshot_iter = trace.get_snapshot_iter(position)
numb_state = NumberingState(snapshot_iter.size)
- numb_state.append_int(-1) # patch later
+ numb_state.append_int(0) # patch later
arr = snapshot_iter.vable_array
@@ -1407,8 +1407,7 @@
virtualizable = self.next_ref()
# just reset the token, we'll force it later
vinfo.reset_token_gcref(virtualizable)
- index = vinfo.write_from_resume_data_partial(virtualizable, self,
- index, numb)
+ vinfo.write_from_resume_data_partial(virtualizable, self)
return index
def load_next_value_of_type(self, TYPE):
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
@@ -30,33 +30,24 @@
NUMBERINGP.TO.become(NUMBERING)
NULL_NUMBER = lltype.nullptr(NUMBERING)
-def create_numbering(lst, total=-1):
- if total == -1:
- total = len(lst)
- result = []
- for i in range(total):
- item = lst[i]
- item = rffi.cast(lltype.Signed, item)
- item *= 2
- if item < 0:
- item = -1 - item
+def append_numbering(lst, item):
+ item = rffi.cast(lltype.Signed, item)
+ item *= 2
+ if item < 0:
+ item = -1 - item
- assert item >= 0
- if item < 2**7:
- result.append(rffi.cast(rffi.UCHAR, item))
- elif item < 2**14:
- result.append(rffi.cast(rffi.UCHAR, item | 0x80))
- result.append(rffi.cast(rffi.UCHAR, item >> 7))
- else:
- assert item < 2**16
- result.append(rffi.cast(rffi.UCHAR, item | 0x80))
- result.append(rffi.cast(rffi.UCHAR, (item >> 7) | 0x80))
- result.append(rffi.cast(rffi.UCHAR, item >> 14))
+ assert item >= 0
+ if item < 2**7:
+ lst.append(rffi.cast(rffi.UCHAR, item))
+ elif item < 2**14:
+ lst.append(rffi.cast(rffi.UCHAR, item | 0x80))
+ lst.append(rffi.cast(rffi.UCHAR, item >> 7))
+ else:
+ assert item < 2**16
+ lst.append(rffi.cast(rffi.UCHAR, item | 0x80))
+ lst.append(rffi.cast(rffi.UCHAR, (item >> 7) | 0x80))
+ lst.append(rffi.cast(rffi.UCHAR, item >> 14))
- numb = lltype.malloc(NUMBERING, len(result))
- for i in range(len(result)):
- numb.code[i] = result[i]
- return numb
def numb_next_item(numb, index):
value = rffi.cast(lltype.Signed, numb.code[index])
@@ -90,11 +81,13 @@
class Writer(object):
def __init__(self, size):
- self.current = objectmodel.newlist_hint(size)
+ self.current = objectmodel.newlist_hint(3 * size)
self.grow(size)
+ self.items = 0
def append_short(self, item):
- self.current.append(item)
+ self.items += 1
+ append_numbering(self.current, item)
def append_int(self, item):
short = rffi.cast(rffi.SHORT, item)
@@ -102,16 +95,21 @@
return self.append_short(short)
def create_numbering(self):
- return create_numbering(self.current)
+ numb = lltype.malloc(NUMBERING, len(self.current))
+ for i, elt in enumerate(self.current):
+ numb.code[i] = elt
+ return numb
def grow(self, size):
pass
def patch_current_size(self, index):
- item = len(self.current)
- short = rffi.cast(rffi.SHORT, item)
- assert rffi.cast(lltype.Signed, short) == item
- self.current[index] = short
+ # mess :-(
+ assert rffi.cast(lltype.Signed, self.current[index]) == 0
+ l = []
+ append_numbering(l, self.items)
+ self.current = l + self.current[1:]
+
class Reader(object):
def __init__(self, code):
diff --git a/rpython/jit/metainterp/test/test_bridgeopt.py b/rpython/jit/metainterp/test/test_bridgeopt.py
--- a/rpython/jit/metainterp/test/test_bridgeopt.py
+++ b/rpython/jit/metainterp/test/test_bridgeopt.py
@@ -7,6 +7,7 @@
from rpython.jit.metainterp.optimizeopt.bridgeopt import deserialize_optimizer_knowledge
from rpython.jit.metainterp.resoperation import InputArgRef, InputArgInt
from rpython.jit.metainterp.resume import NumberingState
+from rpython.jit.metainterp.resumecode import unpack_numbering
from rpython.jit.metainterp.optimizeopt.info import InstancePtrInfo
from hypothesis import strategies, given
@@ -60,7 +61,7 @@
serialize_optimizer_knowledge(optimizer, numb_state, liveboxes, {}, None)
- assert numb_state.current[:numb_state._pos] == [1, 0b010000, 0]
+ assert unpack_numbering(numb_state.create_numbering()) == [1, 0b010000, 0]
rbox1 = InputArgRef()
rbox2 = InputArgRef()
diff --git a/rpython/jit/metainterp/test/test_resumecode.py b/rpython/jit/metainterp/test/test_resumecode.py
--- a/rpython/jit/metainterp/test/test_resumecode.py
+++ b/rpython/jit/metainterp/test/test_resumecode.py
@@ -37,10 +37,26 @@
assert elt == item
@hypothesis_and_examples
-def test_reader(l):
+def test_writer(l):
for size in [len(l), 0]:
w = Writer(len(l))
for num in l:
w.append_int(num)
n = w.create_numbering()
assert unpack_numbering(n) == l
+
+ at hypothesis_and_examples
+def test_patch(l):
+ for middle in range(len(l)):
+ l1 = l[:middle]
+ l2 = l[middle:]
+ w = Writer(len(l))
+ w.append_int(0)
+ for num in l1:
+ w.append_int(num)
+ w.patch_current_size(0)
+ for num in l2:
+ w.append_int(num)
+ n = w.create_numbering()
+ assert unpack_numbering(n)[1:] == l
+ assert unpack_numbering(n)[0] == middle + 1
diff --git a/rpython/jit/metainterp/virtualizable.py b/rpython/jit/metainterp/virtualizable.py
--- a/rpython/jit/metainterp/virtualizable.py
+++ b/rpython/jit/metainterp/virtualizable.py
@@ -139,7 +139,6 @@
for j in range(getlength(lst)):
x = reader.load_next_value_of_type(ARRAYITEMTYPE)
setarrayitem(lst, j, x)
- return index
def load_list_of_boxes(virtualizable, reader, vable_box):
virtualizable = cast_gcref_to_vtype(virtualizable)
@@ -157,7 +156,7 @@
box = reader.next_box_of_type(ARRAYITEMTYPE)
boxes.append(box)
boxes.append(vable_box)
- return boxes, index
+ return boxes
def check_boxes(virtualizable, boxes):
virtualizable = cast_gcref_to_vtype(virtualizable)
More information about the pypy-commit
mailing list