2021-12-17 · 学动漫、设计、电竞、电商、短视频、软件等
1.有读取器函数, 每次它需要一块新的代码块的时候, lu a_load 就调用读取器, 每次都会传入一个参数 data 。 读取器需要返回含有新的代码块的一块内存的指针, 并把 size 设为这块内存的大小。 内存块必须在下一次函数被调用之前一直存在。 读取器可以通过返回 NULL 或设 size 为 0 来指示代码块结束。 读取器可能返回多个块,每个块可以有任意的大于零的尺寸。
2.从给定有效索引处移除一个元素, 把这个索引之上的所有元素移下来填补上这个空隙。 不能用伪索引来调用这个函数,因为伪索引并不指向真实的栈上的位置。
把栈顶元素放置到给定位置而不移动其它元素 (因此覆盖了哪个位置处的值),然后将栈顶元素弹出。
3.在给定线程中启动或延续一条协程 。
要启动一个协程的话, 你需要把主函数以及它需要的参数压入线程栈; 然后调用 lu a_resume , 把 nargs 设为参数的个数。 这次调用会在协程挂起时或是结束运行后返回。 当函数返回时,堆栈中会有传给 lu a_yield 的所有值, 或是主函数的所有返回值。 当协程让出, lu a_resume 返回 LUA_YIELD , 若协程结束运行且没有任何错误时,返回 0 。 如果有错则返回错误代码ua_pcall )。
在发生错误的情况下, 堆栈没有展开, 因此你可以使用调试 API 来处理它。 错误消息放在栈顶在。
4.要延续一个协程, 你需要清除上次 l ua_yield 遗留下的所有结果, 你把需要传给 yield 作结果的值压栈, 然后调用 l ua_resume 。
参数 from 表示协程从哪个协程中来延续 L 的。 如果不存在这样一个协程,这个参数可以是 NULL 。
l ua_rotate
void l ua_rotate (lua_State *L, int idx, int n);
把从 idx 开始到栈顶的元素轮转 n 个位置。 对于 n 为正数时,轮转方向是向栈顶的; 当 n 为负数时,向栈底方向轮转 -n 个位置。 n 的绝对值不可以比参于轮转的切片长度大。
把指定状态机的分配器函数换成带上用户数据 ud 的 f 。
l ua_setfield
void lua_setfield (l ua_State *L, int index, const char *k);
做一个等价于 t[k] = v 的操作, 这里 t 是给出的索引处的值, 而 v 是栈顶的那个值。
这个函数将把这个值弹出栈。 跟在 Lua 中一样,这个函数可能触发一个 "newindex" 事件的元方法