[pypy-svn] r77873 - in pypy/trunk/pypy/jit/codewriter: . test
arigo at codespeak.net
arigo at codespeak.net
Wed Oct 13 15:35:34 CEST 2010
Author: arigo
Date: Wed Oct 13 15:35:33 2010
New Revision: 77873
Modified:
pypy/trunk/pypy/jit/codewriter/jtransform.py
pypy/trunk/pypy/jit/codewriter/test/test_jtransform.py
Log:
Test and fix: optimized unicode equality functions that take a single
char as argument were incorrectly typed like the string equality function,
and took a lltype.Char instead of lltype.UniChar.
Modified: pypy/trunk/pypy/jit/codewriter/jtransform.py
==============================================================================
--- pypy/trunk/pypy/jit/codewriter/jtransform.py (original)
+++ pypy/trunk/pypy/jit/codewriter/jtransform.py Wed Oct 13 15:35:33 2010
@@ -1057,28 +1057,32 @@
[c_func] + [varoftype(T) for T in argtypes],
varoftype(resulttype))
calldescr = self.callcontrol.getcalldescr(op, oopspecindex)
- func = heaptracker.adr2int(
- llmemory.cast_ptr_to_adr(c_func.value))
+ if isinstance(c_func.value, str): # in tests only
+ func = c_func.value
+ else:
+ func = heaptracker.adr2int(
+ llmemory.cast_ptr_to_adr(c_func.value))
_callinfo_for_oopspec[oopspecindex] = calldescr, func
def _handle_stroruni_call(self, op, oopspec_name, args):
- if args[0].concretetype.TO == rstr.STR:
+ SoU = args[0].concretetype # Ptr(STR) or Ptr(UNICODE)
+ if SoU.TO == rstr.STR:
dict = {"stroruni.concat": EffectInfo.OS_STR_CONCAT,
"stroruni.slice": EffectInfo.OS_STR_SLICE,
"stroruni.equal": EffectInfo.OS_STR_EQUAL,
}
- elif args[0].concretetype.TO == rstr.UNICODE:
+ CHR = lltype.Char
+ elif SoU.TO == rstr.UNICODE:
dict = {"stroruni.concat": EffectInfo.OS_UNI_CONCAT,
"stroruni.slice": EffectInfo.OS_UNI_SLICE,
"stroruni.equal": EffectInfo.OS_UNI_EQUAL,
}
+ CHR = lltype.UniChar
else:
assert 0, "args[0].concretetype must be STR or UNICODE"
#
if oopspec_name == "stroruni.equal":
- SoU = args[0].concretetype # Ptr(STR) or Ptr(UNICODE)
for otherindex, othername, argtypes, resulttype in [
-
(EffectInfo.OS_STREQ_SLICE_CHECKNULL,
"str.eq_slice_checknull",
[SoU, lltype.Signed, lltype.Signed, SoU],
@@ -1089,7 +1093,7 @@
lltype.Signed),
(EffectInfo.OS_STREQ_SLICE_CHAR,
"str.eq_slice_char",
- [SoU, lltype.Signed, lltype.Signed, lltype.Char],
+ [SoU, lltype.Signed, lltype.Signed, CHR],
lltype.Signed),
(EffectInfo.OS_STREQ_NONNULL,
"str.eq_nonnull",
@@ -1097,11 +1101,11 @@
lltype.Signed),
(EffectInfo.OS_STREQ_NONNULL_CHAR,
"str.eq_nonnull_char",
- [SoU, lltype.Char],
+ [SoU, CHR],
lltype.Signed),
(EffectInfo.OS_STREQ_CHECKNULL_CHAR,
"str.eq_checknull_char",
- [SoU, lltype.Char],
+ [SoU, CHR],
lltype.Signed),
(EffectInfo.OS_STREQ_LENGTHOK,
"str.eq_lengthok",
Modified: pypy/trunk/pypy/jit/codewriter/test/test_jtransform.py
==============================================================================
--- pypy/trunk/pypy/jit/codewriter/test/test_jtransform.py (original)
+++ pypy/trunk/pypy/jit/codewriter/test/test_jtransform.py Wed Oct 13 15:35:33 2010
@@ -79,6 +79,30 @@
return 'builtin'
def getcalldescr(self, op, oopspecindex=None):
assert oopspecindex is not None # in this test
+ EI = effectinfo.EffectInfo
+ if oopspecindex != EI.OS_ARRAYCOPY:
+ PSTR = lltype.Ptr(rstr.STR)
+ PUNICODE = lltype.Ptr(rstr.UNICODE)
+ INT = lltype.Signed
+ UNICHAR = lltype.UniChar
+ argtypes = {
+ EI.OS_STR2UNICODE:([PSTR], PUNICODE),
+ EI.OS_STR_CONCAT: ([PSTR, PSTR], PSTR),
+ EI.OS_STR_SLICE: ([PSTR, INT, INT], PSTR),
+ EI.OS_UNI_CONCAT: ([PUNICODE, PUNICODE], PUNICODE),
+ EI.OS_UNI_SLICE: ([PUNICODE, INT, INT], PUNICODE),
+ EI.OS_UNI_EQUAL: ([PUNICODE, PUNICODE], lltype.Bool),
+ EI.OS_UNIEQ_SLICE_CHECKNULL:([PUNICODE, INT, INT, PUNICODE], INT),
+ EI.OS_UNIEQ_SLICE_NONNULL: ([PUNICODE, INT, INT, PUNICODE], INT),
+ EI.OS_UNIEQ_SLICE_CHAR: ([PUNICODE, INT, INT, UNICHAR], INT),
+ EI.OS_UNIEQ_NONNULL: ([PUNICODE, PUNICODE], INT),
+ EI.OS_UNIEQ_NONNULL_CHAR: ([PUNICODE, UNICHAR], INT),
+ EI.OS_UNIEQ_CHECKNULL_CHAR: ([PUNICODE, UNICHAR], INT),
+ EI.OS_UNIEQ_LENGTHOK: ([PUNICODE, PUNICODE], INT),
+ }
+ argtypes = argtypes[oopspecindex]
+ assert argtypes[0] == [v.concretetype for v in op.args[1:]]
+ assert argtypes[1] == op.result.concretetype
return 'calldescr-%d' % oopspecindex
def calldescr_canraise(self, calldescr):
return False
@@ -785,6 +809,28 @@
assert op1.args[2] == ListOfKind('ref', [v1])
assert op1.result == v2
+def test_unicode_eq_checknull_char():
+ # test that the oopspec is present and correctly transformed
+ PUNICODE = lltype.Ptr(rstr.UNICODE)
+ FUNC = lltype.FuncType([PUNICODE, PUNICODE], lltype.Bool)
+ func = lltype.functionptr(FUNC, 'll_streq',
+ _callable=rstr.LLHelpers.ll_streq)
+ v1 = varoftype(PUNICODE)
+ v2 = varoftype(PUNICODE)
+ v3 = varoftype(lltype.Bool)
+ op = SpaceOperation('direct_call', [const(func), v1, v2], v3)
+ tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
+ op1 = tr.rewrite_operation(op)
+ assert op1.opname == 'residual_call_r_i'
+ assert op1.args[0].value == func
+ assert op1.args[1] == 'calldescr-%d' % effectinfo.EffectInfo.OS_UNI_EQUAL
+ assert op1.args[2] == ListOfKind('ref', [v1, v2])
+ assert op1.result == v3
+ # test that the OS_UNIEQ_* functions are registered
+ cifo = effectinfo._callinfo_for_oopspec
+ assert effectinfo.EffectInfo.OS_UNIEQ_SLICE_NONNULL in cifo
+ assert effectinfo.EffectInfo.OS_UNIEQ_CHECKNULL_CHAR in cifo
+
def test_list_ll_arraycopy():
from pypy.rlib.rgc import ll_arraycopy
LIST = lltype.GcArray(lltype.Signed)
More information about the Pypy-commit
mailing list