stack-polymorphic 정보

3306 단어 WebAssembly
다음 두 가지는 모두 컴파일이 통과합니다.
(module
  (func (export "test") (param $i i32) (result i32)
    (block (result i32)
      i32.const 1
      br 0
      ;;i32.const 2
    )
  )
)
(module
  (func (export "test") (param $i i32) (result i32)
    (block (result i32)
      i32.const 1
      br 0
      i32.const 2
    )
  )
)

버그라고 생각했지만, 사양에 써 있었다.





stack-polymorphic라고 하는 것이 잘 모르겠지만, 후속 명령의 인수에 대해 「뽀뽀이 없는 한」어떤 형태라도 생각해 주어도 좋다, 라고 하는 것 같습니다.

이 블록의 반환값이 [i32]이면 좋기 때문에, 이쪽이면 br의 형태는 [i32]->[i32]가 되어,
    (block (result i32)
      i32.const 1
      br 0
    )

여기라면 br의 형태는 [i32]->[]가 된다.
    (block (result i32)
      i32.const 1
      br 0
      i32.const 2
    )

unconditional control transfer(문답 무용으로 점프한다) 때 밖에 사용되지 않는 것 같기 때문에, 실질적으로는 그 후의 명령은 형 체크만 하면 좋고, 구현은 하지 않아도 된다.

좋은 웹페이지 즐겨찾기