#!/usr/bin/env python

# Copyright 2019 the V8 project authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be found
# in the LICENSE file.

from __future__ import print_function
import argparse
import io
import sys

from wasm import *

def parse_args():
  parser = argparse.ArgumentParser(\
      description="Read compilation hints from Wasm module.")
  parser.add_argument("in_wasm_file", \
      type=str, \
      help="wasm module")
  return parser.parse_args()

if __name__ == "__main__":
  args = parse_args()
  in_wasm_file = args.in_wasm_file if args.in_wasm_file else sys.stdin.fileno()
  with io.open(in_wasm_file, "rb") as fin:
    read_magic_number(fin);
    read_version(fin);
    while True:
      id, bs = read_varuintN(fin)
      if id == None:
        break
      payload_length, bs = read_varuintN(fin)
      if id == CUSTOM_SECTION_ID:
        section_name_length, section_name_length_bs = read_varuintN(fin)
        section_name_bs = fin.read(section_name_length)
        if section_name_bs == "compilationHints":
          num_hints, bs = read_varuintN(fin)
          print("Custom section compilationHints with ", num_hints, "hints:")
          for i in range(num_hints):
            hint, bs = read_uint8(fin)
            print(i, " ", hex(hint))
        else:
          remaining_length = payload_length \
              - len(section_name_length_bs) \
              - len(section_name_bs)
          fin.read()
      else:
        fin.read(payload_length)
