[pypy-commit] pypy optresult: setfields

fijal noreply at buildbot.pypy.org
Sat Mar 14 17:51:34 CET 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r76369:d7dcc6e2867f
Date: 2015-03-13 10:06 +0200
http://bitbucket.org/pypy/pypy/changeset/d7dcc6e2867f/

Log:	setfields

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
@@ -241,7 +241,7 @@
                 d.produce_potential_short_preamble_ops(self.optimizer, sb, descr)
 
     def invalidate_descr(self, descr, lst=None):
-        if lst is not None:
+        if lst is None:
             lst = self.infos_to_invalidate.get(descr, None)
             if lst is None:
                 return
@@ -523,15 +523,20 @@
     optimize_GETFIELD_GC_PURE_F = optimize_GETFIELD_GC_PURE_I
 
     def optimize_SETFIELD_GC(self, op):
+        #opnum = OpHelpers.getfield_pure_for_descr(op.getdescr())
+        #if self.has_pure_result(opnum, [op.getarg(0)],
+        #                        op.getdescr()):
+        #    os.write(2, '[bogus _immutable_field_ declaration: %s]\n' %
+        #             (op.getdescr().repr_of_descr()))
+        #    raise BogusPureField
+        #
+        opinfo = self.ensure_ptr_info_arg0(op)
+        self.invalidate_descr(op.getdescr())
+        opinfo.setfield(op.getdescr(), self.get_box_replacement(op.getarg(1)),
+                        self)
+        # clear all the caches for this descr
         self.emit_operation(op)
         return
-        opnum = OpHelpers.getfield_pure_for_descr(op.getdescr())
-        if self.has_pure_result(opnum, [op.getarg(0)],
-                                op.getdescr()):
-            os.write(2, '[bogus _immutable_field_ declaration: %s]\n' %
-                     (op.getdescr().repr_of_descr()))
-            raise BogusPureField
-        #
         cf = self.field_cache(op.getdescr())
         cf.do_setfield(self, op)
 
diff --git a/rpython/jit/metainterp/optimizeopt/info.py b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -87,7 +87,7 @@
 
     def setfield(self, descr, op, optheap=None):
         if not self.is_virtual():
-            if self._fields[descr.index] is not None:
+            if self._fields[descr.index] is None:
                 assert optheap is not None
                 # we should only call it with virtuals without optheap
                 optheap.register_dirty_field(descr, self)


More information about the pypy-commit mailing list