LuaTinker的bug和缺陷

2022-04-28 18:36:11 字數 3004 閱讀 1070

但另外一方面luatinker的bug數量並不在少數。也有不少同學曾經零散的提出來過。這兒只是做個總結,另外感謝fergzhang同學。很多問題都是他幫忙指出的。

bug(錯誤)

第乙個問題,int64_t 資料的比較是錯誤的,完全沒有考慮符號位的情況嘛。

static

int lt_s64(lua_state *l)

第二個問題,在處理類成員的修改函式(__newindex)時,沒有考慮要處理父類成員的,而luatinker是支援繼承的,而且int lua_tinker::meta_get(lua_state *l) (對應__index)也是支援。這應該是作者的乙個疏漏。

int lua_tinker::meta_set(lua_state *l)

else

if (lua_isnil(l, -1

)) lua_settop(l, 3);

return0;

}

第三個bug,使用i64d這種過時的標籤,i64d應該是微軟很老很老很老的乙個格式化字串標籤,而且完全不具備可移植性。應該改為%lld。

static

int tostring_s64(lua_state *l)

第4個bug,var_base基類的析構函式沒有寫virtual

struct

var_base

;

virtual

void

get(lua_state *l) = 0

;

virtual

void

set(lua_state *l) = 0

;};

第5個bug,table的3個建構函式中有乙個沒有增加引用計數,這個bug在網上很多同學都指出過。

lua_tinker::table::table(lua_state* l, const

char*name)

m_obj = new

table_obj(l, lua_gettop(l));

//原來的**沒有這段,缺少增加引用計數處理

m_obj->inc_ref();

}

, csdn的ainn_pp也寫過這個問題,參考:

缺陷luatinker也有很多缺陷和不足,

第乙個不足,各種函式引數的支援個數參差不齊。luatinker的寫的時間應該比較早,沒有c++ 11的模版變參(variadic template)的支援,所以只能用寫多個模版函式(類)的方式解決多模板引數問題。但luatinker一方面寫的引數個數很少,一方面luatinker的個個地方支援的引數個數數量完全不統一,3個,4個,5個的都有。其實這部分最好用c++ 11的(variadic template)重寫。

第二個缺陷是個硬傷,luatinker對lua 協程的支援,用了乙個很費力,但又不討好的方式。你必須把協程的第乙個引數定義為lua_state *l,而且返回值必須是lua_yield(l, 0)。這樣的限制,大大限制了使用。

//

第乙個引數必須是(lua_state *l

int testfunc2(lua_state *l, float

a)class

testclass

};

而如果其實在其函式的封裝上加以區分,自己在最後呼叫lua_yield,這就可以避免這個麻煩。這個實現實在讓我沒有多大胃口。

第三個地方是,是對引用變數(引數),註冊的問題,其實這個也不是luatinker的問題,而是c++模版的問題,c++的自動模版函式引數推導是存在一些潛規則的。其中有乙個就是左值變換,在 《cuj:高效使用標準庫:顯式函式模板引數申明與stl》 一文中有比較清晰的解釋。如下示例:

//

下面的寫法是無法得到引用的,必須顯式指定引數。

//lua_tinker::set(l, "ref_a", ref_a);

//顯式宣告引用引數

lua_tinker::set

(l, "

ref_a

", ref_a);

第4個問題就是,模版處理中,對於cv(const volatile)的去除掉處理也並不理想。lua內部對於外部的class的註冊是使用函式class_add,也就是用乙個名稱關聯乙個lua的meta table,在類的後面的使用中,通過class_name::name函式取得類名,但實際中,很多時候t是帶有const 或者 volatile的修飾符的。包括,luatinker在部分處理中去掉了const,但很多地方又忽略問題,編譯器不會認為classa和const class a是乙個東東的。所以結果就是有時候無法讓你的userdata找到對應的meta table。

lua_tinker::class_add(l, "

testa");

lua_tinker::class_con

(l, lua_tinker::constructor);

//用模板函式輔助幫忙實現乙個方法,可以通過class 找到對應的類名稱(註冊到lua的名稱),

templatestruct

class_name

return

temp;

}};

fergzhang同學,針對luatinker的一些bug修正做了乙個版本。同時好像支援了5.2的版本,他放在了

而我自己針對上面的問題實現了一套luatie的庫,沒有時間,有時間整理出來。內部用c++ 11的特性做了一些改寫。

最後,雖然我在挑刺,但還是再次表達一下對 luatinker作者kwon-il lee的感謝,這套**幫助我了解了如何繫結指令碼以及了解mpl的一些基本知識.而且坦白講luabind是和boost繫結的,能費力從這些**中簡化出luatinker(閱讀boost**實在談不上愉快),真的是一件很了不起的事情,luatinker的作者可能更明白輕對於**的好處,kwon-il lee在主頁上有一段說明其為什麼沒有支援luabind所支援的過載,而我也認為乙個優秀的庫始終要是簡單的。

AsyncTask 和Handler 的優缺點比較

asynctask 實現的原理和優缺點 優點 快捷 方便 缺點 當執行多個後台任務,和並需要ui 變更起來就比較複雜 handler 實現的原理和優缺點 優點 簡單 清晰 缺點 當執行單個後台任務,顯得 過多,結構複雜 相對性 asynctask 介紹 android 的asynctask 比han...

hibernate和mybatis的優缺點

mybatis的優點 1 易於上手和掌握,提供了資料庫查詢的自動物件繫結功能 2 sql寫在xml裡,便於統一管理和優化,解除sql與程式 的耦合。3 提供對映標籤,支援物件與資料庫的orm欄位關係對映 4 提供物件關係對映標籤,支援物件關係組建維護 5 提供xml標籤,支援編寫動態sql。6 速度...

Cookie和Session的區別和優缺點

cookie的優缺點 優點 極高的擴充套件性和可用性 通過良好的程式設計,控制儲存在cookie中的session物件的大小。通過加密和安全傳輸技術 ssl 減少cookie被破解的可能性。只在cookie中存放不敏感資料,即使被盜也不會有重大損失。控制cookie的生命期,使之不會永遠有效。偷盜者...