3-折腾python:1+1=3

目标

今天的目标很简单:让python的计算出现奇奇怪怪的"错误".
从今天起,我们正式跨入python虚拟机 运行时部分 的恶搞.

vs的使用

要阅读python庞大的源码,你得拥有足够的耐心,因为他的函数调用特别复杂,甚至多达几十层才能实现一个在我们眼中特别简单的功能(如今天的恶搞对象:加减乘除).
这时候,我们的工具就得派上用场了:vs的查找.

这里可不是普普通通的查找哦,我们在一个单词上右键,然后点击Find all references,也就是"找到所有引用".下方就会显示出所有引用了这种对象的列表,如下:
点击"查找引用"
找到啦
因为vs的某些局限,你无法直接ctrl+单击查看函数的实现,这里为了搞事情我们得找到加法处理的函数,所以只能查找所有引用,然后找到代表着"实现声明式"的那一个,就像上图标蓝的.根据常识,我们知道其他的都是调用这个函数,因此找到实现只能这么办!
(或者用眼睛找个半个小时也不是不行,何况我自己找这个函数已经找了半个小时了)

恶作剧1:1+1=3

不想看过程的话,直接看最后,节约时间吧如果不想了解具体的话:传送
今天的练手恶搞啦.我们知道加法的英文,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(
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dtsroy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值