[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