Author: Carl Friedrich Bolz <cfb...@gmx.de> Branch: Changeset: r45653:72d3b692033c Date: 2011-07-15 20:19 +0200 http://bitbucket.org/pypy/pypy/changeset/72d3b692033c/
Log: check only once during tracing whether a frame is a nonstandard- virtualizable diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py --- a/pypy/jit/metainterp/pyjitpl.py +++ b/pypy/jit/metainterp/pyjitpl.py @@ -596,12 +596,16 @@ standard_box = self.metainterp.virtualizable_boxes[-1] if standard_box is box: return False + if box in self.metainterp.nonstandard_virtualizables: + return True eqbox = self.metainterp.execute_and_record(rop.PTR_EQ, None, box, standard_box) eqbox = self.implement_guard_value(pc, eqbox) isstandard = eqbox.getint() if isstandard: self.metainterp.replace_box(box, standard_box) + else: + self.metainterp.nonstandard_virtualizables[box] = None return not isstandard def _get_virtualizable_field_index(self, fielddescr): @@ -1456,6 +1460,8 @@ self.call_pure_results = args_dict_box() # contains boxes where the class is already known self.known_class_boxes = {} + # contains frame boxes that are not virtualizables + self.nonstandard_virtualizables = {} def perform_call(self, jitcode, boxes, greenkey=None): # causes the metainterp to enter the given subfunction @@ -1797,6 +1803,7 @@ def reached_loop_header(self, greenboxes, redboxes, resumedescr): self.known_class_boxes = {} + self.nonstandard_virtualizables = {} # XXX maybe not needed? duplicates = {} self.remove_consts_and_duplicates(redboxes, len(redboxes), diff --git a/pypy/jit/metainterp/test/test_virtualizable.py b/pypy/jit/metainterp/test/test_virtualizable.py --- a/pypy/jit/metainterp/test/test_virtualizable.py +++ b/pypy/jit/metainterp/test/test_virtualizable.py @@ -1133,6 +1133,7 @@ res = self.meta_interp(f, [10]) assert res == 55 self.check_loops(new_with_vtable=0, ptr_eq=1, everywhere=True) + self.check_history(ptr_eq=2) def test_virtual_child_frame_with_arrays(self): myjitdriver = JitDriver(greens = [], reds = ['frame'], _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit