demo.py:
i = 1
def f():
j = 2
f()
test.py:
import dis
source = open('./demo.py').read()
co = compile(source, './demo.py', 'exec')
print(co.co_name)
dis.dis(co)
print("\n")
fCode = co.co_consts[1]
print(fCode.co_name)
dis.dis(fCode)
输出:
<module>
1 0 LOAD_CONST 0 (1)
3 STORE_NAME 0 (i)
3 6 LOAD_CONST 1 (<code object f at 0x022F5430, file "./demo.py", line 3>)
9 MAKE_FUNCTION 0
12 STORE_NAME 1 (f)
6 15 LOAD_NAME 1 (f)
18 CALL_FUNCTION 0
21 POP_TOP
22 LOAD_CONST 2 (None)
25 RETURN_VALUE
f
4 0 LOAD_CONST 1 (2)
3 STORE_FAST 0 (j)
6 LOAD_CONST 0 (None)
9 RETURN_VALUE
对于def f():这一语句,Python虚拟机先将函数f对应的PyCodeObject入栈,然后再MAKE_FUNCTION。
caseMAKE_FUNCTION:
v=POP();/*
code object */
x=PyFunction_New(v,f->f_globals);
Py_DECREF(v);
/*
XXX Maybe this should be a separate opcode? */
if(x!=NULL&&oparg>0){
v=PyTuple_New(oparg);
if(v==NULL){
Py_DECREF(x);
x=NULL;
break;
}
while(--oparg>=0){
w=POP();
PyTuple_SET_ITEM(v,oparg,w);
}
err=PyFunction_SetDefaults(x,v);
Py_DECREF(v);
}
PUSH(x);
break;
在相应代码中,将对应的PyCodeObject和帧的全局符号表指针传递给PyFunction_New函数,调用之,最后将返回值入栈。
在PyFunction_New函数中,创建一个PyFunctionObject,然后初始化相应的成员信息,返回之。
而对于函数f的调用,首先将函数名入栈,再执行CALL_FUNCTION:
caseCALL_FUNCTION:
{
PyObject**sp;
PCALL(PCALL_ALL);
sp=stack_pointer;
#ifdefWITH_TSC
x = call_function(&sp, oparg, &intr0, &intr1);
#else
x=call_function(&sp,oparg);
#endif
stack_pointer=sp;
PUSH(x);
if(x!=NULL)
continue;
break;
}
在这里,将栈顶指针和参数信息传递给函数call_function,然后恢复栈顶指针,将返回值入栈。
最后实际上是创建了一页帧,然后以帧作为活动环境,调用PyEval_EvalFrameEx函数。
f=PyFrame_New(tstate,co,globals,NULL);
if(f==NULL)
returnNULL;
fastlocals=f->f_localsplus;
stack=(*pp_stack)-n;
for(i=0;i<n;i++){
Py_INCREF(*stack);
fastlocals[i]=*stack++;
}
retval=PyEval_EvalFrameEx(f,0);
JasonLee 2011.08.27 19:52
分享到:
相关推荐
python笔记python笔记python笔记python笔记python笔记python笔记python笔记python笔记python笔记
Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf Python学习笔记 .pdf ...
手把手教您如何使用python语言,创建OpenStack虚拟机。
2.1 Python中的输入输出函数 2.2 Python中的注释 2.3 Python中的变量 3、Python中的基本数据类型 3.1 整型-int 3.2 浮点型-float 3.3 布尔类型-bool 3.4 字符串类型-str 4、Python中的常见运算符 4.1 算术...
Python笔记PythonPython笔记笔Python笔Python笔记记记Python笔记
pyjvm, 在纯 python 中,实现了Java虚拟机 PyJVMJava 7虚拟机在纯 python 中实现为跳转启动 Check Check Check和 docs detailsGPL需要 python 2.7https://github.com/andrewromanenc
'千锋python基础教程:7、装饰器&偏函数与作用域与异常处理与文件读写' 千锋python基础教程:8、os与窗口控制与内存修改与语言 第二章前端基础 1、html&css;基础 2、html&css;提升 3、JavaScript基础 4、...
马哥python课堂笔记_马哥教育PYTHON相关基础笔记 1 python 推荐书籍 《python Cookbook》 《learn python the hard way》 《google's python class》 《简明python教程》 2 冯诺依曼体系架构 输⼊设备-> 存储器(运算...
最新Python学习笔记,Day 3,总结性学习笔记,适合初学者归纳总结。
python的毕业设计云笔记平台分析与设计。基于python的云笔记平台分析与设计python的毕业设计云笔记平台分析与设计。基于python的云笔记平台分析与设计python的毕业设计云笔记平台分析与设计。基于python的云笔记平台...
python刚刚开始学习还没入门的,可以试一下这些例题,掌握快速
疯狂Python讲义笔记 Python基础入门到进阶知识手册 对照原文的笔记 由浅入深 循序渐进的笔记
python 学习笔记——线性回归预测模型.pdf python 学习笔记——线性回归预测模型.pdf python 学习笔记——线性回归预测模型.pdf python 学习笔记——线性回归预测模型.pdf python 学习笔记——线性回归预测模型.pdf ...
Python学习笔记
Python学习笔记.pdf
Python学习笔记--皮大庆,非常适合零基础入门。对应英文版本《How to think like a computer scientist》
Python 学习笔记
python学习笔记 python学习笔记全文共25页,当前为第1页。python学习笔记全文共25页,当前为第1页。第一章. Python基本用法 3 python学习笔记全文共25页,当前为第1页。 python学习笔记全文共25页,当前为第1页。 1....
Python学习笔记 附赠可爱的Python 同时增加了UltraEdit的高亮显示Shell 及Python的文件
Python学习笔记,最基本的python相关基础知识点学习笔记,不包含框架。适合0基础入门,快速入门,快速过一遍Python涉及到的语法和其他基本问题,详细的记录在案。