WebAssemblyバイナリをパースするRustのcrate

bytecodealliance/wasm-tools:crates/wasmparser

exampleによると、wasmparser::Parser::new(offset).parse_all(&buffer) という形で使うらしい

wasm-tools v1.245.1 時点でのコードを読んでいく

  • parser.rs#L1086parse_all() があり、cur.parse() を繰り返し呼んでイテレータを生成している
    • cur は初めに cur = self としている
    • parse() が返す Chunk::Parsed { payload, consumed: usize }payloadPayload::ModuleSection あるいは Payload::ComponentSection だった場合、 curpayload.parser を代入している
      • module と component とで別々のパーサーを使っている?(それはそうかも)
      • ここで module はふつうのやつ、componentはWebAssembly Component Modelで定義されたやつ
        • もうちょい詳しく書くべき?あるいはページを生やす
  • Parser::parse()BinaryReader を作って、それを self.parse_reader() に渡して呼ぶ
  • [Parser::parse_reader()]:デカい
    • (todo)