[pypy-svn] r77298 - in pypy/branch/jit-str/pypy/jit: codewriter metainterp metainterp/test

arigo at codespeak.net arigo at codespeak.net
Thu Sep 23 14:11:15 CEST 2010


Author: arigo
Date: Thu Sep 23 14:11:13 2010
New Revision: 77298

Modified:
   pypy/branch/jit-str/pypy/jit/codewriter/effectinfo.py
   pypy/branch/jit-str/pypy/jit/metainterp/resume.py
   pypy/branch/jit-str/pypy/jit/metainterp/test/test_string.py
Log:
Fixes.


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	Thu Sep 23 14:11:13 2010
@@ -126,15 +126,24 @@
 
 _callinfo_for_oopspec = {}
 
-def callinfo_for_oopspec_memo(oopspecindex):
+def _callinfo_for_oopspec_memo(oopspecindex):
     return _callinfo_for_oopspec.get(oopspecindex, (None, 0))
-callinfo_for_oopspec_memo._annspecialcase_ = 'specialize:memo'
+_callinfo_for_oopspec_memo._annspecialcase_ = 'specialize:memo'
 
 def callinfo_for_oopspec(oopspecindex):
     """A memo function that returns the calldescr and the function
     address (as an int) of one of the OS_XYZ functions defined above.
     Don't use this if there might be several implementations of the same
     OS_XYZ specialized by type, e.g. OS_ARRAYCOPY."""
-    calldescr, func = callinfo_for_oopspec_memo(oopspecindex)
+    calldescr, func = _callinfo_for_oopspec_memo(oopspecindex)
     assert calldescr is not None
     return calldescr, func
+
+def funcptr_for_oopspec(oopspecindex):
+    """A memo function that returns a pointer to the function described
+    by OS_XYZ (as a real low-level function pointer)."""
+    from pypy.jit.codewriter import heaptracker
+    _, func_as_int = _callinfo_for_oopspec.get(oopspecindex, (None, 0))
+    funcadr = heaptracker.int2adr(func_as_int)
+    return funcadr.ptr
+funcptr_for_oopspec._annspecialcase_ = 'specialize:memo'

Modified: pypy/branch/jit-str/pypy/jit/metainterp/resume.py
==============================================================================
--- pypy/branch/jit-str/pypy/jit/metainterp/resume.py	(original)
+++ pypy/branch/jit-str/pypy/jit/metainterp/resume.py	Thu Sep 23 14:11:13 2010
@@ -5,7 +5,8 @@
 from pypy.jit.metainterp.resoperation import rop
 from pypy.jit.metainterp import jitprof
 from pypy.jit.codewriter.effectinfo import EffectInfo, callinfo_for_oopspec
-from pypy.rpython.lltypesystem import lltype, llmemory, rffi
+from pypy.jit.codewriter.effectinfo import funcptr_for_oopspec
+from pypy.rpython.lltypesystem import lltype, llmemory, rffi, rstr
 from pypy.rlib import rarithmetic
 from pypy.rlib.objectmodel import we_are_translated, specialize
 from pypy.rlib.debug import have_debug_prints
@@ -678,9 +679,8 @@
         calldescr, func = callinfo_for_oopspec(EffectInfo.OS_STR_CONCAT)
         str1box = self.decode_box(str1num, REF)
         str2box = self.decode_box(str2num, REF)
-        return self.metainterp.execute_and_record(rop.CALL, calldescr,
-                                                  ConstInt(func),
-                                                  str1box, str2box)
+        return self.metainterp.execute_and_record_varargs(
+            rop.CALL, [ConstInt(func), str1box, str2box], calldescr)
 
     def setfield(self, descr, structbox, fieldnum):
         if descr.is_pointer_field():
@@ -902,6 +902,15 @@
     def allocate_string(self, length):
         return self.cpu.bh_newstr(length)
 
+    def concat_strings(self, str1num, str2num):
+        str1 = self.decode_ref(str1num)
+        str2 = self.decode_ref(str2num)
+        str1 = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), str1)
+        str2 = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), str2)
+        funcptr = funcptr_for_oopspec(EffectInfo.OS_STR_CONCAT)
+        result = funcptr(str1, str2)
+        return lltype.cast_opaque_ptr(llmemory.GCREF, result)
+
     def setfield(self, descr, struct, fieldnum):
         if descr.is_pointer_field():
             newvalue = self.decode_ref(fieldnum)

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	Thu Sep 23 14:11:13 2010
@@ -155,16 +155,17 @@
                              newstr=0, strgetitem=1, strsetitem=0, strlen=0)
 
     def test_strconcat_pure(self):
-        for dochr in [chr, ]: #unichr]:
+        for somestr in ["abc", ]: #u"def"]:
             jitdriver = JitDriver(greens = [], reds = ['m', 'n'])
             @dont_look_inside
             def escape(x):
                 pass
+            mylist = [somestr+str(i) for i in range(10)]
             def f(n, m):
                 while m >= 0:
                     jitdriver.can_enter_jit(m=m, n=n)
                     jitdriver.jit_merge_point(m=m, n=n)
-                    s = dochr(n) + dochr(m)
+                    s = mylist[n] + mylist[m]
                     if m > 100:
                         escape(s)
                     m -= 1
@@ -174,6 +175,46 @@
                              newunicode=0, unicodesetitem=0,
                              call=0, call_pure=0)
 
+    def test_strconcat_escape(self):
+        for somestr in ["abc", ]: #u"def"]:
+            jitdriver = JitDriver(greens = [], reds = ['m', 'n'])
+            @dont_look_inside
+            def escape(x):
+                pass
+            mylist = [somestr+str(i) for i in range(10)]
+            def f(n, m):
+                while m >= 0:
+                    jitdriver.can_enter_jit(m=m, n=n)
+                    jitdriver.jit_merge_point(m=m, n=n)
+                    s = mylist[n] + mylist[m]
+                    escape(s)
+                    m -= 1
+                return 42
+            self.meta_interp(f, [6, 7])
+            self.check_loops(newstr=0, strsetitem=0,
+                             newunicode=0, unicodesetitem=0,
+                             call=2, call_pure=0)   # ll_strconcat, escape
+
+    def test_strconcat_guard_fail(self):
+        for somestr in ["abc", ]: #u"def"]:
+            jitdriver = JitDriver(greens = [], reds = ['m', 'n'])
+            @dont_look_inside
+            def escape(x):
+                pass
+            mylist = [somestr+str(i) for i in range(12)]
+            def f(n, m):
+                while m >= 0:
+                    jitdriver.can_enter_jit(m=m, n=n)
+                    jitdriver.jit_merge_point(m=m, n=n)
+                    s = mylist[n] + mylist[m]
+                    if m & 1:
+                        escape(s)
+                    m -= 1
+                return 42
+            self.meta_interp(f, [6, 10])
+            self.check_loops(newstr=0, strsetitem=0,
+                             newunicode=0, unicodesetitem=0)
+
 
 class TestOOtype(StringTests, OOJitMixin):
     CALL = "oosend"



More information about the Pypy-commit mailing list