[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