Archive for 九月 2012

十字链表的AOI算法

看了云风写的

Lua5.1.4代码分析(十)-函数的定义

Lua源码中,专门有一个结构体FuncState用来保存函数相关的信息.其实,即使没有创建任何函数,对于Lua而言也有一个最外层的FuncState数据.来看看这个结构体的定义:

typedef struct FuncState {
  Proto *f;  /* current function header */
  Table *h;  /* table to find (and reuse) elements in  */
  struct FuncState *prev;  /* enclosing function */
  struct LexState *ls;  /* lexical state */
  struct lua_State *L;  /* copy of the Lua state */
  struct BlockCnt *bl;  /* chain of current blocks */
  int pc;  /* next

Lua5.1.4代码分析(九)-循环类操作

有了前面的基础,再来看循环类指令就很简单了,因为循环类指令,本质上可以改写成逻辑跳转类指令.

就以最简单的for循环来讲解循环类指令的实现.Lua中的for循环有两种形式,一种是平时常见的数字循环类,另一种是遍历数组,Hash的for循环语句.当然还是第一种更简单,所以就以数字循环类指令来讲解.

与数字for循环类指令相关的Opcode有两个:

OP_FORPREP,/*	A sBx	R(A)-=R(A+2); pc+=sBx				*/

OP_FORLOOP,/*	A sBx	R(A)+=R(A+2);
			if R(A) less than

Lua5.1.4代码分析(八)-逻辑跳转类操作

我原来以为逻辑跳转类指令是很简单的,实际上花了我很多时间才看的比较明白.未来也许还需要重新回顾这部分代码.

暂时不展开复杂的讨论,所有的逻辑跳转类指令最后都无非是这样的形式:

如果条件成立跳转到lable1,否则跳转到lable2:

label1:
    条件成立的处理,跳转到出口

label2:
     条件不成立的处理,跳转到出口

出口:
    处理收尾工作

比如,以下的一段C代码:

if (cond)
   func1();
else