我正在研究CPython的代码库。
我想知道在哪里可以找到math_sin
中mathmethods
表中出现的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},
我在哪里可以找到这个函数的定义?
math_sin
是通过FUNC1
macro定义的:
FUNC1(sin, sin, 0,
"sin($module, x, /)\n--\n\n"
"Return the sine of x (measured in radians).")
#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
。