[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