Author: Armin Rigo <[email protected]>
Branch: bitstring
Changeset: r83908:218c5643fb3d
Date: 2016-04-26 15:21 +0200
http://bitbucket.org/pypy/pypy/changeset/218c5643fb3d/

Log:    Port force_from_effectinfo()

diff --git a/rpython/jit/metainterp/optimizeopt/heap.py 
b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -432,28 +432,30 @@
     optimize_GUARD_EXCEPTION = optimize_GUARD_NO_EXCEPTION
 
     def force_from_effectinfo(self, effectinfo):
-        # XXX we can get the wrong complexity here, if the lists
-        # XXX stored on effectinfo are large
-        for fielddescr in effectinfo.readonly_descrs_fields:
-            self.force_lazy_set(fielddescr)
-        for arraydescr in effectinfo.readonly_descrs_arrays:
-            self.force_lazy_setarrayitem(arraydescr)
-        for fielddescr in effectinfo.write_descrs_fields:
-            if fielddescr.is_always_pure():
-                continue
-            try:
-                del self.cached_dict_reads[fielddescr]
-            except KeyError:
-                pass
-            self.force_lazy_set(fielddescr, can_cache=False)
-        for arraydescr in effectinfo.write_descrs_arrays:
-            self.force_lazy_setarrayitem(arraydescr, can_cache=False)
-            if arraydescr in self.corresponding_array_descrs:
-                dictdescr = self.corresponding_array_descrs.pop(arraydescr)
+        for fielddescr, cf in self.cached_fields.items():
+            if effectinfo.check_readonly_descr_field(fielddescr):
+                cf.force_lazy_set(self, fielddescr)
+            elif effectinfo.check_write_descr_field(fielddescr):
+                if fielddescr.is_always_pure():
+                    continue
                 try:
-                    del self.cached_dict_reads[dictdescr]
+                    del self.cached_dict_reads[fielddescr]
                 except KeyError:
-                    pass # someone did it already
+                    pass
+                cf.force_lazy_set(self, fielddescr, can_cache=False)
+        #
+        for arraydescr, submap in self.cached_arrayitems.items():
+            if effectinfo.check_readonly_descr_array(arraydescr):
+                self.force_lazy_setarrayitem_submap(submap)
+            elif effectinfo.check_write_descr_array(arraydescr):
+                self.force_lazy_setarrayitem_submap(submap, can_cache=False)
+                if arraydescr in self.corresponding_array_descrs:
+                    dictdescr = self.corresponding_array_descrs.pop(arraydescr)
+                    try:
+                        del self.cached_dict_reads[dictdescr]
+                    except KeyError:
+                        pass # someone did it already
+        #
         if effectinfo.check_forces_virtual_or_virtualizable():
             vrefinfo = self.optimizer.metainterp_sd.virtualref_info
             self.force_lazy_set(vrefinfo.descr_forced)
@@ -476,6 +478,10 @@
             if indexb is None or indexb.contains(idx):
                 cf.force_lazy_set(self, None, can_cache)
 
+    def force_lazy_setarrayitem_submap(self, submap, can_cache=True):
+        for idx, cf in submap.iteritems():
+            cf.force_lazy_set(self, None, can_cache)
+
     def force_all_lazy_sets(self):
         items = self.cached_fields.items()
         if not we_are_translated():
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to