Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 94 additions & 0 deletions Doc/c-api/structures.rst
Original file line number Diff line number Diff line change
Expand Up @@ -447,6 +447,25 @@ definition with the same method name.
slot. This is helpful because calls to PyCFunctions are optimized more
than wrapper object calls.


.. c:var:: PyTypeObject PyCMethod_Type

The type object corresponding to Python C method objects. This is
available as :class:`types.BuiltinMethodType` in the Python layer.


.. c:function:: int PyCMethod_Check(PyObject *op)

Return true if *op* is an instance of the :c:type:`PyCMethod_Type` type
or a subtype of it. This function always succeeds.


.. c:function:: int PyCMethod_CheckExact(PyObject *op)

This is the same as :c:func:`PyCMethod_Check`, but does not account for
subtypes.


.. c:function:: PyObject * PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls)

Turn *ml* into a Python :term:`callable` object.
Expand All @@ -472,6 +491,24 @@ definition with the same method name.
.. versionadded:: 3.9


.. c:var:: PyTypeObject PyCFunction_Type

The type object corresponding to Python C function objects. This is
available as :class:`types.BuiltinFunctionType` in the Python layer.


.. c:function:: int PyCFunction_Check(PyObject *op)

Return true if *op* is an instance of the :c:type:`PyCFunction_Type` type
or a subtype of it. This function always succeeds.


.. c:function:: int PyCFunction_CheckExact(PyObject *op)

This is the same as :c:func:`PyCFunction_Check`, but does not account for
subtypes.


.. c:function:: PyObject * PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module)

Equivalent to ``PyCMethod_New(ml, self, module, NULL)``.
Expand All @@ -482,6 +519,63 @@ definition with the same method name.
Equivalent to ``PyCMethod_New(ml, self, NULL, NULL)``.


.. c:function:: int PyCFunction_GetFlags(PyObject *func)

Get the function's flags on *func* as they were passed to
:c:member:`~PyMethodDef.ml_flags`.

If *func* is not a C function object, this fails with a
:class:`SystemError`.
Comment on lines +527 to +528
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This one is a regular exception right? so no need to mention it. What I wanted to know is whether passing func == NULL produced a SIGSEGV or a Python exception. Since passing NULL is "allowed" (but raises an exception) it's fine to remove the mention to SystemError.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My advice is: check other Check functions to see how we formulate this. I don't want to be too pedantic but I want to be consistent in general.


This function returns the function's flags on success, and ``-1`` with an
exception set on failure.


.. c:function:: int PyCFunction_GET_FLAGS(PyObject *func)

This is the same as :c:func:`PyCFunction_GetFlags`, but without error
or type checking.


.. c:function:: PyCFunction PyCFunction_GetFunction(PyObject *func)

Get the function pointer on *func* as it was passed to
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please indicate whether passing a non-function object sets an exception or causes a crash (to make the distinction with PyCFunction_GET_FUNCTION)

:c:member:`~PyMethodDef.ml_meth`.

If *func* is not a C function object, this fails with a
:class:`SystemError`.

This function returns the function pointer on success, and ``NULL`` with an
exception set on failure.



.. c:function:: int PyCFunction_GET_FUNCTION(PyObject *func)

This is the same as :c:func:`PyCFunction_GetFunction`, but without error
or type checking.


.. c:function:: PyObject *PyCFunction_GetSelf(PyObject *func)

Get the "self" object on *func*. This is the object that would be passed
to the first argument of a :c:type:`PyCFunction`. For C function objects
created through a :c:type:`PyMethodDef` on a :c:type:`PyModuleDef`, this
is the resulting module object.

If *func* is not a C function object, this fails with a
:class:`SystemError`.

This function returns a :term:`borrowed reference` to the "self" object
on success, and ``NULL`` with an exception set on failure.


.. c:function:: PyObject *PyCFunction_GET_SELF(PyObject *func)

This is the same as :c:func:`PyCFunction_GetSelf`, but without error or
type checking.


Accessing attributes of extension types
---------------------------------------

Expand Down
Loading