[pypy-svn] r73253 - pypy/branch/cpython-extension/pypy/module/cpyext
benjamin at codespeak.net
benjamin at codespeak.net
Thu Apr 1 19:43:29 CEST 2010
Author: benjamin
Date: Thu Apr 1 19:43:27 2010
New Revision: 73253
Modified:
pypy/branch/cpython-extension/pypy/module/cpyext/api.py
pypy/branch/cpython-extension/pypy/module/cpyext/boolobject.py
pypy/branch/cpython-extension/pypy/module/cpyext/dictobject.py
pypy/branch/cpython-extension/pypy/module/cpyext/intobject.py
pypy/branch/cpython-extension/pypy/module/cpyext/listobject.py
pypy/branch/cpython-extension/pypy/module/cpyext/modsupport.py
pypy/branch/cpython-extension/pypy/module/cpyext/stringobject.py
pypy/branch/cpython-extension/pypy/module/cpyext/tupleobject.py
Log:
generalize general_check and general_check_exact into a build_type_checkers function
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 Thu Apr 1 19:43:27 2010
@@ -114,7 +114,8 @@
wrapper.relax_sig_check = True
return wrapper
-def cpython_api(argtypes, restype, borrowed=False, error=_NOT_SPECIFIED, external=True):
+def cpython_api(argtypes, restype, borrowed=False, error=_NOT_SPECIFIED,
+ external=True, name=None):
if error is _NOT_SPECIFIED:
if restype is PyObject:
error = lltype.nullptr(PyObject.TO)
@@ -126,6 +127,10 @@
def decorate(func):
api_function = ApiFunction(argtypes, restype, func, borrowed, error)
func.api_func = api_function
+ if name is None:
+ func_name = func.func_name
+ else:
+ func_name = name
if error is _NOT_SPECIFIED:
raise ValueError("function %s has no return value for exceptions"
@@ -134,7 +139,7 @@
names = api_function.argnames
types_names_enum_ui = unrolling_iterable(enumerate(
zip(api_function.argtypes,
- [name.startswith("w_") for name in names])))
+ [tp_name.startswith("w_") for tp_name in names])))
@specialize.ll()
def unwrapper(space, *args):
@@ -188,10 +193,10 @@
unwrapper_catch = make_unwrapper(True)
unwrapper_raise = make_unwrapper(False)
if external:
- FUNCTIONS[func.func_name] = api_function
+ FUNCTIONS[func_name] = api_function
else:
- FUNCTIONS_STATIC[func.func_name] = api_function
- INTERPLEVEL_API[func.func_name] = unwrapper_catch # used in tests
+ FUNCTIONS_STATIC[func_name] = api_function
+ INTERPLEVEL_API[func_name] = unwrapper_catch # used in tests
return unwrapper_raise # used in 'normal' RPython code.
return decorate
@@ -255,14 +260,23 @@
if name in TYPES:
TYPES[name].become(TYPE)
-
-def general_check(space, w_obj, w_type):
- w_obj_type = space.type(w_obj)
- return int(space.is_w(w_obj_type, w_type) or space.is_true(space.issubtype(w_obj_type, w_type)))
-
-def general_check_exact(space, w_obj, w_type):
- w_obj_type = space.type(w_obj)
- return int(space.is_w(w_obj_type, w_type))
+def build_type_checkers(type_name, on_space=None):
+ if on_space is None:
+ on_space = "w_" + type_name.lower()
+ check_name = "Py" + type_name + "_Check"
+ @cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL, name=check_name)
+ def check(space, w_obj):
+ w_obj_type = space.type(w_obj)
+ w_type = getattr(space, on_space)
+ return int(space.is_w(w_obj_type, w_type) or
+ space.is_true(space.issubtype(w_obj_type, w_type)))
+ @cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL,
+ name=check_name + "Exact")
+ def check_exact(space, w_obj):
+ w_obj_type = space.type(w_obj)
+ w_type = getattr(space, on_space)
+ return int(space.is_w(w_obj_type, w_type))
+ return check, check_exact
# Make the wrapper for the cases (1) and (2)
def make_wrapper(space, callable):
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/boolobject.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/boolobject.py (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/boolobject.py Thu Apr 1 19:43:27 2010
@@ -1,11 +1,9 @@
from pypy.rpython.lltypesystem import rffi, lltype
-from pypy.module.cpyext.api import cpython_api, PyObject, CANNOT_FAIL
-from pypy.module.cpyext.api import general_check
+from pypy.module.cpyext.api import (cpython_api, PyObject, CANNOT_FAIL,
+ build_type_checkers)
- at cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
-def PyBool_Check(space, w_obj):
- w_type = space.w_bool
- return general_check(space, w_obj, w_type)
+# Inheriting from bool isn't actually possible.
+PyBool_Check = build_type_checkers("Bool")[1]
@cpython_api([rffi.LONG], PyObject)
def PyBool_FromLong(space, value):
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/dictobject.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/dictobject.py (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/dictobject.py Thu Apr 1 19:43:27 2010
@@ -1,6 +1,5 @@
from pypy.rpython.lltypesystem import rffi, lltype
-from pypy.module.cpyext.api import cpython_api, CANNOT_FAIL
-from pypy.module.cpyext.api import general_check, general_check_exact
+from pypy.module.cpyext.api import cpython_api, CANNOT_FAIL, build_type_checkers
from pypy.module.cpyext.pyobject import PyObject, register_container
from pypy.module.cpyext.pyerrors import PyErr_BadInternalCall
from pypy.interpreter.error import OperationError
@@ -9,15 +8,7 @@
def PyDict_New(space):
return space.newdict()
- at cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
-def PyDict_Check(space, w_obj):
- w_type = space.w_dict
- return general_check(space, w_obj, w_type)
-
- at cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
-def PyDict_CheckExact(space, w_obj):
- w_type = space.w_dict
- return general_check_exact(space, w_obj, w_type)
+PyDict_Check, PyDict_CheckExact = build_type_checkers("Dict")
@cpython_api([PyObject, PyObject], PyObject)
def PyDict_GetItem(space, w_dict, w_key):
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/intobject.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/intobject.py (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/intobject.py Thu Apr 1 19:43:27 2010
@@ -1,15 +1,10 @@
from pypy.rpython.lltypesystem import rffi, lltype
-from pypy.module.cpyext.api import cpython_api, PyObject, CANNOT_FAIL
-from pypy.module.cpyext.api import general_check
+from pypy.module.cpyext.api import (cpython_api, PyObject, CANNOT_FAIL,
+ build_type_checkers)
- at cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
-def PyInt_Check(space, w_obj):
- """Return true if o is of type PyInt_Type or a subtype of
- PyInt_Type.
-
- Allowed subtypes to be accepted."""
- return general_check(space, w_obj, space.w_int)
+
+PyInt_Check, PyInt_CheckExact = build_type_checkers("Int")
@cpython_api([lltype.Signed], PyObject)
def PyInt_FromLong(space, ival):
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/listobject.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/listobject.py (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/listobject.py Thu Apr 1 19:43:27 2010
@@ -1,28 +1,14 @@
from pypy.rpython.lltypesystem import rffi, lltype
-from pypy.module.cpyext.api import cpython_api, CANNOT_FAIL, Py_ssize_t
-from pypy.module.cpyext.api import general_check, general_check_exact
+from pypy.module.cpyext.api import (cpython_api, CANNOT_FAIL, Py_ssize_t,
+ build_type_checkers)
from pypy.module.cpyext.pyerrors import PyErr_BadInternalCall
from pypy.module.cpyext.pyobject import Py_DecRef, PyObject
from pypy.objspace.std.listobject import W_ListObject
from pypy.interpreter.error import OperationError
- at cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
-def PyList_Check(space, w_obj):
- """Return true if p is a list object or an instance of a subtype of the list
- type.
-
- Allowed subtypes to be accepted."""
- w_type = space.w_list
- return general_check(space, w_obj, w_type)
-
- at cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
-def PyList_CheckExact(space, w_obj):
- """Return true if p is a list object, but not an instance of a subtype of
- the list type.
- """
- w_type = space.w_list
- return general_check_exact(space, w_obj, w_type)
+
+PyList_Check, PyList_CheckExact = build_type_checkers("List")
@cpython_api([Py_ssize_t], PyObject)
def PyList_New(space, len):
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/modsupport.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/modsupport.py (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/modsupport.py Thu Apr 1 19:43:27 2010
@@ -1,6 +1,6 @@
from pypy.rpython.lltypesystem import rffi, lltype
from pypy.module.cpyext.api import cpython_api, cpython_struct, \
- METH_STATIC, METH_CLASS, METH_COEXIST, general_check, CANNOT_FAIL
+ METH_STATIC, METH_CLASS, METH_COEXIST, CANNOT_FAIL
from pypy.module.cpyext.pyobject import PyObject, register_container
from pypy.interpreter.module import Module
from pypy.module.cpyext.methodobject import PyCFunction_NewEx, PyDescr_NewMethod
@@ -77,7 +77,9 @@
@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
def PyModule_Check(space, w_obj):
w_type = space.gettypeobject(Module.typedef)
- return general_check(space, w_obj, w_type)
+ w_obj_type = space.type(w_obj)
+ return int(space.is_w(w_type, w_obj_type) or
+ space.issubtype(w_obj_type, w_type))
@cpython_api([PyObject], PyObject, borrowed=True)
def PyModule_GetDict(space, w_mod):
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/stringobject.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/stringobject.py (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/stringobject.py Thu Apr 1 19:43:27 2010
@@ -1,17 +1,11 @@
from pypy.rpython.lltypesystem import rffi, lltype
-from pypy.module.cpyext.api import cpython_api, PyVarObjectFields, \
- PyStringObject, Py_ssize_t, cpython_struct, CANNOT_FAIL, general_check
+from pypy.module.cpyext.api import (cpython_api, PyVarObjectFields,
+ PyStringObject, Py_ssize_t, cpython_struct,
+ CANNOT_FAIL, build_type_checkers)
from pypy.module.cpyext.pyobject import PyObject, make_ref, from_ref
- at cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
-def PyString_Check(space, w_obj):
- """Return true if the object o is a string object or an instance of a subtype of
- the string type.
-
- Allowed subtypes to be accepted."""
- w_type = space.w_str
- return general_check(space, w_obj, w_type)
+PyString_Check, PyString_CheckExact = build_type_checkers("String", "w_str")
@cpython_api([rffi.CCHARP, Py_ssize_t], PyStringObject, error=lltype.nullptr(PyStringObject.TO))
def PyString_FromStringAndSize(space, char_p, length):
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/tupleobject.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/tupleobject.py (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/tupleobject.py Thu Apr 1 19:43:27 2010
@@ -1,19 +1,12 @@
from pypy.rpython.lltypesystem import rffi, lltype
-from pypy.module.cpyext.api import cpython_api, Py_ssize_t, \
- general_check, CANNOT_FAIL, general_check_exact
+from pypy.module.cpyext.api import (cpython_api, Py_ssize_t, CANNOT_FAIL,
+ build_type_checkers)
from pypy.module.cpyext.pyobject import PyObject, Py_DecRef, register_container
from pypy.module.cpyext.pyerrors import PyErr_BadInternalCall
from pypy.objspace.std.tupleobject import W_TupleObject
- at cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
-def PyTuple_Check(space, w_obj):
- w_type = space.w_tuple
- return general_check(space, w_obj, w_type)
-
- at cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
-def PyTuple_CheckExact(space, w_obj):
- w_type = space.w_tuple
- return general_check_exact(space, w_obj, w_type)
+
+PyTuple_Check, PyTuple_CheckExact = build_type_checkers("Tuple")
@cpython_api([Py_ssize_t], PyObject)
def PyTuple_New(space, size):
More information about the Pypy-commit
mailing list