addAllocation((yyval.s" />

第二人生的源码分析(111)脚本的综合分析(1)

系统 1945 0
 

当语法分析一个脚本完成时,那么就会把整个脚本的分析结果保存起来,在第二人生里把脚本的结果保存到那里呢?现在就来分析这个问题,先来看看语法分析的文件里,有如下的代码:

#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  

 

通过上面分析,了解了脚本保存的结构,下一次再仔细地分析它是怎么进行脚本处理。

第二人生的源码分析(111)脚本的综合分析(1)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论