赞
踩
今天的目标很简单:让python的计算出现奇奇怪怪的"错误".
从今天起,我们正式跨入python虚拟机 运行时部分 的恶搞.
要阅读python庞大的源码,你得拥有足够的耐心,因为他的函数调用特别复杂,甚至多达几十层才能实现一个在我们眼中特别简单的功能(如今天的恶搞对象:加减乘除).
这时候,我们的工具就得派上用场了:vs的查找.
这里可不是普普通通的查找哦,我们在一个单词上右键,然后点击Find all references
,也就是"找到所有引用".下方就会显示出所有引用了这种对象的列表,如下:
因为vs的某些局限,你无法直接ctrl+单击查看函数的实现,这里为了搞事情我们得找到加法处理的函数,所以只能查找所有引用,然后找到代表着"实现声明式"的那一个,就像上图标蓝的.根据常识,我们知道其他的都是调用这个函数,因此找到实现只能这么办!
(或者用眼睛找个半个小时也不是不行,何况我自己找这个函数已经找了半个小时了)
不想看过程的话,直接看最后,节约时间吧如果不想了解具体的话:传送
今天的练手恶搞啦.我们知道加法的英文,ADD
,因此在我半个小时劳动成果的文件Python/ceval.c
中查找字符串"ADD",(记得打开大写锁定,也就是说Add不会被搜索).
跟着直觉走,1+1应该属于二元运算,也就是BINARY,这么说,给出结果吧:Python/ceval.c:2068
.相关case如下
PyObject *right = POP();
PyObject *left = TOP();
PyObject *sum;
/* NOTE(vstinner): Please don't try to micro-optimize int+int on
CPython using bytecode, it is simply worthless.
See http://bugs.python.org/issue21955 and
http://bugs.python.org/issue10044 for the discussion. In short,
no patch shown any impact on a realistic benchmark, only a minor
speedup on microbenchmarks. */
if (PyUnicode_CheckExact(left) &&
PyUnicode_CheckExact
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。