[pypy-svn] pypy jit-short_from_state: force not suported virtuals as members of VirtualStructs
hakanardo
commits-noreply at bitbucket.org
Mon Apr 25 10:37:24 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r43548:bcdfee77bd20
Date: 2011-04-24 21:14 +0200
http://bitbucket.org/pypy/pypy/changeset/bcdfee77bd20/
Log: force not suported virtuals as members of VirtualStructs
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -80,8 +80,8 @@
def get_key_box(self):
return self.box
- def force_at_end_of_preamble(self):
- return None
+ def force_at_end_of_preamble(self, already_forced):
+ return self
def get_cloned(self, optimizer, valuemap, force_if_needed=True):
if self in valuemap:
diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py b/pypy/jit/metainterp/optimizeopt/virtualstate.py
--- a/pypy/jit/metainterp/optimizeopt/virtualstate.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py
@@ -269,13 +269,11 @@
return info
def get_virtual_state(self, jump_args):
+ already_forced = {}
for box in jump_args:
value = self.getvalue(box)
- box = value.force_at_end_of_preamble()
- if box:
- self.make_not_virtual(OptValue(box))
- else:
- value.get_args_for_fail(self)
+ value = value.force_at_end_of_preamble(already_forced)
+ value.get_args_for_fail(self)
return VirtualState([self.state(box) for box in jump_args])
diff --git a/pypy/jit/metainterp/optimizeopt/virtualize.py b/pypy/jit/metainterp/optimizeopt/virtualize.py
--- a/pypy/jit/metainterp/optimizeopt/virtualize.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualize.py
@@ -4,6 +4,7 @@
from pypy.jit.metainterp.optimizeutil import descrlist_dict
from pypy.rlib.objectmodel import we_are_translated
from pypy.jit.metainterp.optimizeopt import optimizer
+from pypy.jit.metainterp.optimizeopt.optimizer import OptValue
from pypy.jit.metainterp.executor import execute
from pypy.jit.codewriter.heaptracker import vtable2descr
@@ -31,8 +32,11 @@
self._really_force()
return self.box
- def force_at_end_of_preamble(self):
- return self.force_box()
+ def force_at_end_of_preamble(self, already_forced):
+ value = already_forced.get(self, None)
+ if value:
+ return value
+ return OptValue(self.force_box())
def make_virtual_info(self, modifier, fieldnums):
if fieldnums is None:
@@ -90,8 +94,13 @@
return False
return True
- def force_at_end_of_preamble(self):
- return None
+ def force_at_end_of_preamble(self, already_forced):
+ if self in already_forced:
+ return self
+ already_forced[self] = self
+ for ofs in self._fields.keys():
+ self._fields[ofs] = self._fields[ofs].force_at_end_of_preamble(already_forced)
+ return self
def _really_force(self):
op = self.source_op
@@ -244,7 +253,7 @@
self._items[index] = itemvalue
def force_at_end_of_preamble(self):
- return None
+ raise NotImplementedError
def _really_force(self):
assert self.source_op is not None
More information about the Pypy-commit
mailing list