[pypy-svn] r77278 - in pypy/branch/jit-str/pypy: jit/codewriter jit/metainterp/optimizeopt jit/metainterp/test rpython/lltypesystem

arigo at codespeak.net arigo at codespeak.net
Wed Sep 22 17:58:54 CEST 2010


Author: arigo
Date: Wed Sep 22 17:58:52 2010
New Revision: 77278

Modified:
   pypy/branch/jit-str/pypy/jit/codewriter/effectinfo.py
   pypy/branch/jit-str/pypy/jit/metainterp/optimizeopt/virtualize.py
   pypy/branch/jit-str/pypy/jit/metainterp/test/test_string.py
   pypy/branch/jit-str/pypy/rpython/lltypesystem/rlist.py
   pypy/branch/jit-str/pypy/rpython/lltypesystem/rstr.py
Log:
Correct a few typos.  Implement str_concat, but not forcing of them (that's the next test).


Modified: pypy/branch/jit-str/pypy/jit/codewriter/effectinfo.py
==============================================================================
--- pypy/branch/jit-str/pypy/jit/codewriter/effectinfo.py	(original)
+++ pypy/branch/jit-str/pypy/jit/codewriter/effectinfo.py	Wed Sep 22 17:58:52 2010
@@ -89,7 +89,8 @@
     return EffectInfo(readonly_descrs_fields,
                       write_descrs_fields,
                       write_descrs_arrays,
-                      extraeffect)
+                      extraeffect,
+                      oopspecindex)
 
 def consider_struct(TYPE, fieldname):
     if fieldType(TYPE, fieldname) is lltype.Void:

Modified: pypy/branch/jit-str/pypy/jit/metainterp/optimizeopt/virtualize.py
==============================================================================
--- pypy/branch/jit-str/pypy/jit/metainterp/optimizeopt/virtualize.py	(original)
+++ pypy/branch/jit-str/pypy/jit/metainterp/optimizeopt/virtualize.py	Wed Sep 22 17:58:52 2010
@@ -195,7 +195,9 @@
     def _make_virtual(self, modifier):
         return modifier.make_varray(self.arraydescr)
 
+
 class VStringPlainValue(AbstractVirtualValue):
+    """A string built with newstr(const)."""
 
     def __init__(self, optimizer, size, keybox, source_op=None):
         AbstractVirtualValue.__init__(self, optimizer, keybox, source_op)
@@ -224,14 +226,38 @@
 
     def get_args_for_fail(self, modifier):
         if self.box is None and not modifier.already_seen_virtual(self.keybox):
-            charboxes = [box.get_key_box() for box in self._chars]
+            charboxes = [value.get_key_box() for value in self._chars]
             modifier.register_virtual_fields(self.keybox, charboxes)
-            for box in self._chars:
-                box.get_args_for_fail(modifier)
+            for value in self._chars:
+                value.get_args_for_fail(modifier)
 
     def _make_virtual(self, modifier):
         return modifier.make_vstrconcat()
 
+
+class VStringConcatValue(AbstractVirtualValue):
+    """The concatenation of two other strings."""
+
+    def __init__(self, optimizer, keybox):
+        AbstractVirtualValue.__init__(self, optimizer, keybox)
+        self._left = None
+        self._right = None
+
+    def _really_force(self):
+        xxx
+
+    def get_args_for_fail(self, modifier):
+        if self.box is None and not modifier.already_seen_virtual(self.keybox):
+            leftbox = self._left.get_key_box()
+            rightbox = self._right.get_key_box()
+            modifier.register_virtual_fields(self.keybox, [leftbox, rightbox])
+            self._left.get_args_for_fail(modifier)
+            self._right.get_args_for_fail(modifier)
+
+    def _make_virtual(self, modifier):
+        return modifier.make_vstrconcat()
+
+
 class __extend__(SpecNode):
     def setup_virtual_node(self, optimizer, box, newinputargs):
         raise NotImplementedError
@@ -325,6 +351,11 @@
         self.make_equal_to(box, vvalue)
         return vvalue
 
+    def make_vstring_concat(self, box):
+        vvalue = VStringConcatValue(self.optimizer, box)
+        self.make_equal_to(box, vvalue)
+        return vvalue
+
     def optimize_JUMP(self, op):
         orgop = self.optimizer.loop.operations[-1]
         exitargs = []
@@ -520,7 +551,7 @@
 
     def optimize_STRGETITEM(self, op):
         value = self.getvalue(op.args[0])
-        if value.is_virtual() and isinstance(value, VStringPlainValue):
+        if isinstance(value, VStringPlainValue):  # even if no longer virtual
             indexbox = self.get_constant_box(op.args[1])
             if indexbox is not None:
                 charvalue = value.getitem(indexbox.getint())
@@ -531,12 +562,18 @@
 
     def optimize_STRLEN(self, op):
         value = self.getvalue(op.args[0])
-        if value.is_virtual():
+        if isinstance(value, VStringPlainValue):  # even if no longer virtual
             self.make_constant_int(op.result, value.getlength())
         else:
             value.ensure_nonnull()
             self.emit_operation(op)
 
+    def opt_call_oopspec_STR_CONCAT(self, op):
+        value = self.make_vstring_concat(op.result)
+        value._left = self.getvalue(op.args[1])
+        value._right = self.getvalue(op.args[2])
+        return True
+
     def propagate_forward(self, op):
         opnum = op.opnum
         for value, func in optimize_ops:

Modified: pypy/branch/jit-str/pypy/jit/metainterp/test/test_string.py
==============================================================================
--- pypy/branch/jit-str/pypy/jit/metainterp/test/test_string.py	(original)
+++ pypy/branch/jit-str/pypy/jit/metainterp/test/test_string.py	Wed Sep 22 17:58:52 2010
@@ -150,6 +150,7 @@
                 return total
             res = self.meta_interp(f, [6])
             assert res == sum(map(ord, 'sgn9OE!'))
+            py.test.xfail()
             self.check_loops(call=0, call_pure=0,
                              newstr=0, strgetitem=1, strsetitem=0, strlen=0)
 

Modified: pypy/branch/jit-str/pypy/rpython/lltypesystem/rlist.py
==============================================================================
--- pypy/branch/jit-str/pypy/rpython/lltypesystem/rlist.py	(original)
+++ pypy/branch/jit-str/pypy/rpython/lltypesystem/rlist.py	Wed Sep 22 17:58:52 2010
@@ -159,7 +159,6 @@
         if 'item_repr' not in self.__dict__:
             self.external_item_repr, self.item_repr = externalvsinternal(self.rtyper, self._item_repr_computer())
         if isinstance(self.LIST, GcForwardReference):
-            ITEM = self.item_repr.lowleveltype
             ITEMARRAY = self.get_itemarray_lowleveltype()
             self.LIST.become(ITEMARRAY)
 

Modified: pypy/branch/jit-str/pypy/rpython/lltypesystem/rstr.py
==============================================================================
--- pypy/branch/jit-str/pypy/rpython/lltypesystem/rstr.py	(original)
+++ pypy/branch/jit-str/pypy/rpython/lltypesystem/rstr.py	Wed Sep 22 17:58:52 2010
@@ -4,7 +4,7 @@
 from pypy.rlib.objectmodel import malloc_zero_filled, we_are_translated
 from pypy.rlib.objectmodel import _hash_string, enforceargs
 from pypy.rlib.debug import ll_assert
-from pypy.rlib.jit import purefunction
+from pypy.rlib.jit import purefunction, we_are_jitted
 from pypy.rpython.robject import PyObjRepr, pyobj_repr
 from pypy.rpython.rmodel import inputconst, IntegerRepr
 from pypy.rpython.rstr import AbstractStringRepr,AbstractCharRepr,\
@@ -318,7 +318,6 @@
     def ll_strfasthash(s):
         return s.hash     # assumes that the hash is already computed
 
-    @purefunction
     def ll_strconcat(s1, s2):
         len1 = len(s1.chars)
         len2 = len(s2.chars)
@@ -326,7 +325,7 @@
         s1.copy_contents(s1, newstr, 0, 0, len1)
         s1.copy_contents(s2, newstr, 0, len1, len2)
         return newstr
-    #ll_strconcat.oopspec = 'stroruni.concat(s1, s2)'
+    ll_strconcat.oopspec = 'stroruni.concat(s1, s2)'
 
     @purefunction
     def ll_strip(s, ch, left, right):
@@ -704,19 +703,26 @@
         return newstr
     ll_stringslice_startonly.oopspec = 'stroruni.slice_startonly(s1, start)'
 
-    def ll_stringslice_startstop(s1, start, stop):
-        if stop >= len(s1.chars):
-            if start == 0:
-                return s1
-            stop = len(s1.chars)
+    def _ll_stringslice_startstop(s1, start, stop):
         newstr = s1.malloc(stop - start)
         assert start >= 0
         lgt = stop - start
         assert lgt >= 0
         s1.copy_contents(s1, newstr, start, 0, lgt)
         return newstr
-    ll_stringslice_startstop.oopspec = ('stroruni.slice_startstop(s1, '
-                                            'start, stop)')
+    _ll_stringslice_startstop.oopspec = ('stroruni.slice_startstop(s1, '
+                                             'start, stop)')
+
+    def ll_stringslice_startstop(s1, start, stop):
+        if we_are_jitted():
+            if stop > len(s1.chars):
+                stop = len(s1.chars)
+        else:
+            if stop >= len(s1.chars):
+                if start == 0:
+                    return s1
+                stop = len(s1.chars)
+        return LLHelpers._ll_stringslice_startstop(s1, start, stop)
 
     def ll_stringslice_minusone(s1):
         newlen = len(s1.chars) - 1



More information about the Pypy-commit mailing list