青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

   C++ 技術中心

   :: 首頁 :: 聯系 ::  :: 管理
  160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

公告

鄭重聲明:本BLOG所發表的原創文章,作者保留一切權利。必須經過作者本人同意后方可轉載,并注名作者(天空)和出處(CppBlog.com)。作者Email:coder@luckcoder.com

留言簿(27)

搜索

  •  

最新隨筆

最新評論

評論排行榜

lua_newtable

void lua_newtable (lua_State *L);

創建一個空 table ,并將之壓入堆棧。 它等價于 lua_createtable(L, 0, 0) 。

 

lua_gettop

int lua_gettop (lua_State *L);

返回棧頂元素的索引。 因為索引是從 1 開始編號的, 所以這個結果等于堆棧上的元素個數(因此返回 0 表示堆棧為空)。

 

luaL_newmetatable

int luaL_newmetatable (lua_State *L, const char *tname);

如果注冊表中已經有Key為tname的數據則返回0. 否則創建一個新表作為userdata的metatable,并在注冊表中注冊它然后返回1. 不過兩種情況都會把注冊表中tname相關的值壓入堆棧。

luaL_checkudata

void *luaL_checkudata (lua_State *L, int narg, const char *tname);

Checks whether the function argument narg is a userdata of the type tname (see luaL_newmetatable).

lua_pushstring

void lua_pushstring (lua_State *L, const char *s);

把指針 s 指向的以零結尾的字符串壓棧。 Lua 對這個字符串做一次內存拷貝(或是復用一個拷貝), 因此 s 處的內存在函數返回后,可以釋放掉或是重用于其它用途。 字符串中不能包含有零字符;第一個碰到的零字符會認為是字符串的結束。

 

lua_pushlstring

void lua_pushlstring (lua_State *L, const char *s, size_t len);

把指針 s 指向的長度為 len 的字符串壓棧。 Lua 對這個字符串做一次內存拷貝(或是復用一個拷貝), 因此 s 處的內存在函數返回后,可以釋放掉或是重用于其它用途。 字符串內可以保存有零字符。

 

lua_pushvalue

void lua_pushvalue (lua_State *L, int index);

把堆棧上給定有效處索引處的元素作一個拷貝壓棧。

 

lua_settable

void lua_settable (lua_State *L, int index);

作一個等價于 t[k] = v 的操作, 這里 t 是一個給定有效索引 index 處的值, v 指棧頂的值, 而 k 是棧頂之下的那個值。

這個函數會把鍵和值都從堆棧中彈出。 和在 Lua 中一樣,這個函數可能觸發 "newindex" 事件的元方法 (參見 §2.8)。

                                                                                                                                                                                                                                                                      

lua_pushcfunction

void lua_pushcfunction (lua_State *L, lua_CFunction f);

將一個 C 函數壓入堆棧。 這個函數接收一個 C 函數指針,并將一個類型為 function 的 Lua 值 壓入堆棧。當這個棧定的值被調用時,將觸發對應的 C 函數。

注冊到 Lua 中的任何函數都必須遵循正確的協議來接收參數和返回值 (參見 lua_CFunction)。

lua_pushcfunction 是作為一個宏定義出現的:

      #define lua_pushcfunction(L,f) lua_pushcclosure(L,f,0)

 

 

lua_setmetatable

int lua_setmetatable (lua_State *L, int index);

把一個 table 彈出堆棧,并將其設為給定索引處的值的 metatable 。

 

lua_pushcclosure

void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);

把一個新的 C closure 壓入堆棧。

當創建了一個 C 函數后,你可以給它關聯一些值,這樣就是在創建一個 C closure (參見 §3.4); 接下來無論函數何時被調用,這些值都可以被這個函數訪問到。 為了將一些值關聯到一個 C 函數上, 首先這些值需要先被壓入堆棧(如果有多個值,第一個先壓)。 接下來調用 lua_pushcclosure 來創建出 closure 并把這個 C 函數壓到堆棧上。 參數 n 告之函數有多少個值需要關聯到函數上。 lua_pushcclosure 也會把這些值從棧上彈出。

 

lua_newuserdata

void *lua_newuserdata (lua_State *L, size_t size);

這個函數分配分配一塊指定大小的內存塊, 把內存塊地址作為一個完整的 userdata 壓入堆棧,并返回這個地址。

userdata 代表 Lua 中的 C 值。 完整的 userdata 代表一塊內存。 它是一個對象(就像 table 那樣的對象): 你必須創建它,它有著自己的元表,而且它在被回收時,可以被監測到。 一個完整的 userdata 只和它自己相等(在等于的原生作用下)。

當 Lua 通過 gc 元方法回收一個完整的 userdata 時, Lua 調用這個元方法并把 userdata 標記為已終止。 等到這個 userdata 再次被收集的時候,Lua 會釋放掉相關的內存。

 

lua_touserdata

void *lua_touserdata (lua_State *L, int index);

如果給定索引處的值是一個完整的 userdata ,函數返回內存塊的地址。 如果值是一個 light userdata ,那么就返回它表示的指針。 否則,返回 NULL 

 

 

Lua調用C++類要點:

1.       為此類建立一個全局表,表名為類名tbClass;

lua_newtable(L);

int methods = lua_gettop(L);

lua_pushstring(LT::className);

lua_pushvalue(Lmethods);

lua_settable(LLUA_GLOBALSINDEX);

 

 

2.注冊一個key為T::className的metatable,并制定其中的一些成員,用于之后生成的userdata。

// 這個表用于userdata(T的對象)的metatable

          luaL_newmetatable(LT::className);

          int metatable = lua_gettop(L);

         // metatable["__index"] = tbClass

         lua_pushliteral(L"__index");

         lua_pushvalue(Lmethods);

         lua_settable(Lmetatable);

// metatable["__tostring"] = tostring_T

         lua_pushliteral(L"__tostring");

         lua_pushcfunction(Ltostring_T);

         lua_settable(Lmetatable);

     // metatable["__gc"] = gc_T

         lua_pushliteral(L"__gc");

         lua_pushcfunction(Lgc_T);

         lua_settable(Lmetatable);

 

 

 

3. 為此表指定成員,每個成員的key為類的成員函數名,Value為一個帶有閉包的統一函數。比如tbClass[FunName] = thunk,之后可以根據閉包得到具體是調用到哪個函數。閉包中有函數名和相應函數的組合結構(以lightuserdata的形式賦給閉包)。這些類成員函數參數都必須包括lua_State,因為它需要的參數都會在lua堆棧中。

// 為tbClass填充成員函數

         for (RegType *l = T::methodsl->namel++)

         {

              /* edited by Snaily: shouldn't it be const RegType *l ... ? */

              lua_pushstring(Ll->name);

// 把(函數名,函數地址)pair以lightuserdata的形式作為C closure的upvalue入棧

              lua_pushlightuserdata(L, (void*)l);

// 把一個新的C closure 壓入堆棧。為upvalue的個數,并指定回調函數統一為thunk    lua_pushcclosure(Lthunk, 1);         

// tbClass[FunName] = Function

lua_settable(Lmethods);

         }

 

4.創建C對象給腳本使用b = Account.new(Account, 30); new是tbClass下的一個函數(另外指定的,不會掉到thunk,這一句會調用到C的一個函數,里面會生成一個C對象,然后創建一個userdata 用于關聯到這個新生成的C對象。最后為這個userdata綁定上我們上面注冊為T::classname的metatable。因為定制了metatable的__index成員,所以當userdata找不到的成員會去調用__index,因為之前我們把__index綁定到tbClass,所以也會調用到tbClass的相應成員。

 

     // 創建一個新的T對象,并創建一個基于userdataType的userdata,其中保護了指向T對象的指針

     static int new_T(lua_State *L)

     {

         lua_remove(L, 1);   // use classname:new(), instead of classname.new()

         T *obj = new T(L); // call constructor for T objects

         userdataType *ud =

              static_cast<userdataType*>(lua_newuserdata(Lsizeof(userdataType)));

         ud->pT = obj// store pointer to object in userdata

         luaL_getmetatable(LT::className); // lookup metatable in Lua registry

         lua_setmetatable(L, -2);

         return 1; // userdata containing pointer to T object

     }

 

5. 當腳本中指定函數被調用的時候,比如b:deposit(50.30)的時候,b是userdata,它的metatable的__index和tbClass綁定(見4),所以會調用到tbClass的相應成員,就是之前關聯的thunk:這個時候L的堆棧里面有這個函數的兩個參數,一個是b本身,一個是50.30。b是userdata,可以根據它取出對象的指針。見第4步。另外函數被調用的時候,它相關的upvalue也可以取得到,見步驟3。有了對象指針和相應的函數,調用也不為難了,記住參數50.30是保存在堆棧中傳給類的成員函數來取得。

// 所有成員函數都會調用到這里,然后根據upvalue來執行具體的成員函數

     static int thunk(lua_State *L)

     {

         // stack has userdata, followed by method args

         T *obj = check(L, 1); // the object pointer from the table at index 0.

         lua_remove(L, 1); // remove self so member function args start at index 1

         // get member function from upvalue

         RegType *l = static_cast<RegType*>(lua_touserdata(Llua_upvalueindex(1)));

         return (obj->*(l->mfunc))(L); // call member function

     }

     // 根據指定位置narg獲得對象指針,這個userdata是在new_T的時候創建的

     static T *check(lua_State *Lint narg)

     {

         void *pUserData = luaL_checkudata(LnargT::className);   

         userdataType *ud = static_cast<userdataType*>(pUserData);    // 這個是函數的upvalue

         if(!ud)

              luaL_typerror(LnargT::className);

         return ud->pT;

     }

 

posted on 2014-06-27 15:34 C++技術中心 閱讀(2214) 評論(0)  編輯 收藏 引用 所屬分類: 其他編程
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩在线不卡一区| 欧美影院成年免费版| 久久久久久**毛片大全| 亚洲一区二区三区午夜| 91久久久在线| 欧美成在线视频| 久久午夜视频| 久久青草欧美一区二区三区| 国产精品美女午夜av| 欧美日本在线播放| 欧美福利小视频| 欧美日韩国产探花| 国产麻豆一精品一av一免费| 国产欧美日韩免费| 国外成人在线视频| 亚洲精品综合久久中文字幕| 亚洲一区二区三区在线观看视频| 性8sex亚洲区入口| 欧美高清在线视频观看不卡| 99热这里只有精品8| 亚洲午夜羞羞片| 欧美一区二区三区四区在线观看地址 | 亚洲视频在线观看视频| 亚洲人成网在线播放| 欧美aⅴ99久久黑人专区| 亚洲国产经典视频| 亚洲天堂成人在线观看| 久久字幕精品一区| 国产模特精品视频久久久久| 亚洲第一精品福利| 欧美高清一区| 久久高清一区| 国产一区二区精品丝袜| 亚洲欧美国产制服动漫| 性做久久久久久免费观看欧美| 精品成人在线| 99热精品在线观看| 黄色一区二区在线| 欧美风情在线观看| 国产精品国码视频| 久久精品国产精品亚洲精品| 午夜精品久久久久久久| 伊人久久亚洲热| 麻豆av一区二区三区| 欧美顶级少妇做爰| 亚洲天堂男人| 国产精品爽爽爽| 亚洲第一精品夜夜躁人人躁| 夜夜嗨av一区二区三区网站四季av| 国产精品一区二区在线| 亚洲精品欧美在线| 噜噜噜躁狠狠躁狠狠精品视频 | 国产香蕉97碰碰久久人人| 亚洲一区二区成人在线观看| 亚洲国产精品一区二区www在线 | 亚洲久久一区二区| 欧美成人资源网| 亚洲国产成人久久综合| 麻豆亚洲精品| 久久免费黄色| 在线观看欧美成人| 欧美xxx在线观看| 久久综合九色| 亚洲精品一区二区三| 亚洲第一黄色| 欧美精品午夜视频| 亚洲一区二区视频| 亚洲综合精品自拍| 国产一区二区欧美| 猛干欧美女孩| 欧美成年人网| 亚洲视频免费观看| 亚洲欧美日韩中文视频| 国内精品久久久久影院优| 玖玖玖免费嫩草在线影院一区| 久久精品视频免费播放| 亚洲国产天堂久久综合| 亚洲精品国产视频| 国产精品美女主播在线观看纯欲| 久久黄色级2电影| 麻豆av一区二区三区| 99国产精品久久久久久久久久 | 美女网站在线免费欧美精品| 91久久夜色精品国产网站| 亚洲精品综合精品自拍| 国产精品视频久久一区| 久久资源av| 欧美日韩日本网| 久久激情五月婷婷| 久久一区欧美| 亚洲视频网在线直播| 亚洲欧美文学| 亚洲美女精品久久| 欧美一区二区三区在线视频| 亚洲国产精品久久91精品| 日韩一级网站| 在线免费观看视频一区| 一区二区三区视频在线| 在线免费观看成人网| 一区二区三区你懂的| 激情成人综合网| 亚洲精品乱码久久久久久久久| 欧美亚韩一区| 亚洲经典一区| 亚洲午夜激情在线| 亚洲日韩视频| 久久国产精品一区二区| 中国成人亚色综合网站| 久久午夜视频| 久久精品国产精品亚洲综合| 欧美日韩三级视频| 欧美风情在线| 国产精品亚洲成人| 亚洲精品偷拍| 91久久精品国产| 欧美与黑人午夜性猛交久久久| 亚洲一区二区视频| 欧美日韩国产高清| 欧美国产一区二区| 激情综合激情| 欧美伊人久久大香线蕉综合69| 亚洲欧美日韩直播| 欧美日韩国产区一| 亚洲国产小视频在线观看| 在线欧美电影| 久久久久看片| 麻豆国产精品va在线观看不卡| 国产精品美女www爽爽爽视频| 日韩小视频在线观看专区| 亚洲免费观看在线观看| 欧美大片免费久久精品三p | 久久久久久久一区二区三区| 欧美视频三区在线播放| 亚洲精品视频免费观看| 亚洲伦伦在线| 欧美久久久久久久久| 91久久夜色精品国产九色| 亚洲精品日产精品乱码不卡| 美女主播精品视频一二三四| 免费视频一区二区三区在线观看| 韩日午夜在线资源一区二区| 欧美在线国产精品| 卡一卡二国产精品| 91久久精品日日躁夜夜躁国产| 麻豆精品网站| 亚洲精品一区中文| 午夜精品剧场| 国产在线视频欧美| 美女图片一区二区| 亚洲毛片在线看| 欧美日在线观看| 欧美不卡在线视频| 国产精品综合av一区二区国产馆| 日韩一级视频免费观看在线| 免费观看成人| 久久久久久高潮国产精品视| 国内精品久久久久久久影视麻豆 | 欧美午夜一区二区| 一本久久青青| 精品1区2区3区4区| 久久色在线观看| 美女主播一区| 日韩亚洲欧美中文三级| 99亚洲精品| 欧美/亚洲一区| 欧美国产乱视频| 国产精品日韩欧美一区二区三区| 免费高清在线一区| 欧美成人高清| 亚洲图片欧美午夜| 黄色成人在线网站| 欧美日韩国产综合视频在线| 亚洲欧美日本日韩| 亚洲国产欧美另类丝袜| 亚洲欧美精品一区| 亚洲高清激情| 国产精品网站一区| 欧美高清视频一区二区| 性娇小13――14欧美| 亚洲精品小视频在线观看| 久久精品国产96久久久香蕉| 一区二区冒白浆视频| 一区在线播放视频| 国产精品久久久久一区二区三区 | 久久xxxx| 亚洲图片在线观看| 亚洲国产另类久久精品| 久久久99久久精品女同性| 日韩亚洲欧美成人| 激情伊人五月天久久综合| 国产精品国内视频| 欧美日韩黄视频| 欧美成人69| 你懂的亚洲视频| 久久久久久久91| 久久精品成人一区二区三区蜜臀 | 国产一区二区三区最好精华液| 欧美日韩不卡一区| 欧美大香线蕉线伊人久久国产精品| 亚洲欧美日韩综合aⅴ视频|