[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