Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r77813:259ba1933861
Date: 2015-06-03 13:36 +0200
http://bitbucket.org/pypy/pypy/changeset/259ba1933861/
Log: finish vstring, I hope
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py
b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -866,9 +866,9 @@
def optimize_UNICODEGETITEM(self, op):
indexb = self.getintbound(op.getarg(1))
if indexb.is_constant():
- raise Exception("implement me")
- arrayvalue = self.getvalue(op.getarg(0))
- arrayvalue.make_len_gt(MODE_UNICODE, op.getdescr(),
indexvalue.box.getint())
+ #arrayvalue = self.getvalue(op.getarg(0))
+ #arrayvalue.make_len_gt(MODE_UNICODE, op.getdescr(),
indexvalue.box.getint())
+ pass
self.optimize_default(op)
# These are typically removed already by OptRewrite, but it can be
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
@@ -149,6 +149,10 @@
def setitem(self, index, op, cf=None, optheap=None):
self._chars[index] = op
+ def shrink(self, length):
+ assert length >= 0
+ del self._chars[length:]
+
def setup_slice(self, longerlist, start, stop):
assert 0 <= start <= stop <= len(longerlist)
self._chars = longerlist[start:stop]
@@ -532,12 +536,14 @@
self.pure_from_args(mode.STRLEN, [op], op.getarg(0))
def optimize_STRSETITEM(self, op):
- value = self.getptrinfo(op.getarg(0))
- assert not value.is_constant() # strsetitem(ConstPtr) never makes sense
- if value and value.is_virtual():
+ opinfo = self.getptrinfo(op.getarg(0))
+ if opinfo:
+ assert not opinfo.is_constant()
+ # strsetitem(ConstPtr) never makes sense
+ if opinfo and opinfo.is_virtual():
indexbox = self.get_constant_box(op.getarg(1))
if indexbox is not None:
- value.setitem(indexbox.getint(),
+ opinfo.setitem(indexbox.getint(),
self.get_box_replacement(op.getarg(2)))
return
self.make_nonnull(op.getarg(0))
@@ -864,37 +870,37 @@
return False
def opt_call_stroruni_STR_CMP(self, op, mode):
- raise Exception('implement me')
- v1 = self.getvalue(op.getarg(1))
- v2 = self.getvalue(op.getarg(2))
- l1box = v1.getstrlen(None, mode, None)
- l2box = v2.getstrlen(None, mode, None)
+ i1 = self.getptrinfo(op.getarg(1))
+ i2 = self.getptrinfo(op.getarg(2))
+ if not i1 or not i2:
+ return False
+ l1box = i1.getstrlen(None, self, mode, False)
+ l2box = i2.getstrlen(None, self, mode, False)
if (l1box is not None and l2box is not None and
isinstance(l1box, ConstInt) and
isinstance(l2box, ConstInt) and
- l1box.value == l2box.value == 1):
+ l1box.getint() == l2box.getint() == 1):
# comparing two single chars
- vchar1 = self.strgetitem(v1, optimizer.CVAL_ZERO, mode)
- vchar2 = self.strgetitem(v2, optimizer.CVAL_ZERO, mode)
+ char1 = self.strgetitem(None, op.getarg(1), optimizer.CONST_0,
mode)
+ char2 = self.strgetitem(None, op.getarg(2), optimizer.CONST_0,
mode)
seo = self.optimizer.send_extra_operation
- op = self.replace_op_with(op, rop.INT_SUB,
- [vchar1.force_box(self),
- vchar2.force_box(self)])
+ op = self.replace_op_with(op, rop.INT_SUB, [char1, char2],
+ descr=DONT_CHANGE)
seo(op)
return True
return False
def opt_call_SHRINK_ARRAY(self, op):
- raise Exception('implement me')
- v1 = self.getvalue(op.getarg(1))
- v2 = self.getvalue(op.getarg(2))
+ i1 = self.getptrinfo(op.getarg(1))
+ i2 = self.getintbound(op.getarg(2))
# If the index is constant, if the argument is virtual (we only support
# VStringPlainValue for now) we can optimize away the call.
- if v2.is_constant() and v1.is_virtual() and isinstance(v1,
VStringPlainValue):
- length = v2.box.getint()
- v1.shrink(length)
+ if (i2 and i2.is_constant() and i1 and i1.is_virtual() and
+ isinstance(i1, VStringPlainInfo)):
+ length = i2.getint()
+ i1.shrink(length)
self.last_emitted_operation = REMOVED
- self.make_equal_to(op, v1)
+ self.make_equal_to(op, op.getarg(1))
return True
return False
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit