let name = "wasm" let version = "2.0" let configure () = Import.register (Utf8.decode "spectest") Spectest.lookup; Import.register (Utf8.decode "env") Env.lookup let banner () = print_endline (name ^ " " ^ version ^ " reference interpreter") let usage = "Usage: " ^ name ^ " [option] [file ...]" let args = ref [] let add_arg source = args := !args @ [source] let quote s = "\"" ^ String.escaped s ^ "\"" let argspec = Arg.align [ "-", Arg.Set Flags.interactive, " run interactively (default if no files given)"; "-e", Arg.String add_arg, " evaluate string"; "-i", Arg.String (fun file -> add_arg ("(input " ^ quote file ^ ")")), " read script from file"; "-o", Arg.String (fun file -> add_arg ("(output " ^ quote file ^ ")")), " write module to file"; "-b", Arg.Int (fun n -> Flags.budget := n), " configure call depth budget (default is " ^ string_of_int !Flags.budget ^ ")"; "-g", Arg.String (fun n -> Flags.gas := Int64.of_string n), " configure the gas pool size"; "-w", Arg.Int (fun n -> Flags.width := n), " configure output width (default is " ^ string_of_int !Flags.width ^ ")"; "-s", Arg.Set Flags.print_sig, " show module signatures"; "-u", Arg.Set Flags.unchecked, " unchecked, do not perform validation"; "-j", Arg.Clear Flags.harness, " exclude harness for JS conversion"; "-d", Arg.Set Flags.dry, " dry, do not run program"; "-t", Arg.Set Flags.trace, " trace execution"; "-tg", Arg.Set Flags.trace_gas, " trace gas charges"; "-tgo", Arg.Set Flags.trace_gas_ops, " log operations that incurred gas changes (good for debugging)"; "-v", Arg.Unit banner, " show version" ] let () = Printexc.record_backtrace true; try configure (); Arg.parse argspec (fun file -> add_arg ("(input " ^ quote file ^ ")")) usage; List.iter (fun arg -> if not (Run.run_string arg) then exit 1) !args; if !args = [] then Flags.interactive := true; if !Flags.interactive then begin Flags.print_sig := true; banner (); Run.run_stdin () end with exn -> flush_all (); prerr_endline (Sys.argv.(0) ^ ": uncaught exception " ^ Printexc.to_string exn); Printexc.print_backtrace stderr; exit 2