假设我正在编写CPython C扩展,并且在其中要调用一些用Python编写的函数。
互联网建议涉及从C分机呼叫PyObject *PyObject_Call()
。是这样吗?
如果是的话,我想了解VM内调用调用的Python函数的机制。我已经花了一些时间浏览PyObject *PyObject_Call()
的源代码,但无法完全掌握正在发生的事情,因此将对您的指导有所帮助。
以下哪一项是正确的?
VM推送一个新的堆栈帧,等等-但是然后等待下一个eval循环迭代自然地将控制权切换到调用的Python函数
VM调用新字节码解释循环以便立即解释所调用的函数
还有什么?
PyObject_Call
是适合使用的功能。 (还有其他功能,有时可能更方便,但是PyObject_Call
是通用的。)您可能很难理解它的作用,因为它只是一个调度程序。它委托给函数调用操作符的被调用对象的实现。对于普通的Python函数对象,您可以在function_call
中找到它为function_call
,并且可以从Objects/funcobject.c
向下追溯到_PyFunction_FastCallDict
。调用_PyFunction_FastCallDict
,其中PyEval_EvalFrameEx
至PyEval_EvalFrameEx
,其中包含字节码评估循环。