• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Lua 闭包 和upvalue

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
一、基本概念
线程的所有打开upvalue(在堆栈上的upvalue) 都存放在L->openupvalue
当前函数的upvalue 的位置有两种情况:
是父函数的local变量
是父函数的upvalue变量

二、闭包创建:
是父函数的upvalue时,那么只需要引用父函数upvalue。
是父函数的local变量 那么现在L->openupvalue 找,找到就引用。找不到创建一个连接到L->openupvalue 和g->uvhead。注意这里创建的upvalue不会链接到allgc 上。
创建闭包的虚拟指令:
OP_CLOSURE 创建闭包
for(upvalue 数量) 初始化upvalue
{
if (父函数的local变量)
OP_MOVE
else
OP_GETUPVAL
}

三、闭包关闭
OP_CLOSE:
函数关闭时,会清除自己的局部变量。如果这个局部变量是在L->openupvalue 中,那么要将他的值拷贝过去。并从L->openupvalue和g->uvhead移除加入到allgc 
例:
function fatherFun()
local a = 1
function childFun()
local x = a
end
a = 3
end
childFun创建:这时fatherFun还未关闭。

fatherFun关闭:
(1)如果fatherFun的局部变量是其他闭包的upvalue,那么拷贝栈中的值到upvalue中。

(2)从L->openupvalue和g->uvhead移除加入到allgc




C closure 跟 Lua closure 的 upvalue 有什么不同
typedef struct CClosure {
ClosureHeader;
lua_CFunction f;
TValue upvalue[1];
} CClosure;


typedef struct LClosure {
ClosureHeader;
struct Proto *p;
UpVal *upvals[1];
} LClosure;
因为LClosure 有两种状态open 和 close。当open状态是需要链接到openupvalue和uvhead 上,所有需要额外的链接指针信息。


PS:openupvalue 是与线程(L)关联的,uvhead 是全局的。

参考文章点击打开链接






















鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
lua知识点-next发布时间:2022-07-22
下一篇:
Lua 服务器客户端交互发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap