我正在研究CPython的代码库。
我想知道在哪里可以找到math_sin
的{{1}}表中出现的mathmethods
函数的定义:
mathmodule.c
在主{"sin", math_sin, METH_O, math_sin_doc}
文件夹中进行grep "math_sin" -wr
只会返回:
cpython
在哪里可以找到此函数的定义?
答案 0 :(得分:9)
WHERE tblMovies.title = ?
是通过FUNC1
macro定义的:
math_sin
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_to_whatever(args, sin, PyFloat_FromDouble, 0)
,它负责验证是否传入了Python浮点数,并将其转换为C double,调用math_1(args, sin, 0)
,根据需要引发异常,或使用sin(arg_as_double)
传递的sin()
函数包装PyFloat_FromDouble
的double返回值,然后再将结果返回给调用方。< / p>
math_1()
是the double sin(double x)
function defined in POSIX math.h
。
原则上,您可以预处理整个Python源代码树并将输出转储到新目录中;以下假设您已经成功构建了sin()
二进制文件,因为它已用于提取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
。