为什么 ChunkSpy 中 .function 部分有四个参数?

使用 ChunkSpy 时,我发现有一件事让我困惑。让我们看一下下面的例子

> a = 1
; 源代码块: (交互模式)
; x86 标准 (32 位,小端序,双精度)

; 函数 [0] 定义 (级别 1)
; 0 upvalues,0 params,2 stacks
.function 0 0 2 2
.const "a"  ; 0
.const 1  ; 1
[1] loadk 0 1  ; 1
[2] setglobal 0 0  ; a
[3] return 0 1
; 函数结束

由于这里有 0 upvalues,0 params,2 stacks,那么为什么 .function 0 0 2 2 有四个参数?

在另一个例子中,我们可以看到

>local a; function b() a = 1 return a end
; 源代码块: (交互模式)
; x86 标准 (32 位,小端序,双精度)

; 函数 [0] 定义 (级别 1)
; 0 upvalues,0 params,2 stacks
.function 0 0 2 2
.local "a"  ; 0
.const "b"  ; 0

; 函数 [0] 定义 (级别 2)
; 1 upvalues,0 params,2 stacks
.function 1 0 0 2
.upvalue "a"  ; 0
.const 1  ; 0
[1] loadk 0 0  ; 1
[2] setupval 0 0  ; a
[3] getupval 0 0  ; a
[4] return 0 2
[5] return 0 1
; 函数结束

[1] closure 1 0  ; 1 upvalues
[2] move 0 0
[3] setglobal 1 0  ; b
[4] return 0 1
; 函数结束

所以我猜第一个参数是 upvalues,但第二个参数的用途是什么呢?

点赞
用户12961033
用户12961033

我通过 Egor Skriptunoff 在评论区的帮助得到了答案。

带有四个参数的 .fucntion 部分的含义如下:

  • upvalue 的数量
  • 命名参数的数量
  • arg 标志:1=VARARG_HASARG,2=VARARG_ISVARARG,4=VARARG_NEEDSARG。对于普通函数始终为 0,对于主函数块始终为 2。
  • 栈的数量
2021-03-06 13:42:38