Lua源码揭秘(五)绑定Lua之前你需要知道的

来源:互联网 发布:淘宝新规则2017 编辑:程序博客网 时间:2024/06/09 07:03

lapi.c和lauxlib.c里包含了大部分的lua的capi。所谓capi是指在c形式的api接口,可以在c/c++/c#/…中可以调用到的api,但是lua中并不一定有对应的方法。ldebug.c里有一些调试用的capi(后续文章会介绍)。另外一些capi,便是打开lua库函数的capi,在lualib.h里集中声明。

lapi.c

基础的capi。

state相关

lua_checkstatck

检查栈的深度,如果没有超过最大深度便会扩充栈,否则返回0(交给上层处理)。

lua_xmove

将n个对象从一个状态(协程)移动到另一个状态(协程)上。

lua_setlevel

设置状态(协程)的调用层次,用于resume。

lua_atpanic

设置状态(协程)的内部错误处理方法。

lua_newthread

新建一个状态(协程)。

stack相关

lua_gettop

获取栈顶,一般用于检查参数个数。

lua_settop

设置栈顶,一般用于设置返回值个数。之前的文章在编写库函数的时候,会返回一个返回值数量,这个数量要与当前函数栈的深度一致,否则会出问题。

lua_remove

在函数栈的某个位置上移除对象。

lua_insert

在函数栈的某个位置上插入对象。

lua_replace

在函数栈的某个位置上替换成当前栈顶的对象。

lua_pushvalue

最常用的,在栈顶上压入对象,与之对应的是lua_pop,实际上就是lua_settop(宏定义)。

type相关

lua_type

类型:0-nil,1-bool,2-lightuserdata,3-number,4-string,5-table,6-function,7-userdata,8-thread。-1代表啥也没有(不是nil)。

lua_typename

类型名,lua里的type方法实际上调用了上面二者。

lua_iscfunction

是否是c方法。

lua_isnumber

是否是number,或者可以转换成number。

lua_isstring

是否是string或者number。

lua_isuserdata

是否是userdata或lightuserdata。

lua_rawequal

绕过元方法判断是否相等。

lua_equal

(如果有,便使用元方法)判断是否相等。

lua_lessthan

(如果有,便使用元方法)判断是否小于。

lua_tonumber

转换成number(失败返回0)。

lua_tointeger

转换成number并向下取整(失败返回0),64位下返回值类型为int64,只有52-53位精度(有机会再细说)。32位下返回值为int,没有损失精度。

lua_toboolean

如果是false或nil或0返回false,否则返回true。

lua_tolstring

转换成字符串并获取长度。

lua_objlen

获取对象的长度,暂时可以认为与#操作符类似。

lua_tocfunction

转换成c方法,失败返nil。

lua_touserdata

转换成userdata或lightuserdata,失败返nil。

lua_tothread

转换成状态(协程),失败返nil。

lua_topointer

转换成指针。

push相关

lua_pushnil

压入nil。

lua_pushnumber

压入number。

lua_pushinteger

压入向下取整的number。

lua_pushlstring

压入string,附带长度信息。

lua_pushstring

压入string,长度信息自己算。

lua_pushvfstring

压入格式化变参的string。

lua_pushfstring

压入格式化变参的string,与上面的并没什么区别,只不过上面的是为了兼用上层调用的变参(详情请搜索va_list)。

lua_pushcclosure

压入c方法,并根据栈上的参数创建闭包。

lua_pushboolean

压入bool。

lua_pushlightuserdata

压入lightuserdata。

lua_pushthread

压入状态(协程)。

获取Lua->stack

lua_gettable

获取栈上的table的某个字段,键为栈顶对象。

lua_getfield

获取栈上的table的某个字段。

lua_rawget

绕过元表获取table的元素,键为栈顶的对象。

lua_rawgeti

绕过元表获取数组类型table的元素。

lua_createtable

新建一个table

lua_getmetatable

获取元表,如果不是table或userdata,那么获取该类型的元表。

lua_getfenv

获取环境变量table。

设置stack->Lua

lua_settable

设置栈上的table的某个字段,键和值为栈顶前两个对象。

lua_setfield

设置栈上的table的某个字段,值为栈顶对象。

lua_rawset

绕过元表设置table的元素,键和值为栈顶前两个对象。

lua_rawseti

绕过元表设置table的元素,值为栈顶对象。

lua_setmetatable

设置元表,如果不是table或userdata,那么为该类型的设置元表。

lua_setfenv

设置环境变量table。

load & call

lua_call

调用方法。

lua_pcall

类似lua的方法xpcall,保护调用。

lua_cpcall

保护调用c方法,可传入一个指针作为参数。

lua_load

加载lua代码。

lua_dump

加载lua字节码。

lua_status

返回状态(协程)的状态。

其他

lua_gc

垃圾回收。

lua_error

报错

lua_next

获取table的下一对键值。从nil开始。

lua_concat

拼接字符串。

lua_getallocf

获取内存分配函数。

lua_setallocf

设置内存分配函数。

lua_newuserdata

新建userdata。

lua_getupvalue

获取upvalue。

lua_setupvalue

设置upvalue。

lauxlib.c

扩展的capi

error相关

luaL_argerror

参数错误,将一些字符串的拼接起来组成错误信息,最后调用luaL_error。

luaL_typerror

类型错误,同上。

luaL_where

获取并拼接方法的信息。

luaL_error

缺省错误,提供格式化变参。

type相关

luaL_checkoption

检查参数列表,如失败便报错。

luaL_newmetatable

为全局对象新建元表。

luaL_checkudata

检查全局对象是否与传入的userdata相同,如失败便报错。

luaL_checkstack

检查栈空间,如失败便报错。

luaL_checktype

检查类型,如失败便报错。

luaL_checkany

检查是否有参数,如失败便报错。

luaL_checklstring

检查string,如失败便报错。

luaL_optlstring

检查string,如失败使用缺省值。

luaL_checknumber

检查number,如失败便报错。

luaL_optnumber

检查number,如失败使用缺省值。

luaL_checkinteger

检查“integer”,如失败便报错。

luaL_optinteger

检查“integer”,如失败使用缺省值。

meta相关

luaL_getmetafield

获取元表字段。

luaL_callmeta

调用元方法。

lib相关

luaL_register

注册库函数。

luaL_gsub

替换字符串。

luaL_findtable

根据路径查询table,路径形式可能为aa.bb.cc,一次查找aa、bb、cc,如果没有则新建。

buffer相关

luaL_prepbuffer

准备缓冲区。

luaL_addlstring

将string加入缓冲区,附带长度信息。

luaL_addstring

将string加入缓冲区,长度自己算。

luaL_pushresult

将buffer里的字符串拼接起来,压入栈中。

luaL_addvalue

将栈顶对象加入缓冲区。

luaL_buffinit

初始化缓冲区。

ref相关

luaL_ref

添加对某个对象的引用,方便获取某个对象。

luaL_unref

取消对某个对象的引用。

load相关

luaL_loadfile

加载文件,并解析。

luaL_loadbuffer

加载源码/字节码字符串,并解析。

luaL_loadstring

同上。

state相关

luaL_newstate

新建一个状态(协程)。

参考文献

https://www.codingnow.com/2000/download/lua_manual.html

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 报个税工资报少了怎么办 医院预约单丢了怎么办 肛瘘手术后太疼怎么办 低位保肛手术后吻合口瘘怎么办 做完痔疮手术后大便困难怎么办 20岁长痔疮了怎么办 孕妇痔疮痒的难受怎么办 痔疮术后伤口不愈合怎么办 剖腹产液化伤口长的慢怎么办 内痔斑痕怎么办了能消化 油条面和稀了怎么办 解脲支原体感染怀孕怎么办 怀孕了检查出解脲支原体感染怎么办 大便是黑色的要怎么办 大人直肠给药不好意思怎么办 肛周脓肿长肉芽怎么办 二岁宝宝有直肠息肉怎么办 87岁老人得直肠息肉怎么办 做b超查出囊肿怎么办 解大便时肛门痒怎么办 生完孩子肛门痒怎么办 把达克宁软膏摸到肛门怎么办 痔疮手术后肛门痒怎么办 便秘拉完屁股疼怎么办 屁股拉屎拉破了怎么办 6岁小朋友屁眼痒怎么办 孩子屁屁偶尔痒怎么办 1岁半宝宝屁眼痒怎么办 3岁宝宝肛门痒怎么办 得痔疮发烧了怎么办啊 痔疮手术后肚子胀气怎么办 乙肝引起的发烧头痛怎么办 肠癌手术后吃了会胃疼怎么办 来月经肛门坠痛怎么办 总想排便还有血怎么办 闻了别人的口臭怎么办 有内痔肛门经常不舒服怎么办 做完肠镜肛门疼怎么办 3周宝宝得皮彦怎么办 痔疮有蚕豆大了怎么办 顺生肛门坠胀怎么办