这些东西是平时遇到的, 觉得有一定的价值, 所以记录下来, 以后遇到类似的问题可以查阅, 同时分享出来也能方便需要的人, 转载请注明来自RingOfTheC[ring.of.the.c@gmail.com]

打算记录一些lua_api, 可能会觉得lua文档中已经说的很清楚了, 但是我将用自己的方式, 记录下我认为重要的东西, 先约定一下api说明的格式

编号. api作用简述

api函数原型

api操作说明

返回值说明

对栈的影响

注意事项

1.  建一个新表

void lua_createtable (lua_State *L, int narr, int nrec)
创建一个新的table, 并把它放在栈顶. narr和nrec分别指定该table的array部分和hash部分的预分配元素数量
无返回值
栈高度+1, 栈顶元素是新table
#define lua_newtable(L) lua_createtable(L, 0, 0) 常用这个
 
2. 取表中的元素
void lua_getfield (lua_State *L, int index, const char *k)
操作:   arr = Stack[index]    // arr肯定是表
        Stack.push( arr[k] )
取表中键为k的元素, 这里的表是由index指向的栈上的一个表
无返回值
栈高度+1, 栈顶元素是(Stack[index])[k]
注意, 该操作将触发 __index 元方法
 
3. 给表中的元素赋值
void lua_setfield (lua_State *L, int index, const char *k)
操作:   arr = Stack[index]
        arr[k] = Stack.top()
        Stack.pop()
给表中键为k的元素赋值value(value就是栈顶元素), 这里的表是由index指向的栈上的一个表
无返回值
栈高度-1, 被弹出的是value
注意, 该操作将触发 __newindex 元方法
 
4. 取表元素 和 表元素赋值
void lua_gettable (lua_State *L, int index)

操作:     ele  = Stack[index]

key = Stack.top()

Stack.pop()

value = ele[key]

Stack.push(value)

根据index指定取到相应的表; 取栈顶元素为key, 并弹出栈; 获取表中key的值压入栈顶.

无返回值

栈高度不变, 但是发生了一次弹出和压入的操作, 弹出的是key, 压入的是value

注意, 该操作将触发 __index 元方法

void lua_settable (lua_State *L, int index)
操作:   ele    = Stack[index]
        value  = Stack.top()
        Stack.pop()
        key    = Stack.top()
        Stack.pop()
        ele[key] = value
根据index指定取到相应的表; 取栈顶元素做value, 弹出之; 再取当前栈顶元素做key, 亦弹出之; 然后将表的键为key的元素赋值为value
无返回值
栈高度-2, 第一次弹出value, 第二次弹出key
注意, 该操作将触发 __newindex 元方法
 
5. 对table的一些操作[不引发原方法]
void lua_rawget (lua_State *L, int index)

和lua_gettable操作一样

但是不触发相应的元方法

void lua_rawgeti(lua_State *L, int index, int n)

操作:   ele = Stack[index]

value = ele[n]

Stack.push(value)

无返回值

栈+1, 栈顶新增元素就是 value

不触发相应的元方法

void lua_rawset (lua_State *L, int index) 

和lua_settable操作一样

但是不触发相应的原方法

void lua_rawseti (lua_State *L, int index, int n) 

操作:   ele = Stack[index]

value = Stack.top()

Stack.pop()

ele[n] = value

无返回值

栈-1, 栈顶将value弹出

不触发相应的元方法

6. 复制栈上元素并压入栈

void lua_pushvalue (lua_State *L, int index)

操作:   value = Stack[index]

Stack.push(value)

无返回值

栈+1

7. 创建一个元表

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

操作:   1. 在注册表中查找tname, 如果已经注册, 就返回0, 否者继续, 并平栈

lua_getfield(L, LUA_REGISTRYINDEX, tname)

if (!lua_isnil(L, -1))

return 0;

lua_pop(L, 1);

2. 创建一个表, 并注册, 返回1

lua_newtable(L)

lua_pushvalue(L, -1)

lua_setfield(L, LUA_REGISTRYINDEX, tname)

return 1

有返回值
栈+1, 栈顶元素是在注册表中注册过的新表
 
8. 创建C值
void *lua_newuserdata (lua_State *L, size_t size)

该函数分配一块由size指定大小的内存块, 并放在栈顶

返回值是新分配的块的地址

栈+1, 栈顶是userdata

userdata用来在lua中表示c中的值. 一个完整的userdata有自己的元表, 在垃圾回收时, 可以调用它的元表的__gc方法

9. 注册c函数到lua中, 其实没有这回事, lua中只有c闭包

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

向栈上压一个C闭包

当一个c函数被创建时, 可以绑定几个值在它上面, 从而形成一个闭包.  在任何时刻调用这个c函数时, 都可以访问这几个绑定值.

绑定的方法: 先一次压入要绑定的n个值到栈上, 然后调用lua_pushcclosure(L, fn, n)这样就形成的一个c闭包

无返回值

栈 –(n - 1) , 一共弹出n个元素(及那些绑定的值), 压入一个cclosure

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

#define lua_register(L, n, f) (lua_pushcfunction(L, f), lua_setglobal(L, n))

没有返回值

栈不变化

这个是比较常用的, 以n为lua中的key压入一个0个绑定值的cclosure.

Lua API 小记1的更多相关文章

  1. lua API 小记2

    1. 创建lua虚拟机 lua_State *lua_newstate (lua_Alloc f, void *ud) 创建一个新的独立的lua虚拟机. 参数指定了内存分配策略及其参数, 注意, 让用 ...

  2. Lua,Lua API,配置文件

    想像一个场景:你的c程序须要有一个窗体,你想让用户能够自己定义窗体大小.方法非常多.比方使用环境变量,或键值对的文件. 无论如何,你须要解析它. 使用lua配置文件是个不错的选择. 首先,你能够定义例 ...

  3. lua API函数大全

    Lua5.1中的API函数 lua_State* luaL_newstate()Lua脚本的编译执行是相互独立的,在不同的线程上执行.通过luaL_newstate()函数可以申请一个虚拟机,返回指针 ...

  4. 【精选】Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解

    源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用 ...

  5. lua api 官方文档 函数后面的方括号 说明 [-0, +0, –]

    本博客注有“转”字样的为转载文章,其余为本人原创文章,转载请务必注明出处或保存此段.c++/lua/windows逆向交流群:69148232 每一个lua api 函数结尾都给出了这样的说明例如: ...

  6. Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解

    源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用 ...

  7. 高并发 Nginx+Lua OpenResty系列(2)——Nginx Lua API

    Nginx Lua API 和一般的Web Server类似,我们需要接收请求.处理并输出响应.而对于请求我们需要获取如请求参数.请求头.Body体等信息:而对于处理就是调用相应的Lua代码即可:输出 ...

  8. (一)chrome扩展 - API小记

    browserAction 设置browser action的badge文字,badge 显示在图标上面 chrome.browserAction.setBadgeText({text:"i ...

  9. DOM BOM 常用API小记

    DOM 1.元素节点: 元素节点element: 更精确的获得元素的标签名(全大写) 属性节点attribute: 属性名 文本节点text: #text 注释节点document:#document ...

随机推荐

  1. Golang:使用 httprouter 构建 API 服务器

    https://medium.com/@gauravsingharoy/build-your-first-api-server-with-httprouter-in-golang-732b7b01f6 ...

  2. JavaScript HTML Dom改变HTML

    本人为小白,首次写博客  有不正确的地方望多多指点与见谅!! 一,改变HTML的内容 语法: document.getElementById(id).innerHTML=new HTML: 具体用法: ...

  3. Rolling Hash(Rabin-Karp算法)匹配字符串

    您可以在我的个人博客中访问此篇文章: http://acbingo.cn/2015/08/09/Rolling%20Hash(Rabin-Karp%E7%AE%97%E6%B3%95)%E5%8C%B ...

  4. mysql 中select for update 锁表的范围备注

    mysql的锁表范围测试 1.主键明确时,行级锁: 解释:指定主键并且数据存在时,仅锁定指定的行,其它行可以进行操作 实例:指定了锁定id=1的行且数据存在①,在更新1时lock wait超时②,但是 ...

  5. 使用Aspose.Cells利用模板导出Excel(C#)

    前言 随着互联网的流行,web项目逐渐占据主流.我相信大部分人开发项目的过程中都写过上传以及导出Excel和Word的功能,本文仅讨论导出Excel.C#中有很多第三方组件支持导出Excel,比如:N ...

  6. 本地连接 vmware服务器

    在本机中装载虚拟机,安装redhat.需要调试使用redhat可以与Windows进行通讯. 分为多步,在此前提下,默认你已经安装好且可以vm 和虚拟机 1:点击虚拟机>设置>添加网络适配 ...

  7. 理解vue中的scope的使用

    理解vue中的scope的使用 我们都知道vue slot插槽可以传递任何属性或html元素,但是在调用组件的页面中我们可以使用 template scope="props"来获取 ...

  8. LeetCode 245. Shortest Word Distance III (最短单词距离之三) $

    This is a follow up of Shortest Word Distance. The only difference is now word1 could be the same as ...

  9. celery rabbit mq 详解

    Celery介绍和基本使用 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, ...

  10. swift之函数式编程(三)

    文章来源于<Functional Programing in Swift>,本系列仅仅是观后概括的一些内容 Wrapping Core Image 上一篇文章我们介绍了 高阶函数并且展示了 ...