为什么控制流指令的结果类型是任意的? (特别是`return`)

时间:2018-04-05 15:03:36

标签: types stack specifications type-systems webassembly

我试图理解WebAssembly的类型系统,并且被控制流指令搞糊涂了。我不明白为什么brresultunreachable的结果类型是任意类型序列(t_2 ^ *):

我在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)
 )
)

那么返回语句后的类型检查有什么意义呢?

1 个答案:

答案 0 :(得分:3)

原始Wasm设计文档的基本原理部分包含此功能的extensive motivation