[pypy-svn] r74517 - pypy/trunk/pypy/module/cpyext
afa at codespeak.net
afa at codespeak.net
Sun May 16 21:40:13 CEST 2010
Author: afa
Date: Sun May 16 21:40:10 2010
New Revision: 74517
Modified:
pypy/trunk/pypy/module/cpyext/api.py
pypy/trunk/pypy/module/cpyext/funcobject.py
pypy/trunk/pypy/module/cpyext/methodobject.py
pypy/trunk/pypy/module/cpyext/pyobject.py
pypy/trunk/pypy/module/cpyext/slotdefs.py
pypy/trunk/pypy/module/cpyext/stringobject.py
pypy/trunk/pypy/module/cpyext/typeobject.py
pypy/trunk/pypy/module/cpyext/unicodeobject.py
Log:
Remove the "external" parameter of cpython_api,
provide make_static_function() to build function pointers.
also simplify 'dealloc' passed to make_typedescr().
Modified: pypy/trunk/pypy/module/cpyext/api.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/api.py (original)
+++ pypy/trunk/pypy/module/cpyext/api.py Sun May 16 21:40:10 2010
@@ -139,7 +139,27 @@
wrapper.relax_sig_check = True
return wrapper
-def cpython_api(argtypes, restype, error=_NOT_SPECIFIED, external=True):
+def make_static_function(argtypes, restype, error=_NOT_SPECIFIED):
+ """
+ Helper to build a static function pointer.
+ """
+ if error is _NOT_SPECIFIED:
+ if restype is PyObject:
+ error = lltype.nullptr(PyObject.TO)
+ elif restype is lltype.Void:
+ error = CANNOT_FAIL
+ if type(error) is int:
+ error = rffi.cast(restype, error)
+
+ def decorate(func):
+ func_name = func.func_name
+ api_function = ApiFunction(argtypes, restype, func, error)
+ func.api_func = api_function
+ FUNCTIONS_STATIC[func_name] = api_function
+ return func
+ return decorate
+
+def cpython_api(argtypes, restype, error=_NOT_SPECIFIED):
"""
Declares a function to be exported.
- `argtypes`, `restype` are lltypes and describe the function signature.
@@ -229,6 +249,8 @@
finally:
for arg in to_decref:
Py_DecRef(space, arg)
+ unwrapper = func_with_new_name(unwrapper,
+ "unwrapper_%s" % (func_name,))
unwrapper.func = func
unwrapper.api_func = api_function
unwrapper._always_inline_ = True
@@ -236,10 +258,7 @@
unwrapper_catch = make_unwrapper(True)
unwrapper_raise = make_unwrapper(False)
- if external:
- FUNCTIONS[func_name] = api_function
- else:
- FUNCTIONS_STATIC[func_name] = api_function
+ FUNCTIONS[func_name] = api_function
INTERPLEVEL_API[func_name] = unwrapper_catch # used in tests
return unwrapper_raise # used in 'normal' RPython code.
return decorate
Modified: pypy/trunk/pypy/module/cpyext/funcobject.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/funcobject.py (original)
+++ pypy/trunk/pypy/module/cpyext/funcobject.py Sun May 16 21:40:10 2010
@@ -27,7 +27,6 @@
assert isinstance(w_obj, Function)
py_func.c_func_name = make_ref(space, space.wrap(w_obj.name))
- at cpython_api([PyObject], lltype.Void, external=False)
def function_dealloc(space, py_obj):
py_func = rffi.cast(PyFunctionObject, py_obj)
Py_DecRef(space, py_func.c_func_name)
Modified: pypy/trunk/pypy/module/cpyext/methodobject.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/methodobject.py (original)
+++ pypy/trunk/pypy/module/cpyext/methodobject.py Sun May 16 21:40:10 2010
@@ -49,7 +49,6 @@
py_func.c_m_ml = w_obj.ml
py_func.c_m_self = make_ref(space, w_obj.w_self)
- at cpython_api([PyObject], lltype.Void, external=False)
def cfunction_dealloc(space, py_obj):
py_func = rffi.cast(PyCFunctionObject, py_obj)
Py_DecRef(space, py_func.c_m_self)
Modified: pypy/trunk/pypy/module/cpyext/pyobject.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/pyobject.py (original)
+++ pypy/trunk/pypy/module/cpyext/pyobject.py Sun May 16 21:40:10 2010
@@ -2,9 +2,9 @@
from pypy.interpreter.baseobjspace import W_Root, SpaceCache
from pypy.rpython.lltypesystem import rffi, lltype
-from pypy.module.cpyext.api import cpython_api, bootstrap_function, \
- PyObject, PyObjectP, ADDR, CANNOT_FAIL, \
- Py_TPFLAGS_HEAPTYPE, PyTypeObjectPtr
+from pypy.module.cpyext.api import (
+ cpython_api, make_static_function, bootstrap_function, PyObject, PyObjectP,
+ ADDR, CANNOT_FAIL, Py_TPFLAGS_HEAPTYPE, PyTypeObjectPtr)
from pypy.module.cpyext.state import State
from pypy.objspace.std.typeobject import W_TypeObject
from pypy.rlib.objectmodel import specialize, we_are_translated
@@ -36,7 +36,7 @@
alloc : allocate and basic initialization of a raw PyObject
attach : Function called to tie a raw structure to a pypy object
realize : Function called to create a pypy object from a raw struct
- dealloc : a cpython_api(external=False), similar to PyObject_dealloc
+ dealloc : Function called to free a structure
"""
tp_basestruct = kw.pop('basestruct', PyObject.TO)
@@ -46,22 +46,19 @@
tp_dealloc = kw.pop('dealloc', None)
assert not kw, "Extra arguments to make_typedescr"
- null_dealloc = lltype.nullptr(lltype.FuncType([PyObject], lltype.Void))
+ if not tp_dealloc:
+ from pypy.module.cpyext.typeobject import subtype_dealloc
+ tp_dealloc = subtype_dealloc
+ tp_dealloc = make_static_function([PyObject], lltype.Void)(tp_dealloc)
class CpyTypedescr(BaseCpyTypedescr):
basestruct = tp_basestruct
realize = tp_realize
def get_dealloc(self, space):
- if tp_dealloc:
- return llhelper(
- tp_dealloc.api_func.functype,
- tp_dealloc.api_func.get_wrapper(space))
- else:
- from pypy.module.cpyext.typeobject import subtype_dealloc
- return llhelper(
- subtype_dealloc.api_func.functype,
- subtype_dealloc.api_func.get_wrapper(space))
+ return llhelper(
+ tp_dealloc.api_func.functype,
+ tp_dealloc.api_func.get_wrapper(space))
def allocate(self, space, w_type, itemcount=0):
# similar to PyType_GenericAlloc?
@@ -124,7 +121,7 @@
from pypy.module.cpyext.object import PyObject_dealloc
# typedescr for the 'object' type
make_typedescr(space.w_object.instancetypedef,
- dealloc=PyObject_dealloc)
+ dealloc=PyObject_dealloc.func)
# almost all types, which should better inherit from object.
make_typedescr(None)
Modified: pypy/trunk/pypy/module/cpyext/slotdefs.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/slotdefs.py (original)
+++ pypy/trunk/pypy/module/cpyext/slotdefs.py Sun May 16 21:40:10 2010
@@ -106,7 +106,8 @@
raise OperationError(space.w_StopIteration, space.w_None)
return w_res
- at cpython_api([PyTypeObjectPtr, PyObject, PyObject], PyObject, external=True)
+# XXX why is it a "cpython_api"?
+ at cpython_api([PyTypeObjectPtr, PyObject, PyObject], PyObject)
def slot_tp_new(space, type, w_args, w_kwds):
from pypy.module.cpyext.tupleobject import PyTuple_Check
pyo = rffi.cast(PyObject, type)
Modified: pypy/trunk/pypy/module/cpyext/stringobject.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/stringobject.py (original)
+++ pypy/trunk/pypy/module/cpyext/stringobject.py Sun May 16 21:40:10 2010
@@ -102,7 +102,6 @@
track_reference(space, py_obj, w_obj)
return w_obj
- at cpython_api([PyObject], lltype.Void, external=False)
def string_dealloc(space, py_obj):
"""Frees allocated PyStringObject resources.
"""
Modified: pypy/trunk/pypy/module/cpyext/typeobject.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/typeobject.py (original)
+++ pypy/trunk/pypy/module/cpyext/typeobject.py Sun May 16 21:40:10 2010
@@ -11,8 +11,8 @@
from pypy.objspace.std.typetype import _precheck_for_new
from pypy.interpreter.typedef import TypeDef, GetSetProperty
from pypy.module.cpyext.api import (
- cpython_api, cpython_struct, bootstrap_function, Py_ssize_t,
- generic_cpy_call, Py_TPFLAGS_READY, Py_TPFLAGS_READYING,
+ cpython_api, make_static_function, cpython_struct, bootstrap_function,
+ Py_ssize_t, generic_cpy_call, Py_TPFLAGS_READY, Py_TPFLAGS_READYING,
Py_TPFLAGS_HEAPTYPE, METH_VARARGS, METH_KEYWORDS, CANNOT_FAIL,
PyBufferProcs, build_type_checkers)
from pypy.module.cpyext.pyobject import (
@@ -155,7 +155,7 @@
if pto.c_tp_new:
add_tp_new_wrapper(space, dict_w, pto)
- at cpython_api([PyObject, PyObject, PyObject], PyObject, external=False)
+ at make_static_function([PyObject, PyObject, PyObject], PyObject)
def tp_new_wrapper(space, self, w_args, w_kwds):
tp_new = rffi.cast(PyTypeObjectPtr, self).c_tp_new
@@ -405,7 +405,6 @@
track_reference(space, py_tuple, space.w_tuple, replace=True)
- at cpython_api([PyObject], lltype.Void, external=False)
def subtype_dealloc(space, obj):
pto = obj.c_ob_type
base = pto
@@ -433,15 +432,14 @@
lifeline_dict.set(w_obj, PyOLifeline(space, py_obj))
return py_obj
- at cpython_api([PyObject, rffi.INTP], lltype.Signed, external=False,
- error=CANNOT_FAIL)
+ at make_static_function([PyObject, rffi.INTP], lltype.Signed, error=CANNOT_FAIL)
def str_segcount(space, w_obj, ref):
if ref:
ref[0] = rffi.cast(rffi.INT, space.int_w(space.len(w_obj)))
return 1
- at cpython_api([PyObject, lltype.Signed, rffi.VOIDPP], lltype.Signed,
- external=False, error=-1)
+ at make_static_function([PyObject, lltype.Signed, rffi.VOIDPP], lltype.Signed,
+ error=-1)
def str_getreadbuffer(space, w_str, segment, ref):
from pypy.module.cpyext.stringobject import PyString_AsString
if segment != 0:
@@ -461,7 +459,6 @@
str_getreadbuffer.api_func.get_wrapper(space))
pto.c_tp_as_buffer = c_buf
- at cpython_api([PyObject], lltype.Void, external=False)
def type_dealloc(space, obj):
obj_pto = rffi.cast(PyTypeObjectPtr, obj)
type_pto = obj.c_ob_type
Modified: pypy/trunk/pypy/module/cpyext/unicodeobject.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/unicodeobject.py (original)
+++ pypy/trunk/pypy/module/cpyext/unicodeobject.py Sun May 16 21:40:10 2010
@@ -42,7 +42,6 @@
py_unicode.c_size = len(space.unicode_w(w_obj))
py_unicode.c_buffer = lltype.nullptr(rffi.CWCHARP.TO)
- at cpython_api([PyObject], lltype.Void, external=False)
def unicode_dealloc(space, py_obj):
py_unicode = rffi.cast(PyUnicodeObject, py_obj)
if py_unicode.c_buffer:
More information about the Pypy-commit
mailing list