[pypy-commit] pypy optresult: implement more of vstring
fijal
noreply at buildbot.pypy.org
Wed Jun 3 13:50:40 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r77812:64dd6e2e7f33
Date: 2015-06-03 13:20 +0200
http://bitbucket.org/pypy/pypy/changeset/64dd6e2e7f33/
Log: implement more of vstring
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
@@ -384,13 +384,13 @@
self.emit_operation(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())
+ #self.get_box_replacement(op).set_forwarded(array.getlenbound())
def optimize_UNICODELEN(self, op):
self.emit_operation(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())
+ #self.get_box_replacement(op).set_forwarded(array.getlenbound())
def optimize_STRGETITEM(self, op):
self.emit_operation(op)
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
@@ -777,7 +777,12 @@
raise resume.TagOverflow
except resume.TagOverflow:
raise compile.giveup()
- descr.store_final_boxes(op, newboxes, self.metainterp_sd)
+ _newboxes = []
+ for box in newboxes:
+ if box is not None:
+ box = self.get_box_replacement(box)
+ _newboxes.append(box)
+ descr.store_final_boxes(op, _newboxes, self.metainterp_sd)
#
if op.getopnum() == rop.GUARD_VALUE:
if op.getarg(0).type == 'i':
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -681,9 +681,7 @@
if opinfo and opinfo.is_virtual():
fieldop = opinfo.getfield(op.getdescr())
if fieldop is None:
- raise Exception("I think this is plain illegal")
- xxx
- fieldvalue = self.optimizer.new_const(op.getdescr())
+ fieldop = self.optimizer.new_const(op.getdescr())
self.make_equal_to(op, fieldop)
else:
self.make_nonnull(op.getarg(0))
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
@@ -60,6 +60,7 @@
self.length = length
self._is_virtual = is_virtual
self.mode = mode
+ self.length = length
def getlenbound(self):
from rpython.jit.metainterp.optimizeopt import intutils
@@ -204,6 +205,8 @@
return visitor.visit_vstrplain(self.mode is mode_unicode)
class VStringSliceInfo(StrPtrInfo):
+ length = -1
+
def __init__(self, s, start, length, mode):
self.s = s
self.start = start
@@ -224,12 +227,12 @@
vstart = string_optimizer.getintbound(self.start)
vlength = string_optimizer.getintbound(self.lgtop)
if vstart.is_constant() and vlength.is_constant():
- raise Exception("implement me")
- s1 = self.vstr.get_constant_string_spec(mode)
+ vstr = string_optimizer.getptrinfo(self.s)
+ s1 = vstr.get_constant_string_spec(string_optimizer, mode)
if s1 is None:
return None
- start = self.vstart.box.getint()
- length = self.vlength.box.getint()
+ start = vstart.getint()
+ length = vlength.getint()
assert start >= 0
assert length >= 0
return s1[start : start + length]
@@ -238,6 +241,17 @@
def getstrlen(self, op, string_optimizer, mode, create_ops=True):
return self.lgtop
+ def visitor_walk_recursive(self, instbox, visitor, optimizer):
+ boxes = [self.s, self.start, self.lgtop]
+ visitor.register_virtual_fields(instbox, boxes)
+ opinfo = optimizer.getptrinfo(self.s)
+ if opinfo and opinfo.is_virtual():
+ opinfo.visitor_walk_recursive(visitor)
+
+ @specialize.argtype(1)
+ def visitor_dispatch_virtual_type(self, visitor):
+ return visitor.visit_vstrslice(self.mode is mode_unicode)
+
class VStringConcatInfo(StrPtrInfo):
#_attrs_ = ('mode', 'vleft', 'vright', '_is_virtual')
diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -1168,9 +1168,9 @@
if isinstance(box, Const):
return box # no promotion needed, already a Const
else:
- constbox = box.constbox()
+ constbox = ConstPtr(box.getref_base())
resbox = self.do_residual_call(funcbox, [box, constbox], descr, orgpc)
- promoted_box = resbox.constbox()
+ promoted_box = ConstInt(resbox.getint())
# This is GUARD_VALUE because GUARD_TRUE assumes the existance
# of a label when computing resumepc
self.metainterp.generate_guard(rop.GUARD_VALUE, resbox,
More information about the pypy-commit
mailing list