Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: optresult
Changeset: r77764:e93151054fb5
Date: 2015-06-02 15:19 +0200
http://bitbucket.org/pypy/pypy/changeset/e93151054fb5/

Log:    basic fixes to vstring

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
@@ -543,12 +543,14 @@
         return opinfo
 
     def make_virtual_raw_memory(self, size, source_op):
+        raise Exception("unsupported")
         logops = self.optimizer.loop.logops
         vvalue = VRawBufferValue(self.optimizer.cpu, logops, size, source_op)
         self.make_equal_to(source_op, vvalue)
         return vvalue
 
     def make_virtual_raw_slice(self, rawbuffer_value, offset, source_op):
+        raise Exception("unsupported")
         vvalue = VRawSliceValue(rawbuffer_value, offset, source_op)
         self.make_equal_to(source_op, vvalue)
         return vvalue
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
@@ -49,10 +49,11 @@
 
 
 class StrPtrInfo(info.NonNullPtrInfo):
-    _attrs_ = ('length', 'lenbound', 'lgtop', 'mode')
+    _attrs_ = ('length', 'lenbound', 'lgtop', 'mode', '_cached_vinfo')
 
     lenbound = None
     lgtop = None
+    _cached_vinfo = None
 
     def __init__(self, mode, is_virtual=False, length=-1):
         self.length = length
@@ -191,6 +192,13 @@
             offsetbox = _int_add(string_optimizer, offsetbox, CONST_1)
         return offsetbox
 
+    def visitor_walk_recursive(self, instbox, visitor, optimizer):
+        visitor.register_virtual_fields(instbox, self._chars)
+
+    @specialize.argtype(1)
+    def visitor_dispatch_virtual_type(self, visitor):
+        return visitor.visit_vstrplain(self.mode is mode_unicode)
+
 class VStringSliceInfo(StrPtrInfo):
     def __init__(self, s, start, length, mode):
         self.s = s
@@ -276,6 +284,23 @@
                                              targetbox, offsetbox, mode)
         return offsetbox
 
+    def visitor_walk_recursive(self, instbox, visitor, optimizer):
+        # we don't store the lengthvalue in guards, because the
+        # guard-failed code starts with a regular STR_CONCAT again
+        leftbox = self.vleft
+        rightbox = self.vright
+        visitor.register_virtual_fields(instbox, [leftbox, rightbox])
+        leftinfo = optimizer.getptrinfo(leftbox)
+        rightinfo = optimizer.getptrinfo(rightbox)
+        if leftinfo and leftinfo.is_virtual():
+            leftinfo.visitor_walk_recursive(leftbox, visitor, optimizer)
+        if rightinfo and rightinfo.is_virtual():
+            rightinfo.visitor_walk_recursive(rightbox, visitor, optimizer)
+
+    @specialize.argtype(1)
+    def visitor_dispatch_virtual_type(self, visitor):
+        return visitor.visit_vstrconcat(self.mode is mode_unicode)
+
 # class __extend__(optimizer.OptValue):
 #     """New methods added to the base class OptValue for this file."""
 
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
@@ -684,7 +684,7 @@
             # if 'box' is directly a ConstPtr, bypass the heapcache completely
             resvalue = executor.execute(self.metainterp.cpu, self.metainterp,
                                       rop.GETFIELD_GC_PURE_F, fielddescr, box)
-            return ConstPtr(resvalue)
+            return ConstFloat(resvalue)
         return self._opimpl_getfield_gc_any_pureornot(
                 rop.GETFIELD_GC_PURE_F, box, fielddescr, 'f')
 
@@ -694,7 +694,7 @@
             # if 'box' is directly a ConstPtr, bypass the heapcache completely
             val = executor.execute(self.metainterp.cpu, self.metainterp,
                                       rop.GETFIELD_GC_PURE_R, fielddescr, box)
-            return ConstFloat(val)
+            return ConstPtr(val)
         return self._opimpl_getfield_gc_any_pureornot(
                 rop.GETFIELD_GC_PURE_R, box, fielddescr, 'r')
 
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -289,7 +289,7 @@
         self.snapshot_storage = snapshot_storage
         self.memo = memo
 
-    def make_virtual_info(self, descr, info, fieldnums):
+    def make_virtual_info(self, info, fieldnums):
         assert fieldnums is not None
         vinfo = info._cached_vinfo
         if vinfo is not None and vinfo.equals(fieldnums):
@@ -455,8 +455,7 @@
                 assert info.is_virtual()
                 fieldnums = [self._gettagged(box)
                              for box in fieldboxes]
-                descr = info.vdescr
-                vinfo = self.make_virtual_info(descr, info, fieldnums)
+                vinfo = self.make_virtual_info(info, fieldnums)
                 # if a new vinfo instance is made, we get the fieldnums list we
                 # pass in as an attribute. hackish.
                 if vinfo.fieldnums is not fieldnums:
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to