[pypy-commit] pypy jit-get-errno: Add the oopspecs

arigo noreply at buildbot.pypy.org
Thu Jun 26 12:38:38 CEST 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: jit-get-errno
Changeset: r72240:029578092143
Date: 2014-06-26 11:18 +0200
http://bitbucket.org/pypy/pypy/changeset/029578092143/

Log:	Add the oopspecs

diff --git a/rpython/jit/codewriter/effectinfo.py b/rpython/jit/codewriter/effectinfo.py
--- a/rpython/jit/codewriter/effectinfo.py
+++ b/rpython/jit/codewriter/effectinfo.py
@@ -23,6 +23,8 @@
     OS_SHRINK_ARRAY             = 3    # rgc.ll_shrink_array
     OS_DICT_LOOKUP              = 4    # ll_dict_lookup
     OS_THREADLOCALREF_GET       = 5    # llop.threadlocalref_get
+    OS_GET_ERRNO                = 6    # rposix.get_errno
+    OS_SET_ERRNO                = 7    # rposix.set_errno
     #
     OS_STR_CONCAT               = 22   # "stroruni.concat"
     OS_STR_SLICE                = 23   # "stroruni.slice"
diff --git a/rpython/jit/codewriter/jtransform.py b/rpython/jit/codewriter/jtransform.py
--- a/rpython/jit/codewriter/jtransform.py
+++ b/rpython/jit/codewriter/jtransform.py
@@ -438,6 +438,8 @@
         elif oopspec_name.endswith('dict.lookup'):
             # also ordereddict.lookup
             prepare = self._handle_dict_lookup_call
+        elif oopspec_name.startswith('rposix.'):
+            prepare = self._handle_rposix_call
         else:
             prepare = self.prepare_builtin_call
         try:
@@ -1898,6 +1900,16 @@
         else:
             raise NotImplementedError(oopspec_name)
 
+    def _handle_rposix_call(self, op, oopspec_name, args):
+        if oopspec_name == 'rposix.get_errno':
+            return self._handle_oopspec_call(op, args, EffectInfo.OS_GET_ERRNO,
+                                             EffectInfo.EF_CANNOT_RAISE)
+        elif oopspec_name == 'rposix.set_errno':
+            return self._handle_oopspec_call(op, args, EffectInfo.OS_SET_ERRNO,
+                                             EffectInfo.EF_CANNOT_RAISE)
+        else:
+            raise NotImplementedError(oopspec_name)
+
     def rewrite_op_jit_force_quasi_immutable(self, op):
         v_inst, c_fieldname = op.args
         descr1 = self.cpu.fielddescrof(v_inst.concretetype.TO,
diff --git a/rpython/jit/codewriter/test/test_jtransform.py b/rpython/jit/codewriter/test/test_jtransform.py
--- a/rpython/jit/codewriter/test/test_jtransform.py
+++ b/rpython/jit/codewriter/test/test_jtransform.py
@@ -148,6 +148,8 @@
              EI.OS_RAW_MALLOC_VARSIZE_CHAR: ([INT], ARRAYPTR),
              EI.OS_RAW_FREE:             ([ARRAYPTR], lltype.Void),
              EI.OS_THREADLOCALREF_GET:   ([], rclass.OBJECTPTR),
+             EI.OS_GET_ERRNO:            ([], INT),
+             EI.OS_SET_ERRNO:            ([INT], lltype.Void),
             }
             argtypes = argtypes[oopspecindex]
             assert argtypes[0] == [v.concretetype for v in op.args[1:]]
@@ -156,7 +158,9 @@
                 assert extraeffect == EI.EF_ELIDABLE_CAN_RAISE
             elif oopspecindex == EI.OS_RAW_MALLOC_VARSIZE_CHAR:
                 assert extraeffect == EI.EF_CAN_RAISE
-            elif oopspecindex == EI.OS_RAW_FREE:
+            elif oopspecindex in (EI.OS_RAW_FREE,
+                                  EI.OS_GET_ERRNO,
+                                  EI.OS_SET_ERRNO):
                 assert extraeffect == EI.EF_CANNOT_RAISE
             elif oopspecindex == EI.OS_THREADLOCALREF_GET:
                 assert extraeffect == EI.EF_LOOPINVARIANT
@@ -1320,6 +1324,38 @@
     assert op0.args[2] == 'calldescr-%d' % OS_THREADLOCALREF_GET
     assert op0.result == v2
 
+def test_get_errno():
+    # test that the oopspec is present and correctly transformed
+    from rpython.rlib import rposix
+    FUNC = lltype.FuncType([], lltype.Signed)
+    func = lltype.functionptr(FUNC, 'get_errno', _callable=rposix.get_errno)
+    v3 = varoftype(lltype.Signed)
+    op = SpaceOperation('direct_call', [const(func)], 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] == ListOfKind('ref', [])
+    assert op1.args[2] == 'calldescr-%d' % effectinfo.EffectInfo.OS_GET_ERRNO
+    assert op1.result == v3
+
+def test_set_errno():
+    # test that the oopspec is present and correctly transformed
+    from rpython.rlib import rposix
+    FUNC = lltype.FuncType([lltype.Signed], lltype.Void)
+    func = lltype.functionptr(FUNC, 'set_errno', _callable=rposix.set_errno)
+    v1 = varoftype(lltype.Signed)
+    v3 = varoftype(lltype.Void)
+    op = SpaceOperation('direct_call', [const(func), v1], v3)
+    tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
+    op1 = tr.rewrite_operation(op)
+    assert op1.opname == 'residual_call_ir_v'
+    assert op1.args[0].value == func
+    assert op1.args[1] == ListOfKind('int', [v1])
+    assert op1.args[2] == ListOfKind('ref', [])
+    assert op1.args[3] == 'calldescr-%d' % effectinfo.EffectInfo.OS_SET_ERRNO
+    assert op1.result == v3
+
 def test_unknown_operation():
     op = SpaceOperation('foobar', [], varoftype(lltype.Void))
     tr = Transformer()
diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -98,9 +98,11 @@
 # the default wrapper for set_errno is not suitable for use in critical places
 # like around GIL handling logic, so we provide our own wrappers.
 
+ at jit.oopspec("rposix.get_errno()")
 def get_errno():
     return intmask(_get_errno())
 
+ at jit.oopspec("rposix.set_errno(errno)")
 def set_errno(errno):
     _set_errno(rffi.cast(INT, errno))
 


More information about the pypy-commit mailing list