Types

Note

In future versions of WebAssembly, value types may include types denoted by type indices. Thus, the binary format for types corresponds to the encodings of small negative \(\href{../binary/values.html#binary-sint}{\href{../syntax/values.html#syntax-int}{\mathit{s}N}}\) values, so that they can coexist with (positive) type indices in the future.

Number Types

Number types are encoded by a single byte.

\[\begin{split}\begin{array}{llclll@{\qquad\qquad}l} \def\mathdef1043#1{{}}\mathdef1043{number type} & \href{../binary/types.html#binary-numtype}{\mathtt{numtype}} &::=& \def\mathdef1080#1{\mathtt{0x#1}}\mathdef1080{7F} &\Rightarrow& \href{../syntax/types.html#syntax-valtype}{\mathsf{i32}} \\ &&|& \def\mathdef1081#1{\mathtt{0x#1}}\mathdef1081{7E} &\Rightarrow& \href{../syntax/types.html#syntax-valtype}{\mathsf{i64}} \\ &&|& \def\mathdef1082#1{\mathtt{0x#1}}\mathdef1082{7D} &\Rightarrow& \href{../syntax/types.html#syntax-valtype}{\mathsf{f32}} \\ &&|& \def\mathdef1083#1{\mathtt{0x#1}}\mathdef1083{7C} &\Rightarrow& \href{../syntax/types.html#syntax-valtype}{\mathsf{f64}} \\ \end{array}\end{split}\]

Reference Types

Reference types are also encoded by a single byte.

\[\begin{split}\begin{array}{llclll@{\qquad\qquad}l} \def\mathdef1043#1{{}}\mathdef1043{reference type} & \href{../binary/types.html#binary-reftype}{\mathtt{reftype}} &::=& \def\mathdef1084#1{\mathtt{0x#1}}\mathdef1084{70} &\Rightarrow& \href{../syntax/types.html#syntax-reftype}{\mathsf{funcref}} \\ &&|& \def\mathdef1085#1{\mathtt{0x#1}}\mathdef1085{6F} &\Rightarrow& \href{../syntax/types.html#syntax-reftype}{\mathsf{externref}} \\ \end{array}\end{split}\]

Value Types

Value types are encoded with their respective encoding as a number type or reference type.

\[\begin{split}\begin{array}{llclll@{\qquad\qquad}l} \def\mathdef1043#1{{}}\mathdef1043{value type} & \href{../binary/types.html#binary-valtype}{\mathtt{valtype}} &::=& t{:}\href{../binary/types.html#binary-numtype}{\mathtt{numtype}} &\Rightarrow& t \\ &&|& t{:}\href{../binary/types.html#binary-reftype}{\mathtt{reftype}} &\Rightarrow& t \\ \end{array}\end{split}\]

Note

Value types can occur in contexts where type indices are also allowed, such as in the case of block types. Thus, the binary format for types corresponds to the signed LEB128 encoding of small negative \(\href{../syntax/values.html#syntax-int}{\mathit{s}N}\) values, so that they can coexist with (positive) type indices in the future.

Result Types

Result types are encoded by the respective vectors of value types `.

\[\begin{split}\begin{array}{llclll@{\qquad\qquad}l} \def\mathdef1043#1{{}}\mathdef1043{result type} & \href{../binary/types.html#binary-resulttype}{\mathtt{resulttype}} &::=& t^\ast{:\,}\href{../binary/conventions.html#binary-vec}{\mathtt{vec}}(\href{../binary/types.html#binary-valtype}{\mathtt{valtype}}) &\Rightarrow& [t^\ast] \\ \end{array}\end{split}\]

Function Types

Function types are encoded by the byte \(\def\mathdef1086#1{\mathtt{0x#1}}\mathdef1086{60}\) followed by the respective vectors of parameter and result types.

\[\begin{split}\begin{array}{llclll@{\qquad\qquad}l} \def\mathdef1043#1{{}}\mathdef1043{function type} & \href{../binary/types.html#binary-functype}{\mathtt{functype}} &::=& \def\mathdef1087#1{\mathtt{0x#1}}\mathdef1087{60}~~\mathit{rt}_1{:\,}\href{../binary/types.html#binary-resulttype}{\mathtt{resulttype}}~~\mathit{rt}_2{:\,}\href{../binary/types.html#binary-resulttype}{\mathtt{resulttype}} &\Rightarrow& \mathit{rt}_1 \href{../syntax/types.html#syntax-functype}{\rightarrow} \mathit{rt}_2 \\ \end{array}\end{split}\]

Limits

Limits are encoded with a preceding flag indicating whether a maximum is present.

\[\begin{split}\begin{array}{llclll} \def\mathdef1043#1{{}}\mathdef1043{limits} & \href{../binary/types.html#binary-limits}{\mathtt{limits}} &::=& \def\mathdef1088#1{\mathtt{0x#1}}\mathdef1088{00}~~n{:}\href{../binary/values.html#binary-int}{\def\mathdef1048#1{{\mathtt{u}#1}}\mathdef1048{\mathtt{32}}} &\Rightarrow& \{ \href{../syntax/types.html#syntax-limits}{\mathsf{min}}~n, \href{../syntax/types.html#syntax-limits}{\mathsf{max}}~\epsilon \} \\ &&|& \def\mathdef1089#1{\mathtt{0x#1}}\mathdef1089{01}~~n{:}\href{../binary/values.html#binary-int}{\def\mathdef1048#1{{\mathtt{u}#1}}\mathdef1048{\mathtt{32}}}~~m{:}\href{../binary/values.html#binary-int}{\def\mathdef1048#1{{\mathtt{u}#1}}\mathdef1048{\mathtt{32}}} &\Rightarrow& \{ \href{../syntax/types.html#syntax-limits}{\mathsf{min}}~n, \href{../syntax/types.html#syntax-limits}{\mathsf{max}}~m \} \\ \end{array}\end{split}\]

Memory Types

Memory types are encoded with their limits.

\[\begin{split}\begin{array}{llclll@{\qquad\qquad}l} \def\mathdef1043#1{{}}\mathdef1043{memory type} & \href{../binary/types.html#binary-memtype}{\mathtt{memtype}} &::=& \mathit{lim}{:}\href{../binary/types.html#binary-limits}{\mathtt{limits}} &\Rightarrow& \mathit{lim} \\ \end{array}\end{split}\]

Table Types

Table types are encoded with their limits and the encoding of their element reference type.

\[\begin{split}\begin{array}{llclll} \def\mathdef1043#1{{}}\mathdef1043{table type} & \href{../binary/types.html#binary-tabletype}{\mathtt{tabletype}} &::=& \mathit{et}{:}\href{../binary/types.html#binary-reftype}{\mathtt{reftype}}~~\mathit{lim}{:}\href{../binary/types.html#binary-limits}{\mathtt{limits}} &\Rightarrow& \mathit{lim}~\mathit{et} \\ \end{array}\end{split}\]

Global Types

Global types are encoded by their value type and a flag for their mutability.

\[\begin{split}\begin{array}{llclll} \def\mathdef1043#1{{}}\mathdef1043{global type} & \href{../binary/types.html#binary-globaltype}{\mathtt{globaltype}} &::=& t{:}\href{../binary/types.html#binary-valtype}{\mathtt{valtype}}~~m{:}\href{../binary/types.html#binary-mut}{\mathtt{mut}} &\Rightarrow& m~t \\ \def\mathdef1043#1{{}}\mathdef1043{mutability} & \href{../binary/types.html#binary-mut}{\mathtt{mut}} &::=& \def\mathdef1090#1{\mathtt{0x#1}}\mathdef1090{00} &\Rightarrow& \href{../syntax/types.html#syntax-mut}{\mathsf{const}} \\ &&|& \def\mathdef1091#1{\mathtt{0x#1}}\mathdef1091{01} &\Rightarrow& \href{../syntax/types.html#syntax-mut}{\mathsf{var}} \\ \end{array}\end{split}\]