blob: a23838c503fa6d6254451a61b7066e2a508b6fd8 [file] [log] [blame]
(*
* Emulation of (a subset of) the `env` module currently used by Binaryen,
* so that we can run modules generated by Binaryen. This is a stopgap until
* we have agreement on what libc should look like.
*)
open Values
open Types
open Instance
let error msg = raise (Eval.Crash (Source.no_region, msg))
let type_error v t =
error
("type error, expected " ^ string_of_value_type t ^
", got " ^ string_of_value_type (type_of v))
let empty = function
| [] -> ()
| vs -> error "type error, too many arguments"
let single = function
| [] -> error "type error, missing arguments"
| [v] -> v
| vs -> error "type error, too many arguments"
let int = function
| I32 i -> Int32.to_int i
| v -> type_error v I32Type
let abort vs =
empty vs;
print_endline "Abort!";
exit (-1)
let exit vs =
exit (int (single vs))
let lookup name t =
match Utf8.encode name, t with
| "abort", ExternFuncType t -> ExternFunc (Func.alloc_host t abort)
| "exit", ExternFuncType t -> ExternFunc (Func.alloc_host t exit)
| _ -> raise Not_found