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

Heath's Blog

There is no end, it is just the beginning! - A Game Developer's Notes

C/C++中Lua棧的清理

    Lua中一個lua_State就對應一個lua stack,通常情況下一個lua stack就足夠了,由此便產生了與C/C++不同的地方:在C/C++中每個函數調用都會有自己對應的stack,在函數調用完成之后,便將其釋放掉,因而不需要擔心stack會無限制地生長下去;而在C/C++中使用Lua,由于所有的操作都基于同一個stack,因此需要程序員自己在代碼中做stack的清理工作。
    Lua提供了一對API來幫助程序員操縱stack:lua_gettop和lua_settop。下面給出兩種清理棧的方法:
    1)為每個操作Lua棧的C/C++函數添加一個棧頂位置參數。在調用該函數時將lua_gettop的結果作為參數傳遞,在函數調用結束時使用lua_settop以傳入的棧頂位置作為參數恢復調用前的棧頂位置。CEGUI中的script module便采用此方法,下面摘錄相關代碼:
/*************************************************************************
    Execute script code string
************************************************************************
*/

void LuaScriptModule::executeString(const String& str)
{
    
int top = lua_gettop(d_state);

    executeString_impl(str, initErrorHandlerFunc(), top);
    cleanupErrorHandlerFunc();
}


void LuaScriptModule::executeString_impl(const String& str, const int err_idx,
    
const int top)
{
    
// load code into lua and call it
    int error = luaL_loadbuffer(d_state, str.c_str(), str.length(), str.c_str()) ||
                lua_pcall(d_state, 
00, err_idx);

    
// handle errors
    if (error)
    
{
        String errMsg 
= lua_tostring(d_state,-1);
        lua_settop(d_state,top);
        
throw ScriptException("Unable to execute Lua script string: '" +
                              str 
+ "'\n\n" + errMsg + "\n");
    }


    lua_settop(d_state,top);
}

    2)利用局部變量的創建與銷毀來自動實現stack清理。下面為局部變量的類型
    struct LuaStackAutoPopup
    
{
        lua_State
*    mBackupLS;;
        
int            mPos;
        LuaStackAutoPopup( lua_State
* vpSL )
        
{
            mPos    
= lua_gettop( vpSL );
            mBackupLS    
= vpSL;
        }


        
void Popup( )
        
{
            lua_settop( mBackupLS,mPos );
            mBackupLS    
= NULL;
        }


        
~LuaStackAutoPopup( )
        
{
            
if( mBackupLS )
                lua_settop( mBackupLS,mPos );
        }

    }
;
    利用此機制,改造方法1中的executeString:
/*************************************************************************
    Execute script code string
************************************************************************
*/

void LuaScriptModule::executeString(const String& str)
{
    LuaStackAutoPopup stack(d_state);

    executeString_impl(str, initErrorHandlerFunc());
    cleanupErrorHandlerFunc();
}


void LuaScriptModule::executeString_impl(const String& str, const int err_idx)
{
    
// load code into lua and call it
    int error = luaL_loadbuffer(d_state, str.c_str(), str.length(), str.c_str()) ||
                lua_pcall(d_state, 
00, err_idx);

    
// handle errors
    if (error)
    
{
        String errMsg 
= lua_tostring(d_state,-1);
        
throw ScriptException("Unable to execute Lua script string: '" +
                              str 
+ "'\n\n" + errMsg + "\n");
    }

}

posted on 2009-04-25 15:24 Heath 閱讀(5039) 評論(1)  編輯 收藏 引用 所屬分類: Script Programming

Feedback

# re: C/C++中Lua棧的清理[未登錄] 2011-12-24 18:52 patz

對稱操作使用RAII來清理的確是一個best practice.  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美国产日韩一区二区| 国产乱码精品一区二区三区忘忧草| 亚洲黄色免费电影| 欧美不卡高清| 麻豆乱码国产一区二区三区| 久久亚洲一区二区三区四区| 免费看亚洲片| 亚洲精品欧美激情| 日韩亚洲视频| 午夜久久久久久| 久久露脸国产精品| 欧美日韩国产三级| 国产农村妇女毛片精品久久莱园子| 国产亚洲欧美日韩日本| 亚洲国产精品一区二区www在线| 亚洲精品裸体| 欧美亚洲一级片| 欧美黄色日本| 翔田千里一区二区| 欧美精品一区三区| 国产日韩欧美在线| 日韩视频在线永久播放| 性欧美超级视频| 亚洲电影欧美电影有声小说| 中文一区字幕| 欧美国产日韩a欧美在线观看| 国产精品一二| 9久re热视频在线精品| 久久久久亚洲综合| 这里只有精品在线播放| 欧美成人精品高清在线播放| 国产亚洲福利| 亚洲一区二区三区欧美| 亚洲成人直播| 久久爱www| 国产精品永久免费在线| 亚洲视频一区二区在线观看 | 久久精品中文字幕一区| 欧美mv日韩mv亚洲| 国产亚洲精品久久久久久| 在线一区亚洲| 亚洲韩国一区二区三区| 欧美一区二区三区免费观看| 欧美日韩1080p| 亚洲伦理一区| 欧美黑人多人双交| 国产主播精品| 91久久线看在观草草青青| 在线视频亚洲一区| 亚洲国产成人在线播放| 久久免费视频在线观看| 国产婷婷精品| 欧美一区午夜精品| 亚洲一区二区精品在线| 欧美视频在线观看视频极品| 亚洲毛片在线观看.| 亚洲电影欧美电影有声小说| 久久视频免费观看| 伊人成人开心激情综合网| 久久免费视频这里只有精品| 欧美一级黄色录像| 国产日韩精品在线播放| 欧美一级电影久久| 香蕉av777xxx色综合一区| 国产欧美婷婷中文| 久久精品在线观看| 久久久久久高潮国产精品视| 伊甸园精品99久久久久久| 免费成人黄色片| 你懂的视频一区二区| 亚洲精品影院在线观看| 亚洲国产精品美女| 欧美精品首页| 午夜精品福利在线观看| 欧美一进一出视频| 亚洲第一页在线| 亚洲精品免费观看| 国产精品永久| 欧美高清在线视频| 欧美日韩一区二区三区四区在线观看 | 久久久久国色av免费看影院| 午夜天堂精品久久久久| 国产在线视频欧美| 欧美成人国产| 欧美日韩国产在线观看| 欧美伊人久久久久久午夜久久久久| 欧美一区二区高清| 亚洲人成在线观看网站高清| 亚洲精选中文字幕| 国产一区美女| 亚洲精品自在久久| 国产一区二区黄| 亚洲日本激情| 国产性猛交xxxx免费看久久| 亚洲黑丝在线| 国产日韩一区二区三区在线播放| 欧美高清视频一区二区| 国产精品乱人伦中文| 女女同性女同一区二区三区91| 欧美日本一区| 老**午夜毛片一区二区三区| 欧美日韩视频免费播放| 母乳一区在线观看| 国产精品综合| 99国产麻豆精品| 在线日韩av永久免费观看| 亚洲一区www| 亚洲国产精品一区在线观看不卡| 欧美日韩国产在线观看| 久久亚洲一区二区| 国产精品福利在线| 亚洲高清在线观看| 国产一区二区成人| 夜夜嗨av一区二区三区四季av| 亚洲第一福利视频| 欧美一区二区三区久久精品茉莉花| 亚洲人成7777| 久久免费的精品国产v∧| 欧美在线看片a免费观看| 欧美日韩在线播放一区| 亚洲第一精品久久忘忧草社区| 国内综合精品午夜久久资源| 亚洲综合大片69999| 中文国产成人精品久久一| 久久在线免费观看| 久久网站免费| 国产真实乱偷精品视频免| 亚洲欧美一区二区在线观看| 亚洲综合精品自拍| 欧美色图麻豆| 一本色道久久88综合亚洲精品ⅰ | 亚洲第一页在线| 在线不卡中文字幕| 久久久久久久久久看片| 久久视频精品在线| 国产在线播精品第三| 久久成人精品无人区| 久久欧美中文字幕| 悠悠资源网亚洲青| 浪潮色综合久久天堂| 欧美ab在线视频| 亚洲经典视频在线观看| 欧美国产成人精品| 亚洲精品久久久久久久久久久久久| 亚洲黑丝一区二区| 欧美精品在线观看播放| 99riav久久精品riav| 亚洲欧美不卡| 国产亚洲精品美女| 久久久久久久欧美精品| 欧美成年视频| aa级大片欧美| 国产欧美精品一区二区色综合 | 久久久久久久久蜜桃| 国产一区二区三区无遮挡| 久久青草久久| 亚洲美女黄色| 久久精品免费| 亚洲韩国日本中文字幕| 欧美日韩免费| 欧美亚洲日本国产| 嫩草国产精品入口| 一本色道久久综合| 国产日产欧产精品推荐色| 久久亚洲综合| 中日韩男男gay无套| 久久精品国产99| 最新中文字幕亚洲| 亚洲一级片在线观看| 国产在线精品一区二区夜色| 老牛影视一区二区三区| 日韩视频―中文字幕| 欧美一区二区在线| 亚洲欧洲一区二区在线播放| 国产精品国产精品国产专区不蜜| 亚洲欧美资源在线| 亚洲国产欧美一区| 欧美一区三区二区在线观看| 亚洲人成久久| 国产有码一区二区| 国产精品99免视看9| 男男成人高潮片免费网站| 亚洲一区二区三区高清| 亚洲人成毛片在线播放女女| 久久精品人人做人人综合| 99精品国产一区二区青青牛奶| 国产女人18毛片水18精品| 欧美激情乱人伦| 久久高清一区| 亚洲一区欧美一区| 亚洲久久视频| 亚洲电影在线| 快播亚洲色图| 久久精品视频免费观看| 亚洲欧美激情视频在线观看一区二区三区| 伊人久久综合97精品| 国产日韩欧美日韩大片| 国产精品多人| 欧美视频一二三区| 欧美日韩国产小视频|