Excel 名称框概述-英雄云拓展知识分享
119
2023-11-07
【摘要】 本书摘自《自己动手写 Python 虚拟机》一书中第6章,第1节,海纳编著。
6.1.2 创建Function Object
在前面的章节里已经实现了CodeObject, 它代表的是静态的代码段,为什么不 能直接使用CodeObject 进行函数调用呢?这是因为函数在真正被调用的地方,还有 很多动态的信息,例如函数的参数默认值等。动态信息很难使用CodeObject 保存和 传递,因此引入了 FunctionObject。
不同于C 语言中的函数定义,FunctionObject 是一个真正的虚拟机对象。它可 以被变量引用,也可以被添加到列表中,总之,所有可以对普通对象进行的操作,都可 以施加到 FunctionObject 上。FunctionObject 与CodeObject 往往是一一对应的(理 论上讲, 一个 CodeObject 可以对应多个 FunctionObject, 但在实际中,很少出现这种 情况)。经过这些分析,可以这样定义 FunctionObject,其实现如代码清单6.3所示。
1 class FunctionKlass :public Klass {
2 private:
3 FunctionKlass();
4 static FunctionKlass*instance;
5
6 public:
7 static FunctionKlass*get_instance();
8
9 virtual void print(HiObject*obj);
10 };
11
12 class FunctionObject:public HiObject{
13 friend class FunctionKlass;
friend class FrameObject;
private:
CodeObject*_func_code;
HiString * _func_name;
unsigned int _flags;
public:
FunctionObject(HiObject*code_object);
FunctionObject(Klass*klass)(
_func_code =NULL;
_func_name =NULL;
_flags =0;
set_klass(klass);
)
HiString *func_name()
int flags()
之前分析过,FunctionObject 与普通的 Object 一样,因此它也要遵守 Klass - Oop 的二元结构。在程序的一开始,便定义了 FunctionKlass 来指示对象的类型。 接下来定义的FunctionObject, 它的属性也很简单, 一个是指向与自己对应的Code- Object的指针,还有一个代表了方法的名称,最后一个属性_flags,临时先不用。为 这两个类提供其具体实现,也很简单,代码如下:
1 FunctionKlass*FunctionKlass::instance =NULL;
2
3 FunctionKlass*FunctionKlass::get_instance()(
4 if(instance ==NULL)
5 instance =new FunctionKlass();
6
7 return instance;
8 }
9
10 FunctionKlass::FunctionKlass(){
11
12
13 void FunctionKlass::print(HiObject*obj){
14 printf(" FunctionObject*fo =static_cast 16 assert(fo &&fo>klass()==(Klass*)this); fo->func_name()->print(); printf(">"); 20 21 FunctionObject::FunctionObject(HiObject*code_object){ CodeObject*co =(CodeObject*)code_object; 24 _func_code =co; _func_name =co >_co_name; _flags =co->_flag; 28 set_klass(FunctionKlass::get_instance()); 30 定义 Klass 算得上轻车熟路了,FunctionKlass 同其他的 Klass 一样,也采用了 单例的实现方式。FunctionObject 的 print 方法,主要是用于输出方法名。在 Func- tionObject 的构造函数里,把该对象的klass 设置为 FunctionKlass, 这就是以上代码 所做的全部事情。 有了 FunctionObject, 再来看 MAKE_FUNCTION 的具体实现,这个字节码的 任务是,通过CodeObject 创建一个 FunctionObject, 已经实现了这个构造方法。因 此 MAKE_FUNCTION 的实现就很简单了,如代码清单6.4所示。 需要注意的一点是,MAKE_FUNCTION 指令本身是带参数的,它是一个整数, 代表了该函数有多少个默认参数。我们现在还没有关心函数调用传参的问题,所以 先把 MAKE_FUNCTION 的参数忽略掉。 版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~