自定义节

本附录定义了 WebAssembly 的 二进制格式 专用 自定义节。这些节不会影响或改变 WebAssembly 语义,并且像任何自定义节一样,它们可以被实现忽略。然而,它们提供了有用的元数据,实现可以使用它们来改善用户体验或获取编译提示。

目前,只定义了一个专用自定义节,即 名称节

名称节

名称节 是一个 自定义节,其名称字符串本身为 \(\def\mathdef118#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef118{name}\)。名称节应该在一个模块中只出现一次,并且应该出现在 数据节 之后。

本节的目的是为模块中的定义附加可打印的名称,例如,调试器或当模块的部分需要以 文本形式 呈现时可以使用这些名称。

注意

所有 名称 均以 Unicode 表示,并以 UTF-8 编码。名称不必唯一。

子节

名称节的 数据 由一系列子节 组成。每个子节都包含:

  • 一个字节的子节id

  • 内容的 \(\href{../syntax/values.html#syntax-int}{\mathit{u32}}\) 大小,以字节为单位,

  • 实际内容,其结构取决于子节 id。

\[\begin{split}\begin{array}{llcll} \def\mathdef79#1{{}}\mathdef79{名称节} & \href{../appendix/custom.html#binary-namesubsection}{\mathtt{namesec}} &::=& \href{../binary/modules.html#binary-section}{\mathtt{section}}_0(\href{../appendix/custom.html#binary-namesubsection}{\mathtt{namedata}}) \\ \def\mathdef79#1{{}}\mathdef79{名称数据} & \href{../appendix/custom.html#binary-namesubsection}{\mathtt{namedata}} &::=& n{:}\href{../binary/values.html#binary-name}{\mathtt{name}} & (\mathrel{\mbox{if}} n = \def\mathdef119#1{\mbox{‘}\mathtt{#1}\mbox{’}}\mathdef119{name}) \\ &&& \href{../appendix/custom.html#binary-modulenamesec}{\mathtt{modulenamesubsec}}^? \\ &&& \href{../appendix/custom.html#binary-funcnamesec}{\mathtt{funcnamesubsec}}^? \\ &&& \href{../appendix/custom.html#binary-localnamesec}{\mathtt{localnamesubsec}}^? \\ \def\mathdef79#1{{}}\mathdef79{名称子节} & \href{../appendix/custom.html#binary-namesubsection}{\mathtt{namesubsection}}_N(\mathtt{B}) &::=& N{:}\href{../binary/values.html#binary-byte}{\mathtt{byte}}~~\mathit{size}{:}\href{../binary/values.html#binary-int}{\def\mathdef84#1{{\mathtt{u}#1}}\mathdef84{\mathtt{32}}}~~\mathtt{B} & (\mathrel{\mbox{if}} \mathit{size} = ||\mathtt{B}||) \\ \end{array}\end{split}\]

使用以下子节 id

Id

子节

0

模块名称

1

函数名称

2

局部变量名称

每个子节最多只能出现一次,并且按照 id 从小到大排序。

名称映射

名称映射名称 映射到给定 索引空间 中的 索引。它包含一个 向量,其中包含按照索引值递增顺序排列的索引/名称对。每个索引必须是唯一的,但分配的名称不必唯一。

\[\begin{split}\begin{array}{llclll} \def\mathdef79#1{{}}\mathdef79{名称映射} & \href{../appendix/custom.html#binary-namemap}{\mathtt{namemap}} &::=& \href{../binary/conventions.html#binary-vec}{\mathtt{vec}}(\href{../appendix/custom.html#binary-namemap}{\mathtt{nameassoc}}) \\ \def\mathdef79#1{{}}\mathdef79{名称关联} & \href{../appendix/custom.html#binary-namemap}{\mathtt{nameassoc}} &::=& \href{../binary/modules.html#binary-index}{\mathtt{idx}}~\href{../binary/values.html#binary-name}{\mathtt{name}} \\ \end{array}\end{split}\]

间接名称映射名称 映射到二维 索引空间,其中次要索引按主要索引分组。它包含一个主要索引/名称映射对的向量,按索引值递增顺序排列,其中每个名称映射又将次要索引映射到名称。每个主要索引必须是唯一的,同样,每个名称映射的次要索引也必须是唯一的。

\[\begin{split}\begin{array}{llclll} \def\mathdef79#1{{}}\mathdef79{间接名称映射} & \href{../appendix/custom.html#binary-indirectnamemap}{\mathtt{indirectnamemap}} &::=& \href{../binary/conventions.html#binary-vec}{\mathtt{vec}}(\href{../appendix/custom.html#binary-indirectnamemap}{\mathtt{indirectnameassoc}}) \\ \def\mathdef79#1{{}}\mathdef79{间接名称关联} & \href{../appendix/custom.html#binary-indirectnamemap}{\mathtt{indirectnameassoc}} &::=& \href{../binary/modules.html#binary-index}{\mathtt{idx}}~\href{../appendix/custom.html#binary-namemap}{\mathtt{namemap}} \\ \end{array}\end{split}\]

模块名称

模块名称子节 的 id 为 0。它只包含一个 名称,该名称分配给模块本身。

\[\begin{split}\begin{array}{llclll} \def\mathdef79#1{{}}\mathdef79{模块名称子节} & \href{../appendix/custom.html#binary-modulenamesec}{\mathtt{modulenamesubsec}} &::=& \href{../appendix/custom.html#binary-namesubsection}{\mathtt{namesubsection}}_0(\href{../binary/values.html#binary-name}{\mathtt{name}}) \\ \end{array}\end{split}\]

函数名称

函数名称子节 的 id 为 1。它包含一个 名称映射,将函数名称分配给 函数索引

\[\begin{split}\begin{array}{llclll} \def\mathdef79#1{{}}\mathdef79{函数名称子节} & \href{../appendix/custom.html#binary-funcnamesec}{\mathtt{funcnamesubsec}} &::=& \href{../appendix/custom.html#binary-namesubsection}{\mathtt{namesubsection}}_1(\href{../appendix/custom.html#binary-namemap}{\mathtt{namemap}}) \\ \end{array}\end{split}\]

局部变量名称

局部变量名称子节 的 id 为 2。它包含一个 间接名称映射,将局部变量名称分配给 局部变量索引,这些索引按 函数索引 分组。

\[\begin{split}\begin{array}{llclll} \def\mathdef79#1{{}}\mathdef79{局部变量名称子节} & \href{../appendix/custom.html#binary-localnamesec}{\mathtt{localnamesubsec}} &::=& \href{../appendix/custom.html#binary-namesubsection}{\mathtt{namesubsection}}_2(\href{../appendix/custom.html#binary-indirectnamemap}{\mathtt{indirectnamemap}}) \\ \end{array}\end{split}\]