luars 232ライブラリで使用されるいくつかのC API for lua

1850 ワード

コードは貼らないで、ここでは前の2編の中で無視したいくつかのものを整理して、コードを読む記録としましょう.
1、ヘッダファイル
#include <lauxlib.h>
#include <lua.h>

All API functions and related types and constants are declared in the header file “lua.h”.
The auxiliary library provides several convenient functions to interface C with Lua. While the basic API provides the primitive functions for all interactions between C and Lua, the auxiliary library provides higher-level functions for some common tasks. All functions from the auxiliary library are defined in header file lauxlib.h and have a prefix luaL_.
 
2、void *lua_newuserdata (lua_State *L, size_t size).
まずuserdataとは何かを知る必要がありますか?ええ、私の理解では、Cの中のすべてのデータ型は、luaの中にuserdataという名前しかありません.実際、ここはメモリにすぎません.ライトハウスrdataを覚えているなら、これはポインタであることも覚えておくべきです.
lua_Newuserdataこの呼び出しはsizeサイズのメモリを申請し、このuserdataを指すポインタ(void型)を返し、ポインタはこの空間のヘッダアドレスを指す.同時にスタックにuserdataタイプelementをpushします.
luaはuserdataを理解することはできず,その内容を演算するなどの操作はできない.したがって、userdataを使用するには、関連する操作方法を追加する必要があります.また、newから出てきたuserdataは、luaが解放を回収するためにgcメタメソッドを追加する必要があります.
いつuserdataがgcに回収されるかについては...うーん、私は長い間答えを明確に探していなかったり、信頼できる答えを探したりして、しばらくコードをひっくり返したくなかったが、gcはすべてのuserdataが終了する必要があると仮定して、それから指向するルートオブジェクトが有効かどうかを探し始めた(どのような有効な方法が一時的に未知であるかについては)、無効であればuserdataの空間を回収したという人もいる.
ここの呼び出し状況を追いかけました.
1)我々はLの中でnewが1つのsizeをポインタタイプの空間に出てきて、その値はdllが返してきた1つのアドレスで、ポインタpがこのアドレスを持ち帰る.このように、スタックの上部にuserdataタイプのelementがあります.ここでは私たちがluaにpushintegerする必要はありません.
2)このelementにmetatableを設定します.
3)metatable.__gc()ではdll内の操作を呼び出すことで実現される.dllのメソッド、free(p)を直接呼び出します.これでこのgcが完成しました.
 
3、int luaL_optint (lua_State *L, int narg, int d)
numberであればintタイプの数を返すnargをチェックします.nilまたはない場合は、パラメータdを返します.これが何のために使われているのか分からなかったので、理解しなければなりません.
 
4、4がないのに、いいでしょう.草のようにこのwrapperを見ました.