Archive for 十一月 2012

Lua5.1.4代码分析(十四)-Lua外部模块加载机制

前面已经提到了Lua的内部模块加载机制,今天谈谈如何加载外部模块.与模块加载相关的库都在package库中提供,代码实现在loadlib.c中.

先来看Lua中与模块相关的几个函数.

1)module
在定义一个Lua模块时,第一句代码一般都是module(xxx).来看这一句背后的含义.module调用对应的c函数是loadlib.c中的函数ll_module:

static int ll_module (lua_State *L) {
  const char *modname = luaL_checkstring(L, 1);
  int loaded = lua_gettop(L) + 1;  /* index of _LOADED table */
 

Lua5.1.4代码分析(十二)-Lua内部模块的注册

今天讲解Lua内模块的注册机制.其实Lua自带的模块并不多,这是Lua被诟病比较多的地方,这样的坏处是很多东西需要自己造轮子没有标准的实现(虽然可以实现为库也不那么不方便使用),好处就是Lua足够的小,毕竟它的设计目标是定位成一个嵌入式的轻量级语言的.

这部分需要的知识点不多,但是可以顺带着理解Lua中的一些概念.

但是在讲解之前,还是先来看看另一个貌似并不那么相关的函数index2adr

static TValue *index2adr

Lua5.1.4代码分析(十一)-函数的调用

上一篇中,已经提到了函数的信息是如何在lua中保存的,本篇继续来讲解函数的调用机制.

首先谈谈函数的参数是如何处理的.
在分析函数的定义时,首先调用parlist处理函数的参数.简单起见,这里考虑函数的参数是确定的情况:

static void parlist (LexState *ls) {
  /* parlist -> [ param { `,' param } ] */
  FuncState *fs = ls->fs;
  Proto *f = fs->f;
  int nparams = 0;
  f->is_vararg = 0;
  if (ls->t.token != ')') {  /* is `parlist' not empty? */
    do {
      switch (ls->t.token)