资源描述:
《Lua源代码分析顺序.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Recommendedreadingorder:lmathlib.c,1strlib.c:getfamiliarwiththeexternalCAPI.Don1tbotherwiththeAPIisimplementedinternaily.OnlyskimthistogetaCross-refereneetolua.handluaconf.hasneedecl・valuesandobjectrepresentation・skimthroughthisfirst・windowwiththisfileopenallthetime.thepatternmotcherthough.Justth
2、eeasyfunctions,lapi.c:Checkhowfeelingforthecode・lobject・h:taggedyou11wanttokeepalstate.h:stateobjects.ditto,lopcodes.h:bytecodeinstructionformatandopcodedefinitions.easy.lvm.c:scrolldowntoluaV_execute,themaininterpreterloop・seehowalloftheinstructionsareimplemented・skipthedetailsfornow・rereadlater
3、・Ido.c:calls,stacks,exceptions,coroutines,toughread,lstring.c:stringinterning・cute,huh?ltable.c:hashtablesandarrays,trickycode.ltm.c:metamethodhandling,rereadalloflvm.cnow.Youmaywanttorereadlapi.cnow・]debug,c:surprisewaitingforyou.abstractinterpretationisusedtofindobjectnamesfortracebacks.doesbyt
4、ecodeverification,too.lparser・c,lcode・c:recursivedescentparser,targettingaregister-basedVM.startfromchunk()andworkyourwaythrough・readtheexpressionparserandthecodegeneratorpartslast・Igc.c:incrementalgarbagecollector,takeyourtime.Readalltheotherfilesasyouseereferencestothem.Don'tletyourstack英文比较简单,
5、我就不翻译了。今天已经读了Imathlib.c,lstrlib.c,lapi.c这三个文件。对于Imathlib.c和lstrllib.c这个两个文件主要是熟悉如何扩展Lua,一般使用过Lua的人都对这个会有所了解。只是简单的读一读、熟悉代码风格,不用花太多时间(我只看了20分钟)lapi.c这里就开始有点难度了,主要是你这里有一些平时没有接触过的东西。阅读这个文件可以结合手册屮第三章CAPI來进行。由于lapi.c涉及到很多的宏和结构,建议装一个vim+ctags或Visualstudio2010做crossreferenceso以下是一些关于lapi.c笔记:TValue:由Vaiu
6、e和tt组成,tt为类型标识,等于LUA_TNTL的呢个Value是一个联合体,根据tt的值不同使用不同的值,1呃屮所有的值、对彖,都是由这个结构储存。以下是blue联合体的定义:typedefunion{GCObject*gc;void*p;lua_Numbern;intb;}Value;GCObject:里曲的内容比较复杂,从字瓯上理解是指就是gc会收集的对象,可以理解为Lua屮的基木对象。包括Thread,Table,UserData,String祁是存储在这个对象。void*p:就是指针对应的内容就是api中的lightuserdata,这个可以从luapushlightuser
7、data和lua_touserdata中得到证明。由此,可以知道lightuserdata和number,integer有相同的行为index2adr函数:将栈索引转换成Stkld,伪索引(GLOBALIndex,REGISTRYIndex等)也是在这里处理。几乎所有API都需要调用这个。Stkld:字面意思为栈ID,实际为TValue*,使用地址作为一标识。可以想象,lua_State屮的栈是一个TValue数组。阅读lapi.c