ad

《自己动手写 Python 虚拟机》_更理解虚拟机的意义_6.1.3 调用方法

网友投稿 131 2023-11-07

【摘要】 本书摘自《自己动手写 Python 虚拟机》一书中第6章,第1节,海纳编著。

6.1.3 调用方法

有了函数对象,就可以研究函数到底是怎么被调用的了。当函数被调用时,最关 键的是正确地维护与这个函数相对应的 FrameObject 。 第 一 节里已经介绍, FrameObject 中存储了程序运行时所需要的所有信息,例如程序计数器、局部变量 表等。

当要调用一个函数时,就应该为这个函数创建对应的 Frame; 当一个函数执行结 束时,即执行到 return 指令时,就应该销毁对应的 Frame, 然后回到调用者的 Frame 中去。为了维护这种函数调用时的栈帧切换,可以在 FrameObject 里增加一个链表 项,将所有的 FrameObject 串起来,每次新增的 FrameObject 只能增加到链表的头 部,同理,删除时也只能从链表的头部进行删除。这样的话,FrameObject 的实现必 须有所调整,如代码清单6.5所示。

代码清单6.5 调整 FrameObject

1 //runtime/frameObject.hpp

《自己动手写 Python 虚拟机》_更理解虚拟机的意义_6.1.3 调用方法

2 class FrameObject{

3 public:

4 FrameObject(CodeObject *codes);

5 FrameObject(FunctionObject*func);

6

7 FrameObject * _Sender:

8

9 void set_sender(FrameObject*x)(_sender =x;}

10 FrameObject *sender() (return_sender;}

11

12 };

13

14 //runtime/frameObject.cpp

15 FrameObject::FrameObject(FunctionObject*func){

16 _codes =func ->_func_code;

17 _consts =_codes->_consts;

18 names =_codes ->_names;

19

20

21 _locals =new Map();

22 _stack =new ArrayList();

23 _loop_stack =new ArrayList();

24

25 _pc =0;

26

27 _sender =NULL;

在 FrameObject 里增加一个构造函数,它的参数是 FunctionObject。就目前看 来,这个构造函数与第一个构造函数(即以 CodeObject 为参数的那个构造函数)并没 有什么本质的差别,但当后面的函数有参数和返回值时,这两个构造函数就会发生差 异。另外,FrameObject 里新增了sender 这个域,这个域里会记录调用者的栈帧,当 函数执行结束时,就会通过这个域返回到调用者的栈帧里。我们讲过,帧是用链表串 起来的,创建的时候挂到链表头上,销毁的时候从链表头上的第一帧开始销毁。后进 先出,这是典型的栈的特征,这再次体现了为什么函数调用的活动记录要被称为 栈帧。

现在可以实现 CALL_FUNCTION 这个字节码了,在 Interpreter 里增加一个 build_frame 方法,这个方法用于创建新的 FrameObject, 被调用的方法的内部状态 全部由新的 FrameObject 维护。这些内部状态包括程序计数器 pc, 局部变量表 lo- cals 等,代码如代码清单6.6所示。

只需要调用 build_frame 将 FrameObject 切换完就可以立即退出,返回到 run 方法里继续执行。与调用 build_frame 方法之前不同的是, _frame 变量已经发生了 变化, _frame 里的程序计数器已经指向了要调用的那个方法里了。

如图6.1所示,作为调用者,老的程序计数器还在它所对应的 FrameObject 里保 存着,并且指向了 CALL_FUNCTION 的下 一 条指令。而_frame 变量现在指向了 foo 所对应的栈帧,当被调用的函数结束时,就应该把_frame 变量重新指回调用者的 FrameObject, 这样就回到了调用者的栈帧里继续执行了。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《Excel VBA+SQL数据管理与应用模板开发》_工作效率UP!_1.5 ADO 查询数据的简单例子
下一篇:跟着一起学《Excel VBA跟卢子一起学 早做完 不加班 基础入门版》_1.2.4 录制宏的弊端
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×