Stamon 文档站

回到首页
回到上一级

对象管理器文档

对象管理器的主要文件是src/data_type目录下的Variable.cpp和src/vm目录下的ObjectManager.cpp。

其中,ObjectManager.cpp基于Variable.cpp。

Variable是一个非常简单的类,它有一个名为dataDataType*成员,所以对于任意左值,我们只需要得到这个左值的Variable*值,就可以对这个左值进行赋值(而不需要知道这个左值的具体信息)。
比如,对于一个名为varVariable*对象和一个名为datDataType*对象,想要把var(也就是左值)赋值为dat(也就是右值),只需要这么做:

var->data = dat;


换句话说,每个左值都对应着一个Variable*对象,而可以通过给这个对象的data成员赋值,从而达到给该左值赋值的目的

由于我之前对src/data_type目录下的框架没有清楚的认识。导致了data_type的一部分代码需要修改,我在这次的更新当中修复了它。(修复的主要内容是把代码中的DataType*改成Variable*,具体见源码)

ObjectManager.cpp编写了对象管理器的本体。对象管理器包含了GC机制。从今以后,如果你要新建虚拟机的对象,应该向对象管理器申请。

GC所采用的算法是标记-清除算法,我参考了清华大学出版社的《编译原理(第二版)》里的伪代码。我用一个栈来维护运行时所有的作用域。新建或退出一个作用域时只需要入栈或出栈即可。寻找某个变量也只需要从栈顶找到栈底就行。

以下是ObjectManager.cpp的使用方法(我只讲述用户应该了解的接口,内部接口请见源码):

SequenceType* d = man.MallocObject<SequenceType>(10);
//注意:这个函数的模板类型不是指针类型,但是函数的返回值的是指针类型

申请对象时,该函数会调用GCConditions函数,来查看申请此对象时是否需要执行GC。

——摘自工作日志/20231202.md(该文档来源于github.com/CLimber-Rong/stvm)


查看该文件的提交记录