Lua语言是如何与Lua C语言通信的?
lua利用虚拟栈与C进行数据交换。在栈中的每个元素都表示一个值(nil, string, number etc)
利用栈进行数据交换,数据采用先进后出原则。
Lua 的每个元素有两种序号进行编号。
lua利用虚拟栈与C进行数据交换。在栈中的每个元素都表示一个值(nil, string, number etc)
利用栈进行数据交换,数据采用先进后出原则。
Lua 的每个元素有两种序号进行编号。
Lua如何操作堆栈的
往栈里压值
void lua_pushboolean (lua_State *L, int b); 将Bool值压入栈
void lua_pushnumber (lua_State *L, lua_Number n); 将数值压入栈
void lua_pushstring (lua_State *L, const char *s); 将字符串压入栈
查询栈中的元素
int lua_type (lua_State *L, int index); 返回 index 索引元素的类型
类型为以下:LUA_TNIL, LUA_TNUMBER, LUA_TBOOLEAN, LUA_TSTRING, LUA_TTABLE, LUA_TFUNCTION, LUA_TUSERDATA, LUA_TTHREAD, and LUA_TLIGHTUSERDATA, LUA_TNONE
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_islightuserdata (lua_State *L, int index);
int lua_isnil (lua_State *L, int index);
int lua_isnone (lua_State *L, int index);
int lua_isnoneornil (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_isthread (lua_State *L, int index);
int lua_isuserdata (lua_State *L, int index);
返回值:是返回1,不是返回0.
获取栈内给定位置的元素值
int lua_toboolean (lua_State *L, int index);
lua_CFunction lua_tocfunction (lua_State *L, int index);
lua_Integer lua_tointeger (lua_State *L, int index);
const char *lua_tolstring (lua_State *L, int index, size_t *len);
lua_Number lua_tonumber (lua_State *L, int index);
const void *lua_topointer (lua_State *L, int index);
const char *lua_tostring (lua_State *L, int index);
lua_State *lua_tothread (lua_State *L, int index);
void *lua_touserdata (lua_State *L, int index);
设置栈顶
void lua_settop (lua_State *L, int index); 设置index索引为栈顶,index之上的元素都被清除
void lua_pushvalue (lua_State *L, int index); 将index索引的数据压入栈顶,index索引数据保留,即有两份数据
移除栈顶元素
void lua_remove (lua_State *L, int index); 删除 index 的元素,index之上的编号往下移动
向栈中插入元素
void lua_insert (lua_State *L, int index); 将栈顶出栈,插入指定 index 索引位置,之前的索引值依次向上移动。
void lua_replace (lua_State *L, int index); 将栈顶出栈,替换掉index索引位置的数据
Lua 编译为字节码
int luaL_dofile (lua_State *L,
const char *filename -- lua字节码文件,生成一个函数,并用字节码设置函数,最后将函数入栈
-- lua源文件,编译为字节码,并用字节码设置函数,最后将函数入栈
);
int luaL_loadbuffer (lua_State *L,
const char *buff, -- 将字符串的内容作为源代码进行编译,编译之后也会生成一个函数,并用字节码设置函数,最后将函数入栈
size_t sz, -- 长度
const char *name --
);
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_islightuserdata (lua_State *L, int index);
int lua_isnil (lua_State *L, int index);
int lua_isnone (lua_State *L, int index);
int lua_isnoneornil (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_isthread (lua_State *L, int index);
int lua_isuserdata (lua_State *L, int index);
返回值:是返回1,不是返回0.
获取栈内给定位置的元素值
int lua_toboolean (lua_State *L, int index);
lua_CFunction lua_tocfunction (lua_State *L, int index);
lua_Integer lua_tointeger (lua_State *L, int index);
const char *lua_tolstring (lua_State *L, int index, size_t *len);
lua_Number lua_tonumber (lua_State *L, int index);
const void *lua_topointer (lua_State *L, int index);
const char *lua_tostring (lua_State *L, int index);
lua_State *lua_tothread (lua_State *L, int index);
void *lua_touserdata (lua_State *L, int index);
设置栈顶
void lua_settop (lua_State *L, int index); 设置index索引为栈顶,index之上的元素都被清除
void lua_pushvalue (lua_State *L, int index); 将index索引的数据压入栈顶,index索引数据保留,即有两份数据
移除栈顶元素
void lua_remove (lua_State *L, int index); 删除 index 的元素,index之上的编号往下移动
向栈中插入元素
void lua_insert (lua_State *L, int index); 将栈顶出栈,插入指定 index 索引位置,之前的索引值依次向上移动。
void lua_replace (lua_State *L, int index); 将栈顶出栈,替换掉index索引位置的数据
Lua 编译为字节码
int luaL_dofile (lua_State *L,
const char *filename -- lua字节码文件,生成一个函数,并用字节码设置函数,最后将函数入栈
-- lua源文件,编译为字节码,并用字节码设置函数,最后将函数入栈
);
int luaL_loadbuffer (lua_State *L,
const char *buff, -- 将字符串的内容作为源代码进行编译,编译之后也会生成一个函数,并用字节码设置函数,最后将函数入栈
size_t sz, -- 长度
const char *name --
);
Lua执行字节码
如果异常就会抛出异常,退出整个程序
void lua_call (lua_State *L,
int nargs, -- 参数个数
int nresults -- 返回值的个数
); -- 调用之前需要将函数入栈,接着参数入栈,然后出栈,再将函数的返回值入栈
如果异常就会抛出异常,不会退出程序
int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);
调用方法:
luaL_dofile ...
lua_call ...