第二人生的源码分析(111)脚本的综合分析(1)
当语法分析一个脚本完成时,那么就会把整个脚本的分析结果保存起来,在第二人生里把脚本的结果保存到那里呢?现在就来分析这个问题,先来看看语法分析的文件里,有如下的代码:
#001 case 3:
#002 #line 277 "indra.y"
#003 {
#004 (yyval.script) = new LLScriptScript(NULL, (yyvsp[(1) - (1)].state));
#005 gAllocationManager->addAllocation((yyval.script));
#006 gScriptp = (yyval.script);
#007 }
#008 break;
第4行里就创建一个LLScriptScript脚本程序保存对象,这个对象保存在全局变量gScriptp里。并且创建时就保存脚本的开始状态(yyvsp[(1) - (1)].state),比如脚本里关键字default的开始,就会创建一个开始状态LLScriptState对象。
下面就来分析类LLScriptScript是怎么样保存脚本和分析脚本的,它的声明如下:
#001 class LLScriptScript : public LLScriptFilePosition
#002 {
#003 public:
构造函数保存全局储存对象,保存脚本的开始状态。
#004 LLScriptScript(LLScritpGlobalStorage *globals,
#005 LLScriptState *states);
#006
析构函数删除全局对象。
#007 ~LLScriptScript()
#008 {
#009 delete mGlobalScope;
#010 }
#011
递归遍历处理语法分析、输出汇编代码、输出字节码等等。
#012 void recurse(FILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type,
#013 LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata);
获取生成代码的大小,这里设置返回0。
#014 S32 getSize();
#015
设置脚本目标生成文件。
#016 void setBytecodeDest(const char* dst_filename);
#017
脚本程序开始状态保存成员。
#018 LLScriptState *mStates;
脚本程序的全局作用域。
#019 LLScriptScope *mGlobalScope;
脚本程序的全局变量。
#020 LLScriptGlobalVariable *mGlobals;
脚本程序的全局函数。
#021 LLScriptGlobalFunctions *mGlobalFunctions;
保存函数属性是否代理能执行。
#022 BOOL mGodLike;
#023
#024 private:
保存生成字节码的目标文件。
#025 char mBytecodeDest[MAX_STRING]; /*Flawfinder: ignore*/
#026 };
#027
通过上面分析,了解了脚本保存的结构,下一次再仔细地分析它是怎么进行脚本处理。
相关文章
- ABP源码分析四十三:ZERO的本地化
- ABP源码分析三十七:ABP.Web.Api Script Proxy API
- 前端MVC框架Backbone 1.1.0源码分析(一)
- jQuery 2.0.3 源码分析 事件体系结构
- jQuery 2.0.3 源码分析core - 选择器
- Hadoop2源码分析-YARN RPC 示例介绍
- ZooKeeper源码研究系列(1)源码环境搭建
- java集合框架02——Collection架构与源码分析
- 从领域、对象、角色、职责、对象交互、场景等方面去分析和设计领域模型(附源码)
- MFC Windows 程序设计[118]之文本下拉列表框(附源码)
- ThreadX全家桶源码和文档下载,含GUI设计器,GUI,文件系统,网络协议栈,USB协议栈等(2020-05-26)
- 从源码分析DEARGUI之add_label_text
- 从源码分析创建线程池的4种方式
- 鸿蒙轻内核M核源码分析:数据结构之任务排序链表
- 鸿蒙轻内核源码分析:虚实映射
- tpm2-tools源码分析之tpm2_load.c(3)
- TPM零知识学习四 —— tpm2-tss源码安装
- Android Studio引入源码(Android7.0+)framework.jar
- 第二人生的源码分析(二十)显示人物名称
- (02)Cartographer源码无死角解析-(31) LocalTrajectoryBuilder2D::AddRangeData()→点云数据重力对齐,Z轴过滤
- Python基于YOLO&Deepsort的闯红灯检测系统(完整源码&自定义UI操作界面&视频教程)