[pypy-commit] pypy optresult: few small fixes

fijal noreply at buildbot.pypy.org
Wed May 27 09:55:19 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r77608:ae589174c1c1
Date: 2015-05-27 09:43 +0200
http://bitbucket.org/pypy/pypy/changeset/ae589174c1c1/

Log:	few small fixes

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
@@ -590,7 +590,7 @@
         # NB: emitting the GETFIELD_GC_PURE is only safe because the
         # QUASIIMMUT_FIELD is also emitted to make sure the dependency is
         # registered.
-        structvalue = self.getvalue(op.getarg(0))
+        structvalue = self.ensure_ptr_info_arg0(op)
         if not structvalue.is_constant():
             self._remove_guard_not_invalidated = True
             return    # not a constant at all; ignore QUASIIMMUT_FIELD
@@ -601,7 +601,8 @@
         # check that the value is still correct; it could have changed
         # already between the tracing and now.  In this case, we mark the loop
         # as invalid
-        if not qmutdescr.is_still_valid_for(structvalue.get_key_box()):
+        if not qmutdescr.is_still_valid_for(
+                self.get_box_replacement(op.getarg(0))):
             raise InvalidLoop('quasi immutable field changed during tracing')
         # record as an out-of-line guard
         if self.optimizer.quasi_immutable_deps is None:
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
@@ -344,7 +344,7 @@
     
     def getstrlen(self, op, string_optimizer, mode, create_ops=True):
         s = self._unpack_str(mode)
-        if not s:
+        if s is None:
             return None
         return ConstInt(len(s))
 
diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py b/rpython/jit/metainterp/optimizeopt/intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -9,7 +9,7 @@
      MODE_UNICODE
 from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
 from rpython.jit.metainterp.resoperation import rop, AbstractResOp
-
+from rpython.jit.metainterp.optimizeopt import vstring
 
 def get_integer_min(is_unsigned, byte_size):
     if is_unsigned:
@@ -382,12 +382,14 @@
 
     def optimize_STRLEN(self, op):
         self.emit_operation(op)
-        array = self.ensure_ptr_info_arg0(op)
+        self.make_nonnull_str(op.getarg(0), vstring.mode_string)
+        array = self.getptrinfo(op.getarg(0))
         self.get_box_replacement(op).set_forwarded(array.getlenbound())
 
     def optimize_UNICODELEN(self, op):
         self.emit_operation(op)
-        array = self.ensure_ptr_info_arg0(op)
+        self.make_nonnull_str(op.getarg(0), vstring.mode_unicode)
+        array = self.getptrinfo(op.getarg(0))
         self.get_box_replacement(op).set_forwarded(array.getlenbound())
 
     def optimize_STRGETITEM(self, op):
diff --git a/rpython/jit/metainterp/optimizeopt/vstring.py b/rpython/jit/metainterp/optimizeopt/vstring.py
--- a/rpython/jit/metainterp/optimizeopt/vstring.py
+++ b/rpython/jit/metainterp/optimizeopt/vstring.py
@@ -657,9 +657,9 @@
             if old_op is not None:
                 self.optimizer.make_equal_to(old_op, vvalue)
         else:
-            self.getvalue(op).ensure_nonnull()
+            self.make_nonnull_str(op, mode)
             self.emit_operation(op)
-            self.pure(mode.STRLEN, [op], op.getarg(0))
+            self.pure_from_args(mode.STRLEN, [op], op.getarg(0))
 
     def optimize_STRSETITEM(self, op):
         value = self.getptrinfo(op.getarg(0))
@@ -767,9 +767,8 @@
                     dst.setitem(index + dst_start, vresult)
                 else:
                     new_op = ResOperation(mode.STRSETITEM, [
-                        dst.force_box(self),
-                        ConstInt(index + dst_start),
-                        vresult.force_box(self),
+                        op.getarg(1), ConstInt(index + dst_start),
+                        vresult,
                     ])
                     self.emit_operation(new_op)
         else:
@@ -819,8 +818,10 @@
         # More generally, supporting non-constant but virtual cases is
         # not obvious, because of the exception UnicodeDecodeError that
         # can be raised by ll_str2unicode()
-        varg = self.getvalue(op.getarg(1))
-        s = varg.get_constant_string_spec(mode_string)
+        varg = self.getptrinfo(op.getarg(1))
+        s = None
+        if varg:
+            s = varg.get_constant_string_spec(self, mode_string)
         if s is None:
             return False
         try:
@@ -910,10 +911,14 @@
         l2box = None
         l1box = None
         if i2:
-            l2box = i2.getstrlen(arg1, self, mode, create_ops=False)
+            l2box = i2.getstrlen(arg2, self, mode, create_ops=False)
         if isinstance(l2box, ConstInt):
             if l2box.value == 0:
-                lengthbox = v1.getstrlen(self, mode, None)
+                # XXXX fix after merge to default, but this is not proven
+                #      just yet
+                self.make_nonnull_str(arg1, mode)
+                i1 = self.getptrinfo(arg1)
+                lengthbox = i1.getstrlen(arg1, self, mode)
                 seo = self.optimizer.send_extra_operation
                 op = self.replace_op_with(resultop, rop.INT_EQ,
                                           [lengthbox, CONST_0],


More information about the pypy-commit mailing list