亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

淺析C/C++和Lua的通信方式

2024-07-21 23:04:05
字體:
來源:轉載
供稿:網友

為了實現Lua和其他語言之間的通信,Lua虛擬機為C/C++提供了兩個特性:

一,Lua_State狀態機

       lua_State主要是管理一個lua虛擬機的執行環境, 一個lua虛擬機可以有多個執行環境。Lua虛擬機通過維護這樣一個虛擬棧來實現兩種之間的通信,lua_State定義如下:

struct lua_State { CommonHeader; lu_byte status; StkId top; /* first free slot in the stack */ global_State *l_G; CallInfo *ci; /* call info for current function */ const Instruction *oldpc; /* last pc traced */ StkId stack_last; /* last free slot in the stack */ StkId stack; /* stack base */ int stacksize; unsigned short nny; /* number of non-yieldable calls in stack */ unsigned short nCcalls; /* number of nested C calls */ lu_byte hookmask; lu_byte allowhook; int basehookcount; int hookcount; lua_Hook hook; GCObject *openupval; /* list of open upvalues in this stack */ GCObject *gclist; struct lua_longjmp *errorJmp; /* current error recover point */ ptrdiff_t errfunc; /* current error handling function (stack index) */ CallInfo base_ci; /* CallInfo for first level (C calling Lua) */};

        1,虛擬棧的管理, 包括管理整個棧和當前函數使用的棧的情況

        2,CallInfo的管理, 包括管理整個CallInfo數組和當前函數的CallInfo

        3,hook相關的, 包括hookmask, hookcount, hook函數等

        4,global_State是全局唯一的,存放多個lua_State之間的一些共享數據

        5,gc的一些管理和當前棧中upvalue的管理

        6,錯誤處理的支持等等

        C/C++和Lua擁有不同的數據類型,要實現兩者之間的數據通信怎么辦?Lua虛擬機提供Lua_State這樣一種數據結構。任何一種數據從C/C++傳入Lua虛擬機中,Lua都會將這類數據轉換為一種通用的結構lua_TValue,并且將數據復制一份,將其壓入虛擬棧中。lua_TValue定義如下:

struct lua_TValue { TValuefields;}; #define TValuefields /  union { struct { Value v__; int tt__; } i; double d__; } u union Value { GCObject *gc;  /* collectable objects */ void *p;     /* light userdata */ int b;      /* booleans */ lua_CFunction f; /* light C functions */ numfield     /* numbers */};

       Lua有自己的GC,C/C++由自己申請和釋放內存,所以兩者之間的內存管理是獨立的。從C/C++中傳遞數據到Lua虛擬機會發生數據拷貝,從Lua虛擬機中傳遞出來是直接從虛擬棧中取值或者地址,所以數據從虛擬棧中pop之后,是否依然是有效引用需要額外注意。

 二,C API

Lua腳本實現交互提供了一系列的C API,常用API有:

        luaL_newstate函數用于初始化一個lua_State實例

        luaL_openlibs函數用于打開Lua中的所有標準庫,如io庫、string庫等。

        luaL_loadbuffer編譯了buff中的Lua代碼,如果沒有錯誤,則返回0,同時將編譯后的程序塊壓入虛擬棧中。

        lua_pcall函數會將程序塊從棧中彈出,并在保護模式下運行該程序塊。執行成功返回0,否則將錯誤信息壓入棧中。

        lua_tostring函數中的-1,表示棧頂的索引值,棧底的索引值為1,以此類推。該函數將返回棧頂的錯誤信息,但是不會將其從棧中彈出。

        lua_pop是一個宏,用于從虛擬棧中彈出指定數量的元素,這里的1表示僅彈出棧頂的元素。

        lua_close用于釋放狀態指針所引用的資源。

入棧操作:

        Lua針對每種C類型,都有一個C API函數與之對應,如:

        void lua_pushnil(lua_State* L);  --nil值

        void lua_pushboolean(lua_State* L, int b); --布爾值

        void lua_pushnumber(lua_State* L, lua_Number n); --浮點數

        void lua_pushinteger(lua_State* L, lua_Integer n);  --整型

        void lua_pushlstring(lua_State* L, const char* s, size_t len); --指定長度的內存數據

        void lua_pushstring(lua_State* L, const char* s);  --以零結尾的字符串,其長度可由strlen得出。

出棧操作:

        API使用“索引”來引用棧中的元素,第一個壓入棧的為1,第二個為2,依此類推。我們也可以使用負數作為索引值,其中-1表示為棧頂元素,-2為棧頂下面的元素,同樣依此類推。

        Lua提供了一組特定的函數用于檢查返回元素的類型,如:

        int lua_isboolean (lua_State *L, int index);

        int lua_iscfunction (lua_State *L, int index);

        int lua_isfunction (lua_State *L, int index);

        int lua_isnil (lua_State *L, int index);

        int lua_islightuserdata (lua_State *L, int index);

        int lua_isnumber (lua_State *L, int index);

        int lua_isstring (lua_State *L, int index);

        int lua_istable (lua_State *L, int index);

        int lua_isuserdata (lua_State *L, int index);

        以上函數,成功返回1,否則返回0。需要特別指出的是,對于lua_isnumber而言,不會檢查值是否為數字類型,而是檢查值是否能轉換為數字類型。

如有任何疑問和建議,歡迎指出討論,謝謝~

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品悠悠久久琪琪| 国产视频综合在线| 国产精品视频免费观看www| 国产欧亚日韩视频| 91系列在线观看| 国产精品爽爽爽爽爽爽在线观看| 欧美成年人视频| 亚洲一区制服诱惑| 国产精品无码专区在线观看| 国产精品久久久久久久久久免费| 中文字幕久久久av一区| 欧美日韩成人免费| 91久久久久久久久久久| 久久久久国产视频| 热久久这里只有精品| 91精品国产自产91精品| 国产精品第一视频| 欧美国产日韩二区| 久久久久久91| 亚洲偷欧美偷国内偷| 亚洲高清一二三区| 日韩美女写真福利在线观看| 91精品一区二区| 日韩人体视频一二区| 欧美激情视频一区二区| 久久久久久免费精品| 欧美性猛交xxxx黑人猛交| 搡老女人一区二区三区视频tv| 日韩中文字幕精品| 成人黄在线观看| 久久精品2019中文字幕| 久久久久久久久电影| 成人免费在线视频网址| 国产精品91在线| 2023亚洲男人天堂| 欧美电影免费观看高清| 狠狠色狠狠色综合日日五| 亚洲精品xxx| 国产日产欧美精品| 欧美有码在线观看视频| 中文字幕视频在线免费欧美日韩综合在线看| 精品久久久中文| 日韩中文在线观看| 日韩三级影视基地| 亚洲欧洲国产一区| 欧美成人精品在线视频| 国产精品入口夜色视频大尺度| 激情久久av一区av二区av三区| 狠狠做深爱婷婷久久综合一区| 7m第一福利500精品视频| 亚洲欧美国产精品va在线观看| 2019亚洲日韩新视频| 成人黄色av播放免费| 色偷偷av一区二区三区| 国产欧美 在线欧美| 久久亚洲精品成人| 国产精品一区二区av影院萌芽| 国产噜噜噜噜噜久久久久久久久| 综合久久五月天| 久久久精品免费| 69精品小视频| 亚洲人永久免费| 久久视频国产精品免费视频在线| 超碰97人人做人人爱少妇| 97精品免费视频| 久久香蕉精品香蕉| 亚洲一区二区免费在线| 久久在线观看视频| 欧美国产日韩中文字幕在线| 久久久影视精品| 欧美在线视频网站| 97久久久久久| 日韩中文字幕免费| 神马久久桃色视频| 国内外成人免费激情在线视频网站| 97在线视频免费| 国产精品成人播放| 欧美视频一二三| 97婷婷大伊香蕉精品视频| 成年无码av片在线| 亚洲最新在线视频| 国产精品电影久久久久电影网| 亚洲mm色国产网站| 欧美日韩国内自拍| 国产精品自拍偷拍视频| 日韩在线播放一区| 亚洲欧洲美洲在线综合| 欧美成人免费在线视频| 69av成年福利视频| 欧美性猛交xxxx富婆| 亚洲专区国产精品| 国产中文字幕亚洲| 久久精品久久久久久国产 免费| 91国产视频在线播放| 九九精品在线视频| 亚洲一区中文字幕在线观看| 国产一区二区三区中文| 日韩电影免费观看中文字幕| 中文字幕亚洲综合久久| 亚洲白虎美女被爆操| 欧美精品在线极品| 欧美在线激情网| 成人免费看片视频| 久久久99久久精品女同性| 久久久精品中文字幕| 91日韩在线视频| 色777狠狠综合秋免鲁丝| 国内精品久久久久伊人av| 国产精品国产亚洲伊人久久| 人人澡人人澡人人看欧美| 亚洲人成在线一二| 久久香蕉国产线看观看网| 欧美激情一区二区三区成人| 国产精品人成电影| 精品国产一区二区三区久久狼5月| 亚洲国产精品999| 国产精品美女www爽爽爽视频| 欧美日韩激情小视频| 日韩av在线一区二区| 亚洲一区二区少妇| 亚洲国产日韩欧美综合久久| 91美女片黄在线观看游戏| 丝袜亚洲另类欧美重口| 久久久久久久久久久人体| 亚洲欧洲黄色网| 狠狠爱在线视频一区| 国产精品福利片| 欧美日韩国产综合视频在线观看中文| 日韩成人激情视频| 亚洲网址你懂得| 亚洲自拍欧美色图| 中文字幕欧美日韩精品| 亚洲一区二区久久| 欧美大全免费观看电视剧大泉洋| 欧美日韩精品在线观看| 国产精品福利无圣光在线一区| 亚洲天堂男人天堂女人天堂| 亚洲天堂av高清| www.99久久热国产日韩欧美.com| 2019中文字幕在线免费观看| 97色伦亚洲国产| 疯狂做受xxxx高潮欧美日本| 国产在线视频2019最新视频| 色爱精品视频一区| 亚洲国产精品人久久电影| 欧美亚洲一区在线| 中文字幕亚洲综合久久筱田步美| 国产在线观看91精品一区| 亚洲欧洲成视频免费观看| 日韩在线观看免费高清完整版| 6080yy精品一区二区三区| 中文字幕亚洲综合久久| 少妇高潮 亚洲精品| 欧美日韩第一页| 亚洲一区第一页| 国产欧美日韩丝袜精品一区| 日韩久久精品电影| 国产+成+人+亚洲欧洲| 欧美激情久久久久久| 亚洲成人黄色在线观看| 国产精品一区二区女厕厕| 国产精品美女www爽爽爽视频| 91精品国产自产在线老师啪| 日韩中文字幕网址|