Author: Maciej Fijalkowski <fij...@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], _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit