Author: Carl Friedrich Bolz <cfb...@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 + +@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) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit