我试图理解WebAssembly的类型系统,并且被控制流指令搞糊涂了。我不明白为什么br
,result
或unreachable
的结果类型是任意类型序列(t_2 ^ *):
https://webassembly.github.io/spec/core/valid/instructions.html#valid-return
https://webassembly.github.io/spec/core/valid/instructions.html#valid-br
https://webassembly.github.io/spec/core/valid/instructions.html#valid-unreachable
我在reference interpreter中运行了以下两个片段:
(module
(func (result i32)
(i32.const 1)
(i32.const 2)
(return)
(return)
)
)
未报告类型错误。但是,这一个:
(module
(func (result i32)
(i32.const 1)
(i32.const 2)
(return)
(f32.const 2)
)
)
现在我得到类型错误:“test.wast:2.2-7.3:无效模块:类型不匹配:运算符需要[i32]但堆栈有[f32]”。
但我可以尝试利用“任意类型序列”并编写仍然打字良好的奇怪程序:
(module
(func (result i32)
(i32.const 1)
(i32.const 2)
(return)
(i32.add)
(i32.add)
(i32.add)
(i32.add)
(i32.add)
(i32.add)
(i32.add)
)
)
那么返回语句后的类型检查有什么意义呢?