| 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) | |
| | Custom.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) |