类型

大多数类型 都是普遍有效的。但是,对限制 适用限制,这些限制必须在验证期间进行检查。此外,块类型 会转换为普通的函数类型,以方便处理。

限制

限制 必须具有有意义的边界,这些边界必须在给定范围内。

{min n,max m?}

  • n 的值不得大于 k

  • 如果最大值 m? 不为空,则

    • 其值不得大于 k

    • 其值不得小于 n

  • 则该限制在范围 k 内有效。

nk(mk)?(nm)?{min n,max m?}:k

块类型

块类型 可以用两种形式之一表示,这两种形式都通过以下规则转换为普通的函数类型

typeidx

  • 类型 C.types[typeidx] 必须在上下文中定义。

  • 则块类型作为函数类型 C.types[typeidx] 有效。

C.types[typeidx]=functypeCtypeidx:functype

[valtype?]

C[valtype?]:[][valtype?]

函数类型

函数类型 始终有效。

[t1n][t2m]

  • 函数类型有效。

[t1][t2]ok

表类型

limits reftype

  • 限制 limits 必须在范围 2321有效

  • 则表类型有效。

limits:2321limits reftypeok

内存类型

limits

  • 限制 limits 必须在范围 216有效

  • 则内存类型有效。

limits:216limitsok

全局类型

mut valtype

  • 全局类型有效。

mut valtypeok

外部类型

func functype

functypeokfunc functypeok

table tabletype

tabletypeoktable tabletypeok

mem memtype

memtypeokmem memtypeok

global globaltype

globaltypeokglobal globaltypeok

导入子类型化

实例化 模块时,必须提供外部值,其类型 与对每个导入进行分类的相应外部类型 匹配。在某些情况下,这允许使用简单的子类型化形式(正式写为“”),如此处定义。

限制

限制 {min n1,max m1?} 匹配限制 {min n2,max m2?} 当且仅当

  • n1 大于或等于 n2

  • 或者

    • m2? 为空。

  • 或者

    • m1?m2? 均不为空。

    • m1 小于或等于 m2

 n1n2{min n1,max m1?}{min n2,max ϵ}n1n2m1m2{min n1,max m1}{min n2,max m2}

函数

外部类型 func functype1 匹配 func functype2 当且仅当

  • functype1functype2 相同。

 func functypefunc functype

外部类型 table (limits1 reftype1) 匹配 table (limits2 reftype2) 当且仅当

  • 限制 limits1匹配 limits2

  • 两者 reftype1reftype2 都相同。

limits1limits2table (limits1 reftype)table (limits2 reftype)

内存

一个 外部类型 mem limits1mem limits2 匹配当且仅当

  • 限制 limits1匹配 limits2

limits1limits2mem limits1mem limits2

全局变量

一个 外部类型 global globaltype1global globaltype2 匹配当且仅当

  • 两者 globaltype1globaltype2 都相同。

 global globaltypeglobal globaltype