[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