[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