Author: Antonio Cuni <[email protected]>
Branch: cpyext-avoid-roundtrip
Changeset: r92676:c84be963f330
Date: 2017-10-09 16:08 +0200
http://bitbucket.org/pypy/pypy/changeset/c84be963f330/
Log: (antocuni, arigo): use make_ref+decref instead of as_pyobj to
convert arguments inside generic_cpy_call: the plan is to add a
fast-path to make_ref to allocate int objects more quickly, without
passing through the whole .allocate() dance
diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py
--- a/pypy/module/cpyext/api.py
+++ b/pypy/module/cpyext/api.py
@@ -1677,7 +1677,7 @@
@specialize.memo()
def make_generic_cpy_call(FT, expect_null):
- from pypy.module.cpyext.pyobject import is_pyobj, as_pyobj
+ from pypy.module.cpyext.pyobject import is_pyobj, make_ref, decref
from pypy.module.cpyext.pyobject import get_w_obj_and_decref
from pypy.module.cpyext.pyerrors import PyErr_Occurred
unrolling_arg_types = unrolling_iterable(enumerate(FT.ARGS))
@@ -1705,15 +1705,17 @@
@specialize.ll()
def generic_cpy_call(space, func, *args):
boxed_args = ()
- keepalives = ()
+ to_decref = ()
assert len(args) == len(FT.ARGS)
for i, ARG in unrolling_arg_types:
arg = args[i]
+ _pyobj = None
if is_PyObject(ARG):
if not is_pyobj(arg):
- keepalives += (arg,)
- arg = as_pyobj(space, arg)
+ arg = make_ref(space, arg)
+ _pyobj = arg
boxed_args += (arg,)
+ to_decref += (_pyobj,)
# see "Handling of the GIL" above
tid = rthread.get_ident()
@@ -1727,7 +1729,11 @@
finally:
assert cpyext_glob_tid_ptr[0] == tid
cpyext_glob_tid_ptr[0] = 0
- keepalive_until_here(*keepalives)
+ for i, ARG in unrolling_arg_types:
+ # note that this loop is nicely unrolled statically by RPython
+ _pyobj = to_decref[i]
+ if _pyobj is not None:
+ decref(space, _pyobj)
if is_PyObject(RESULT_TYPE):
if not is_pyobj(result):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit