1. 程式人生 > >lua源代碼學習(一)lua的c api外圍實現

lua源代碼學習(一)lua的c api外圍實現

在操作 時間 struct ack cti 壓棧 c api field stat

工作後,整個人已經比較松懈了。盡管一直在看lua的源代碼。可是一直是比較零碎的時間,沒有系統的整理,所以還是收獲不多。由於近期工作也不是非常忙了,就想整理下lua的源代碼學習的筆記。加深下印象,並分享給大家。

先說下這系列bolg我會每周更新2-3篇,沒有順序的

這些文章都是自己的淺薄的理解。有什麽錯誤,還請各位拍磚賜教。

1.關於c語言函數的聲明

相信大家都知道接口的重要,在lua中。假設要調用c語言的函數,就必需要有一個統一的函數聲明:

typedef int (*lua_CFunction) (lua_State *L);

可是,我們非常多函數都不是這種聲明。所以。我們就需要有一個包裝函數:

比方cos函數:

在c語言,標準math庫中,聲明例如以下:

double cos (double);

經過包裝後:

static int math_cos (lua_State *L) {
  lua_pushnumber(L, l_mathop(cos)(luaL_checknumber(L, 1)));
  return 1;
}

由於lua是一個狀態機。全部的操作都是在操作棧。所以lua_CFunction中傳入的lua_state這個棧,就能夠獲取lua執行中的全部數據了

luaL_checknumber(L,1):表示獲取棧頂的number,而且調用標準c的cos函數,而且cos計算值又一次壓棧。

2.關於luaL_Reg映射表

我們接口已經好了。那麽我們在lua中怎麽調用這些函數呢?

<pre name="code" class="html">typedef struct luaL_Reg {
  const char *name;
  lua_CFunction func;
} luaL_Reg;


lua為定義了這樣一個結構體,name表示在lua中的函數名字,func表示name真正調用的函數

3.簡短的說下luaopen_math函數調用過程

當我們映射表好了後,要如何註冊?

如今比較具體的說下:

LUAMOD_API int luaopen_math (lua_State *L) {
  luaL_newlib(L, mathlib);
  lua_pushnumber(L, PI);
  lua_setfield(L, -2, "pi");
  lua_pushnumber(L, HUGE_VAL);
  lua_setfield(L, -2, "huge");
  return 1;
}

luaL_newlib:這個函數一個宏:創建一個table來保存我們映射數據(key-value值)。



lua源代碼學習(一)lua的c api外圍實現