Tolua 實現分析

2021-06-26 21:39:30 字數 2694 閱讀 6140

tolua++ 是乙個將 c/c++ 的函式和物件匯出給 lua 指令碼使用的工具。

使用這個工具的基本步驟: ~

每個目標檔案都是從一系列 .pkg 檔案編譯而來,主要完成下列功能: ~

不管是 c 函式還是 c++ 物件的方法,都一律匯出為靜態函式。

c 函式的匯出形式如下:

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

static

inttolua_math2dx_luabinding_dist00

(lua_state

*tolua_s

)else

}return1;

tolua_lerror

:tolua_error

(tolua_s,"

#ferror in function 'dist'.",&

tolua_err

);return0;

}

由於這個匯出模組的名字是 math2dx_luabinding,所以匯出函式的字首就是 tolua_math2dx_luabinding_ 。而匯出函式 dist 的名字也新增了字尾 00 用於區別可能存在的函式過載。

匯出函式 dist00() 的執行步驟:

首先從 stack 提取函式的引數,並一一判斷型別。如果型別不符,則輸出錯誤資訊並中斷執行。

將引數複製到臨時變數中,然後呼叫目標函式 dist(),並將結果(如果 dist() 有返回值)push 到 stack。

dist00() 最後返回 dist() 函式的返回值的個數。 ~

對於 c++ 物件,方法則分為類靜態方法和例項方法兩種情況。

由於 tolua++ 匯出的 c++ 類靜態方法用「:」操作符呼叫:

local request = cchttprequest:create()
因此匯出函式裡要求傳入的第乙個引數是 cchttprequest 模組:

ps: 個人認為將 c++ 物件視為乙個 lua module 時,那麼類靜態方法的呼叫方式應該是 cchttprequest.create() 這樣,以便和例項方法區別開。

例項方法的匯出區別不大,僅僅是需要檢查 stack 中的第乙個值是否是物件例項:

定義完所有要匯出的方法後,tolua++ 目標檔案將定義所有的模組並註冊上述匯出的方法。

~對於 c 函式,會新增到 lua 的全域性名字空間中,而每乙個 c++ 物件,則會註冊乙個與類名相同的 table,並新增到全域性名字空間。

c++ 物件對應的 table 新增後,會將匯出的類靜態方法和例項方法新增到這個 table。

~要想讓目標檔案正常工作,還需要依賴 tolua++ 庫提供的功能。這個庫提供下列功能:

其實這篇文章應該還有不少內容,但我實在是懶得寫了。。。原諒我這個程式猿吧 -_-#

~-eof-

Tolua實現Update功能

第一步 在元件上,掛載 lualooper 指令碼 這是驅動tolua裡面update 第二步 找到tolua 裡面的event 指令碼 把下面 複製進來 function event add func,obj local events updatebeat createlistener func,...

Tolua使用筆記三 Tolua協程用法

案例5 這一章講的是lua中的協程 如果我沒記錯的話,lua中沒有多執行緒,只有協程,lua的協程自帶的用起來有點侷限性,tolua中協程由於重寫了部分的方法,變得更加方便了 核心 如下 function cofunc print coroutine started local i 0 for i ...

Tolua使用筆記三 Tolua協程用法

案例5 這一章講的是lua中的協程 如果我沒記錯的話,lua中沒有多執行緒,只有協程,lua的協程自帶的用起來有點侷限性,tolua中協程由於重寫了部分的方法,變得更加方便了 核心 如下 function cofunc print coroutine started local i 0 for i ...