[pypy-svn] r72642 - pypy/branch/cpython-extension/pypy/module/cpyext
xoraxax at codespeak.net
xoraxax at codespeak.net
Tue Mar 23 18:09:32 CET 2010
Author: xoraxax
Date: Tue Mar 23 18:09:30 2010
New Revision: 72642
Modified:
pypy/branch/cpython-extension/pypy/module/cpyext/api.py
pypy/branch/cpython-extension/pypy/module/cpyext/methodobject.py
Log:
Move generic_cpy_call and from_ref_ex from methodsobject to api.
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/api.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/api.py (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/api.py Tue Mar 23 18:09:30 2010
@@ -393,3 +393,42 @@
initfunc.call(lltype.Void)
state.check_and_raise_exception()
+def generic_cpy_call(space, func, *args, **kwargs):
+ from pypy.module.cpyext.macros import Py_DECREF
+ decref_args = kwargs.pop("decref_args", True)
+ assert not kwargs
+ boxed_args = []
+ for arg in args: # XXX ur needed
+ if isinstance(arg, W_Root) or arg is None:
+ boxed_args.append(make_ref(space, arg))
+ else:
+ boxed_args.append(arg)
+ result = func(*boxed_args)
+ try:
+ FT = lltype.typeOf(func).TO
+ if FT.RESULT is not lltype.Void:
+ ret = from_ref_ex(space, result)
+ Py_DECREF(space, ret)
+ return ret
+ finally:
+ if decref_args:
+ for arg in args: # XXX ur needed
+ if arg is not None and isinstance(arg, W_Root):
+ Py_DECREF(space, arg)
+
+def from_ref_ex(space, result):
+ try:
+ ret = from_ref(space, result)
+ except NullPointerException:
+ state = space.fromcache(State)
+ state.check_and_raise_exception()
+ assert False, "NULL returned but no exception set"
+ except InvalidPointerException:
+ if not we_are_translated():
+ import sys
+ print >>sys.stderr, "Calling a C function return an invalid PyObject" \
+ " pointer."
+ raise
+ return ret
+
+
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/methodobject.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/methodobject.py (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/methodobject.py Tue Mar 23 18:09:30 2010
@@ -6,50 +6,12 @@
from pypy.interpreter.gateway import interp2app, unwrap_spec
from pypy.interpreter.function import BuiltinFunction, Method
from pypy.rpython.lltypesystem import rffi, lltype
-from pypy.module.cpyext.api import PyObject, from_ref, NullPointerException, \
- InvalidPointerException, make_ref
+from pypy.module.cpyext.api import PyObject, from_ref, \
+ make_ref, generic_cpy_call, from_ref_ex
from pypy.module.cpyext.state import State
-from pypy.module.cpyext.macros import Py_DECREF
from pypy.rlib.objectmodel import we_are_translated
-def from_ref_ex(space, result):
- try:
- ret = from_ref(space, result)
- except NullPointerException:
- state = space.fromcache(State)
- state.check_and_raise_exception()
- assert False, "NULL returned but no exception set"
- except InvalidPointerException:
- if not we_are_translated():
- import sys
- print >>sys.stderr, "Calling a C function return an invalid PyObject" \
- " pointer."
- raise
- return ret
-
-def generic_cpy_call(space, func, *args, **kwargs):
- decref_args = kwargs.pop("decref_args", True)
- assert not kwargs
- boxed_args = []
- for arg in args: # XXX ur needed
- if isinstance(arg, W_Root) or arg is None:
- boxed_args.append(make_ref(space, arg))
- else:
- boxed_args.append(arg)
- result = func(*boxed_args)
- try:
- FT = lltype.typeOf(func).TO
- if FT.RESULT is not lltype.Void:
- ret = from_ref_ex(space, result)
- Py_DECREF(space, ret)
- return ret
- finally:
- if decref_args:
- for arg in args: # XXX ur needed
- if arg is not None and isinstance(arg, W_Root):
- Py_DECREF(space, arg)
-
# XXX use Function as a parent class?
class W_PyCFunctionObject(Wrappable):
def __init__(self, space, ml, w_self):
More information about the Pypy-commit
mailing list