blob: 13a759892c72e7b1cad6155db46bb8ec48999a76 [file] [log] [blame] [edit]
module Engine (* : Engine.Engine *) =
struct
include Instance
type error = Source.region * string
type 'a return =
| Return of 'a
| Exn of Source.region * taginst * Value.t list
| Trap of error
| Exhaustion of error
let result f x y =
try Return (f x y) with
| Eval.Trap (at, msg) -> Trap (at, msg)
| Eval.Exception (at, Exn.Exn (a, vs)) -> Exn (at, a, vs)
| Eval.Exhaustion (at, msg) -> Exhaustion (at, msg)
let guard exns f x y =
try Some (f x y) with
| exn when List.mem exn exns -> None
let validate m =
try Ok (Valid.check_module m) with
| Valid.Invalid (at, msg) -> Error (at, msg)
let validate_with_custom (m, cs) =
try Ok (Valid.check_module_with_custom (m, cs)) with
| Valid.Invalid (at, msg) -> Error (at, msg)
let instantiate m ims =
try Ok (result Eval.init m ims) with
| Eval.Link (at, msg) -> Error (at, msg)
let module_export = Instance.export
let tag_type = Tag.type_of
let global_type = Global.type_of
let global_get = Global.load
let global_set = Global.store
let memory_type = Memory.type_of
let memory_size = Memory.size
let memory_grow =
guard Memory.[SizeLimit; SizeOverflow; OutOfMemory] Memory.grow
let memory_load_byte = guard [Memory.Bounds] Memory.load_byte
let memory_store_byte m = guard [Memory.Bounds] (Memory.store_byte m)
let table_type = Table.type_of
let table_size = Table.size
let table_grow t =
guard Table.[SizeLimit; SizeOverflow; OutOfMemory] (Table.grow t)
let table_get = guard [Table.Bounds] Table.load
let table_set t = guard [Table.Bounds] (Table.store t)
let func_type = Func.type_of
let func_call = result Eval.invoke
end
include Runner.Make (Engine)