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