如何评估函数调用链

什么时候以及怎样才会评估这些调用链?我看到有两种选项:

  • 当解释器到达该行时,所以此后对于 print() 的任何调用只能使用最后一个 d()。
  • 当 print() 实际访问参数时,所以整个链每次执行该行时都会被评估(顺便说一句,这是期望的行为)。
点赞
用户107090
用户107090

每次执行该行时会对整个链进行评估。

通过向 luac -l 提供有问题的行,可显示准确的指令集:

1   [1] GETTABUP    0 0 -1  ; _ENV "print"
2   [1] GETTABUP    1 0 -2  ; _ENV "a"
3   [1] GETTABLE    1 1 -3  ; "b"
4   [1] CALL        1 1 2
5   [1] SELF        1 1 -4  ; "c"
6   [1] CALL        1 2 2
7   [1] SELF        1 1 -5  ; "d"
8   [1] CALL        1 2 0
9   [1] CALL        0 0 1
10  [1] RETURN      0 1

以上代码假定 a 是一个全局变量。如果 a 是一个局部变量,则会略有不同。

2015-08-24 04:16:27