blob: 4bfe45cff1a680d0deaf55b558de247cdec32bfe [file] [log] [blame] [edit]
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