| open Types |
| |
| type module_inst = |
| { |
| types : func_type list; |
| funcs : func_inst list; |
| tables : table_inst list; |
| memories : memory_inst list; |
| globals : global_inst list; |
| elems : elem_inst list; |
| datas : data_inst list; |
| exports : export_inst list; |
| } |
| |
| and func_inst = module_inst ref Func.t |
| and table_inst = Table.t |
| and memory_inst = Memory.t |
| and global_inst = Global.t |
| and elem_inst = Elem.t |
| and data_inst = Data.t |
| and export_inst = Ast.name * extern |
| |
| and extern = |
| | ExternFunc of func_inst |
| | ExternTable of table_inst |
| | ExternMemory of memory_inst |
| | ExternGlobal of global_inst |
| |
| |
| (* Reference types *) |
| |
| type Values.ref_ += FuncRef of func_inst |
| |
| let () = |
| let type_of_ref' = !Values.type_of_ref' in |
| Values.type_of_ref' := function |
| | FuncRef _ -> FuncRefType |
| | r -> type_of_ref' r |
| |
| let () = |
| let string_of_ref' = !Values.string_of_ref' in |
| Values.string_of_ref' := function |
| | FuncRef _ -> "func" |
| | r -> string_of_ref' r |
| |
| let () = |
| let eq_ref' = !Values.eq_ref' in |
| Values.eq_ref' := fun r1 r2 -> |
| match r1, r2 with |
| | FuncRef f1, FuncRef f2 -> f1 == f2 |
| | _, _ -> eq_ref' r1 r2 |
| |
| |
| (* Auxiliary functions *) |
| |
| let empty_module_inst = |
| { types = []; funcs = []; tables = []; memories = []; globals = []; |
| elems = []; datas = []; exports = [] } |
| |
| let extern_type_of = function |
| | ExternFunc func -> ExternFuncType (Func.type_of func) |
| | ExternTable tab -> ExternTableType (Table.type_of tab) |
| | ExternMemory mem -> ExternMemoryType (Memory.type_of mem) |
| | ExternGlobal glob -> ExternGlobalType (Global.type_of glob) |
| |
| let export inst name = |
| try Some (List.assoc name inst.exports) with Not_found -> None |