Berry 实现:自动扩充的调用栈
概述 调用栈用于存储函数执行过程中调用链上所有函数的局部变量等调用信息。Berry 调用栈特指脚本程序的调用栈,而不是 C 的调用栈。 在 be_vm.h 中可以看到 VM 结构中和调用栈相关的字段: struct bvm { // ... bvalue *stack; /* stack space */ bvalue *stacktop; /* stack top register */ bstack callstack; /* function call stack */ // ... }; stack 和 stacktop 用于维护存储局部变量的栈(以下简称“变量栈”,函数的栈空间指 vm.stack 中被该函数使用的一段空间),而 callstack 为函数栈帧的堆栈。 我们用一个简单的脚本来说明上述字段的作用: def func1(c) return c + 1 end def func2(b) return func1(b) + 2 end def func3(a) return func2(a) + 3 end 当我们执行 func3(10) 的时候,执行到 func1 内部时调用链最长: call stack top +-------------------------+ | function: func1 | | local variable(s): c | +-