逆向分析Lua语言特性的设计与实现(一):闭包

一、Lua闭包
若将一个函数写在另外一个函数内部,那么这个位于内部的函数便可以访问外部函数中的局部变量,这个特性称之为closure,中文翻译为“闭包”。

二、实践分析闭包的实现
(一)、实例1:Lua指令逆向分析
function newCounter()
local i = 0
    return function()
        i = i+1
       return i
   end
end

c1= newCounter()
print(c1())
print(c1())

ChunkSpry交互模式反编译:
>function newCounter() local i = 0 return function() i = i+1; return i end end
; source chunk: (interactive mode)
; x86 standard (32-bit, little endian, doubles)

; function [0] definition (level 1)
; 0 upvalues, 0 params, 2 stacks
.function  0 0 2 2
.const  "newCounter"  ; 0

; function [0] definition (level 2)
; 0 upvalues, 0 params, 2 stacks
.function  0 0 0 2
.local  "i"  ; 0
.const  0  ; 0

; function [0] definition (level 3)     //匿名函数:closure
; 1 upvalues, 0 params, 2 stacks
.function  1 0 0 2
.upvalue  "i"  ; 0
.const  1  ; 0
[1] getupval   0   0        ; i     //R(0):=UpValue(0)
[2] add        0   0   256  ; 1    //i=i+1
[3] setupval   0   0        ; i     //UpValue(0):=R(0),将寄存器0中的值写回UpValue(0)
[4] getupval   0   0        ; i     //再次取出UpValue(0),为解下来的返回i做准备
[5] return     0   2
[6] return     0   1
; end of
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值