| type data = string ref |
| type t = data |
| |
| exception Bounds |
| |
| let alloc bs = ref bs |
| |
| let size seg = I64.of_int_u (String.length !seg) |
| |
| let drop seg = seg := "" |
| |
| let load_byte seg a = |
| let i = Int64.to_int a in |
| if i < 0 || i >= String.length !seg then raise Bounds; |
| !seg.[i] |
| |
| let load_bytes seg a n = |
| let i = Int64.to_int a in |
| if i < 0 || i + n < 0 || i + n > String.length !seg then raise Bounds; |
| String.sub !seg i n |
| |
| |
| (* Typed accessors *) |
| |
| let load_num seg a nt = |
| let bs = load_bytes seg a (Types.num_size nt) in |
| Value.num_of_bits nt bs |
| |
| let load_num_packed sz sx seg a nt = |
| let bs = load_bytes seg a (Pack.packed_size sz) in |
| Value.num_of_packed_bits nt sz sx bs |
| |
| let load_vec seg a vt = |
| let bs = load_bytes seg a (Types.vec_size vt) in |
| Value.vec_of_bits vt bs |
| |
| let load_vec_packed sz ext seg a t = |
| let bs = load_bytes seg a (Pack.packed_size sz) in |
| Value.vec_of_packed_bits t sz ext bs |
| |
| let load_val seg a t = |
| let bs = load_bytes seg a (Types.val_size t) in |
| Value.val_of_bits t bs |
| |
| let load_val_storage seg a st = |
| let bs = load_bytes seg a (Types.storage_size st) in |
| Value.val_of_storage_bits st bs |