本文只分析Python类实例的创建,不涉及类本身的构建(类本身的构建将会在接下来的文章中介绍)。
# example
class A(object):
pass
obj_a = A()
上面这一段代码对应的opcode如下:
0 LOAD_CONST 1 ('A')
3 LOAD_GLOBAL 0 (object)
6 BUILD_TUPLE 1
9 LOAD_CONST 2 (", line 2>)
12 MAKE_FUNCTION 0
15 CALL_FUNCTION 0
18 BUILD_CLASS
19 STORE_FAST 0 (A)
22 LOAD_FAST 0 (A)
25 CALL_FUNCTION 0
28 STORE_FAST 1 (obj_a)
说明几个关键的opcode,BUILD_CLASS用于创建一个名为A的Class,在LOAD_FAST的时候Python虚拟机加载A,然后执行CALL_FUNCTION。
1.从CALL_FUNCTION机器码看起
下面是从CALL_FUNCTION开始的函数调用流程:
CALL_FUNCTION->call_function->do_call->PyObject_Call...
PyObject_Call从函数命名很容易理解,这个函数是对PyObject进行调用。
PyObject *
PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) {
if ((call &#