Author: Armin Rigo <ar...@tunes.org> Branch: heapcache-refactor Changeset: r83111:1d11223aec92 Date: 2016-03-17 15:53 +0100 http://bitbucket.org/pypy/pypy/changeset/1d11223aec92/
Log: escape diff --git a/rpython/jit/metainterp/heapcache.py b/rpython/jit/metainterp/heapcache.py --- a/rpython/jit/metainterp/heapcache.py +++ b/rpython/jit/metainterp/heapcache.py @@ -90,7 +90,7 @@ def _invalidate_unescaped(self, d): for ref_box in d.keys(): - if not self.heapcache._check_flag(ref_box, HF_IS_UNESCAPED): + if not self.heapcache.is_unescaped(ref_box): del d[ref_box] @@ -168,15 +168,11 @@ self.clear_caches(opnum, descr, argboxes) def _escape_from_write(self, box, fieldbox): - value = self.getvalue(box, create=False) - fieldvalue = self.getvalue(fieldbox, create=False) - if (value is not None and value.is_unescaped and - fieldvalue is not None and fieldvalue.is_unescaped): - if value.dependencies is None: - value.dependencies = [] - value.dependencies.append(fieldvalue) - elif fieldvalue is not None: - self._escape(fieldvalue) + if self.is_unescaped(box) and self.is_unescaped(fieldbox): + deps = self._get_deps(box) + deps.append(fieldbox) + elif fieldbox is not None: + self._escape_box(fieldbox) def mark_escaped(self, opnum, descr, argboxes): if opnum == rop.SETFIELD_GC: @@ -213,15 +209,18 @@ def _escape_box(self, box): if isinstance(box, RefFrontendOp): remove_flags(box, HF_LIKELY_VIRTUAL | HF_IS_UNESCAPED) - deps = self._get_deps(box) - if deps is not None and len(deps) > 1: - # 'deps[0]' is abused to store the array length, keep it - if deps[0] is None: + deps = box._heapc_deps + if deps is not None: + if not self.test_head_version(box): box._heapc_deps = None else: - box._heapc_deps = [deps[0]] - for i in range(1, len(deps)): - self._escape(deps[i]) + # 'deps[0]' is abused to store the array length, keep it + if deps[0] is None: + box._heapc_deps = None + else: + box._heapc_deps = [deps[0]] + for i in range(1, len(deps)): + self._escape_box(deps[i]) def clear_caches(self, opnum, descr, argboxes): if (opnum == rop.SETFIELD_GC or diff --git a/rpython/jit/metainterp/test/test_heapcache.py b/rpython/jit/metainterp/test/test_heapcache.py --- a/rpython/jit/metainterp/test/test_heapcache.py +++ b/rpython/jit/metainterp/test/test_heapcache.py @@ -582,6 +582,8 @@ def test_unescaped(self): h = HeapCache() + box1 = RefFrontendOp(1) + box2 = RefFrontendOp(2) assert not h.is_unescaped(box1) h.new(box2) assert h.is_unescaped(box2) @@ -592,6 +594,9 @@ def test_unescaped_testing(self): h = HeapCache() + box1 = RefFrontendOp(1) + box2 = RefFrontendOp(2) + box3 = RefFrontendOp(3) h.new(box1) h.new(box2) assert h.is_unescaped(box1) @@ -610,6 +615,8 @@ def test_ops_dont_escape(self): h = HeapCache() + box1 = RefFrontendOp(1) + box2 = RefFrontendOp(2) h.new(box1) h.new(box2) assert h.is_unescaped(box1) @@ -623,6 +630,9 @@ def test_circular_virtuals(self): h = HeapCache() + box1 = RefFrontendOp(1) + box2 = RefFrontendOp(2) + box3 = RefFrontendOp(3) h.new(box1) h.new(box2) h.invalidate_caches(rop.SETFIELD_GC, None, [box1, box2]) @@ -631,6 +641,10 @@ def test_unescaped_array(self): h = HeapCache() + box1 = RefFrontendOp(1) + box2 = RefFrontendOp(2) + lengthbox1 = IntFrontendOp(11) + lengthbox2 = IntFrontendOp(12) h.new_array(box1, lengthbox1) assert h.is_unescaped(box1) h.invalidate_caches(rop.SETARRAYITEM_GC, None, [box1, index1, box2]) @@ -654,6 +668,8 @@ def test_call_doesnt_invalidate_unescaped_boxes(self): h = HeapCache() + box1 = RefFrontendOp(1) + box2 = RefFrontendOp(2) h.new(box1) assert h.is_unescaped(box1) h.setfield(box1, box2, descr1) @@ -665,6 +681,9 @@ def test_call_doesnt_invalidate_unescaped_array_boxes(self): h = HeapCache() + box1 = RefFrontendOp(1) + box3 = RefFrontendOp(3) + lengthbox1 = IntFrontendOp(11) h.new_array(box1, lengthbox1) assert h.is_unescaped(box1) h.setarrayitem(box1, index1, box3, descr1) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit