[pypy-svn] pypy default: Add the flag EF_PURE to some more OS_xxx functions.
arigo
commits-noreply at bitbucket.org
Sat Feb 26 23:04:16 CET 2011
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r42309:52e1f41fe018
Date: 2011-02-26 23:03 +0100
http://bitbucket.org/pypy/pypy/changeset/52e1f41fe018/
Log: Add the flag EF_PURE to some more OS_xxx functions.
diff --git a/pypy/jit/codewriter/jtransform.py b/pypy/jit/codewriter/jtransform.py
--- a/pypy/jit/codewriter/jtransform.py
+++ b/pypy/jit/codewriter/jtransform.py
@@ -1243,7 +1243,7 @@
return op1
def _register_extra_helper(self, oopspecindex, oopspec_name,
- argtypes, resulttype):
+ argtypes, resulttype, effectinfo):
# a bit hackish
if self.callcontrol.callinfocollection.has_oopspec(oopspecindex):
return
@@ -1253,7 +1253,8 @@
op = SpaceOperation('pseudo_call_cannot_raise',
[c_func] + [varoftype(T) for T in argtypes],
varoftype(resulttype))
- calldescr = self.callcontrol.getcalldescr(op, oopspecindex)
+ calldescr = self.callcontrol.getcalldescr(op, oopspecindex,
+ effectinfo)
if isinstance(c_func.value, str): # in tests only
func = c_func.value
else:
@@ -1312,11 +1313,15 @@
if args[0].concretetype.TO == rstr.UNICODE:
otherindex += EffectInfo._OS_offset_uni
self._register_extra_helper(otherindex, othername,
- argtypes, resulttype)
+ argtypes, resulttype,
+ EffectInfo.EF_PURE)
#
- return self._handle_oopspec_call(op, args, dict[oopspec_name])
+ return self._handle_oopspec_call(op, args, dict[oopspec_name],
+ EffectInfo.EF_PURE)
def _handle_str2unicode_call(self, op, oopspec_name, args):
+ # ll_str2unicode is not EF_PURE, because it can raise
+ # UnicodeDecodeError...
return self._handle_oopspec_call(op, args, EffectInfo.OS_STR2UNICODE)
# ----------
diff --git a/pypy/jit/codewriter/test/test_jtransform.py b/pypy/jit/codewriter/test/test_jtransform.py
--- a/pypy/jit/codewriter/test/test_jtransform.py
+++ b/pypy/jit/codewriter/test/test_jtransform.py
@@ -116,6 +116,10 @@
argtypes = argtypes[oopspecindex]
assert argtypes[0] == [v.concretetype for v in op.args[1:]]
assert argtypes[1] == op.result.concretetype
+ if oopspecindex == EI.OS_STR2UNICODE:
+ assert extraeffect == None # not pure, can raise!
+ else:
+ assert extraeffect == EI.EF_PURE
return 'calldescr-%d' % oopspecindex
def calldescr_canraise(self, calldescr):
return False
More information about the Pypy-commit
mailing list