字节码

背景知识

SpiderMonkey字节码是JavaScript引擎使用的标准代码表示形式。JavaScript前端根据源文本构建AST,然后根据JSScript数据结构的一部分从AST生成基于堆栈的字节码。字节码可以引用原子和对象(通常通过数组索引),这些原子和对象也包含在JSScript数据结构中。

在引擎内,所有字节码都在堆栈帧内执行。堆栈帧与全局(顶级)代码和eval代码相关联。堆栈上的框架为几个不同类别的JavaScript值(标记值格式)留出空间。单个JavaScript值空间称为“插槽”,类别为:

  • 参数槽:保存传递给当前框架的实际参数。
  • 本地插槽:保存当前代码中使用的本地变量。
  • 表达式槽:保存在堆栈上计算表达式所需的临时空间。例如,(a + b) + c会压入a,然后压入b,再压入+,然后压入c,再压入+,依此类推。这需要最多两个表达槽的深度。

还有一些保留给专用功能的插槽,用于处理thiscallee返回值。.

总有一个“堆栈顶部”(TOS),它对应于推入表达式堆栈的最新值。所有字节码都根据该位置隐式运行。

字节码列表

所有操作码都用 [-popcount, +pushcount] 标注,以表示整个执行的堆栈效果。

字节码列表已移至 SpiderMonkey Internals: Bytecode Descriptions 页面。