CPython源代码中math_sin函数的定义?

问题描述 投票:4回答:1

我正在研究CPython的代码库。

我想知道在哪里可以找到math_sinmathmethods表中出现的mathmodule.c函数的定义:

{"sin",             math_sin,       METH_O,         math_sin_doc}

grep "math_sin" -wr主文件夹中执行cpython只会返回:

Modules/mathmodule.c:    {"sin",             math_sin,       METH_O,         math_sin_doc},

我在哪里可以找到这个函数的定义?

python cpython python-internals
1个回答
9
投票

math_sin是通过FUNC1 macro定义的:

FUNC1(sin, sin, 0,
      "sin($module, x, /)\n--\n\n"
      "Return the sine of x (measured in radians).")

其中FUNC1 is defined as

#define FUNC1(funcname, func, can_overflow, docstring)                  \
    static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
        return math_1(args, func, can_overflow);                            \
    }\
    PyDoc_STRVAR(math_##funcname##_doc, docstring);

所以预处理器将其扩展为:

    static PyObject * math_sin(PyObject *self, PyObject *args) {
        return math_1(args, sin, 0);
    }
    PyDoc_STRVAR(math_sin_doc, "sin($module, x, /)\n--\n\n"
      "Return the sine of x (measured in radians).");

(但随后全部在一条线上,并且PyDoc_STRVAR宏也被扩展了)

所以math_sin(module, args)基本上是对math_1(args, sin, 0)的调用,而math_1(args, sin, 0)调用math_1_to_whatever(args, sin, PyFloat_FromDouble, 0),它负责验证Python float被传入,将其转换为C double,调用sin(arg_as_double),根据需要引发异常或将sin()的双返回值包装为PyFloat_FromDouble函数由math_1()传入,然后将结果返回给调用者。

sin()这里是the double sin(double x) function defined in POSIX math.h

原则上,您可以预处理整个Python源代码树并将输出转储到新目录中;以下确实假设你已经成功构建了python二进制文件,因为它用于为gcc提取必要的包含标志:

find . -type d -exec mkdir -p /tmp/processed/{} \;
(export FLAGS=$(./python.exe -m sysconfig | grep PY_CORE_CFLAGS | cut -d\" -f2) && \
 find . -type f \( -name '*.c' -o -name '*.h' \) -exec gcc -E $FLAGS {} -o /tmp/processed/{} \;)

然后math_sin将出现在/tmp/preprocessed/Modules/mathmodule.c

或者您可以告诉编译器使用.i标志将预处理器输出保存到-save-temps文件:

make clean && make CC="gcc -save-temps"

你会在make_sin找到Modules/mathmodule.i

© www.soinside.com 2019 - 2024. All rights reserved.