当语法分析一个脚本完成时,那么就会把整个脚本的分析结果保存起来,在第二人生里把脚本的结果保存到那里呢?现在就来分析这个问题,先来看看语法分析的文件里,有如下的代码:
#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
通过上面分析,了解了脚本保存的结构,下一次再仔细地分析它是怎么进行脚本处理。