Luaスタックに値を積むことができる数には上限があります.
スタックサイズの上限を超えて値を積むとスタックオーバーフローとなってしまいます.
通常はLUA_MINSTACK個(20に設定されている)だけスタックに値を積むことができます.
普通に使う分にはスタックの容量を気にする必要はないですが,
もし大量の値を積みたい場合は注意が必要です.
次のサンプルコードはスタックオーバーフローが発生する例です.
#include <stdio.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
int main (void)
{
//このコードはエラーが発生する
int i=0;
lua_State* L = luaL_newstate();
for(i=0; i < 100; i++) {
lua_pushnumber(L, i + 1);
}
lua_close(L);
return 0;
}
スタックの容量を増やすにはlua_checkstack関数を使用します.
int lua_checkstack (lua_State* L, int extra)
この関数はスタックにextra個の値の空きがあることを保障するための関数です.
つまりスタックの容量を伸ばすための関数です.
extra個だけ値を積むことができることが保障できればtrue(=1)を返し,
そうでなければfalse(=0)を返します.
先ほどのエラーが発生したコードにlua_checkstack関数を加えると正常に動作します.
#include <stdio.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
void dumpStack(lua_State* L)
{
(略)
}
int main (void)
{
int i=0;
lua_State* L = luaL_newstate();
if( lua_checkstack(L, 100) == 0 ) {
printf("スタックの容量が確保できませんでした\n");
return 1;
}
for(i=0; i < 100; i++) {
lua_pushnumber(L, i + 1);
}
dumpStack(L);
lua_close(L);
return 0;
}
実行結果
Stack[100- number] : 100.000000
Stack[99- number] : 99.000000
(略)
Stack[ 3- number] : 3.000000
Stack[ 2- number] : 2.000000
Stack[ 1- number] : 1.000000