Skip to content

Commit 2cdd5ac

Browse files
authored
[interpreter] Factor data and element segments into abstract types (#1492)
1 parent f8c221c commit 2cdd5ac

File tree

7 files changed

+48
-17
lines changed

7 files changed

+48
-17
lines changed

interpreter/exec/eval.ml

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -134,15 +134,15 @@ let mem_oob frame x i n =
134134

135135
let data_oob frame x i n =
136136
I64.gt_u (I64.add (I64_convert.extend_i32_u i) (I64_convert.extend_i32_u n))
137-
(I64.of_int_u (String.length !(data frame.inst x)))
137+
(Data.size (data frame.inst x))
138138

139139
let table_oob frame x i n =
140140
I64.gt_u (I64.add (I64_convert.extend_i32_u i) (I64_convert.extend_i32_u n))
141141
(I64_convert.extend_i32_u (Table.size (table frame.inst x)))
142142

143143
let elem_oob frame x i n =
144144
I64.gt_u (I64.add (I64_convert.extend_i32_u i) (I64_convert.extend_i32_u n))
145-
(I64.of_int_u (List.length !(elem frame.inst x)))
145+
(I64_convert.extend_i32_u (Elem.size (elem frame.inst x)))
146146

147147
let rec step (c : config) : config =
148148
let {frame; code = vs, es; _} = c in
@@ -302,10 +302,10 @@ let rec step (c : config) : config =
302302
else if n = 0l then
303303
vs', []
304304
else
305-
let seg = !(elem frame.inst y) in
305+
let seg = elem frame.inst y in
306306
vs', List.map (at e.at) [
307307
Plain (Const (I32 d @@ e.at));
308-
Refer (List.nth seg (Int32.to_int s));
308+
Refer (Elem.load seg s);
309309
Plain (TableSet x);
310310
Plain (Const (I32 (I32.add d 1l) @@ e.at));
311311
Plain (Const (I32 (I32.add s 1l) @@ e.at));
@@ -315,7 +315,7 @@ let rec step (c : config) : config =
315315

316316
| ElemDrop x, vs ->
317317
let seg = elem frame.inst x in
318-
seg := [];
318+
Elem.drop seg;
319319
vs, []
320320

321321
| Load {offset; ty; pack; _}, Num (I32 i) :: vs' ->
@@ -465,11 +465,12 @@ let rec step (c : config) : config =
465465
else if n = 0l then
466466
vs', []
467467
else
468-
let seg = !(data frame.inst x) in
469-
let b = Int32.of_int (Char.code seg.[Int32.to_int s]) in
468+
let seg = data frame.inst x in
469+
let a = I64_convert.extend_i32_u s in
470+
let b = Data.load seg a in
470471
vs', List.map (at e.at) [
471472
Plain (Const (I32 d @@ e.at));
472-
Plain (Const (I32 b @@ e.at));
473+
Plain (Const (I32 (I32.of_int_u (Char.code b)) @@ e.at));
473474
Plain (Store
474475
{ty = I32Type; align = 0; offset = 0l; pack = Some Pack8});
475476
Plain (Const (I32 (I32.add d 1l) @@ e.at));
@@ -480,7 +481,7 @@ let rec step (c : config) : config =
480481

481482
| DataDrop x, vs ->
482483
let seg = data frame.inst x in
483-
seg := "";
484+
Data.drop seg;
484485
vs, []
485486

486487
| RefNull t, vs' ->
@@ -715,11 +716,11 @@ let create_export (inst : module_inst) (ex : export) : export_inst =
715716

716717
let create_elem (inst : module_inst) (seg : elem_segment) : elem_inst =
717718
let {etype; einit; _} = seg.it in
718-
ref (List.map (fun c -> as_ref (eval_const inst c)) einit)
719+
Elem.alloc (List.map (fun c -> as_ref (eval_const inst c)) einit)
719720

720721
let create_data (inst : module_inst) (seg : data_segment) : data_inst =
721722
let {dinit; _} = seg.it in
722-
ref dinit
723+
Data.alloc dinit
723724

724725

725726
let add_import (m : module_) (ext : extern) (im : import) (inst : module_inst)

interpreter/exec/ixx.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ sig
3030

3131
val of_int : int -> t
3232
val to_int : t -> int
33-
val of_int64: int64 -> t
34-
val to_int64: t -> int64
33+
val of_int64 : int64 -> t
34+
val to_int64 : t -> int64
3535
val to_string : t -> string
3636
val to_hex_string : t -> string
3737

interpreter/runtime/data.ml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
type data = string ref
2+
type t = data
3+
4+
let alloc bs = ref bs
5+
let size seg = I64.of_int_u (String.length !seg)
6+
let load seg i = (!seg).[Int64.to_int i]
7+
let drop seg = seg := ""

interpreter/runtime/data.mli

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
type data
2+
type t = data
3+
4+
val alloc : string -> data
5+
val size : data -> Memory.address
6+
val load : data -> Memory.address -> char
7+
val drop : data -> unit

interpreter/runtime/elem.ml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
type elem = Values.ref_ list ref
2+
type t = elem
3+
4+
let alloc rs = ref rs
5+
let size seg = Lib.List32.length !seg
6+
let load seg i = Lib.List32.nth !seg i
7+
let drop seg = seg := []

interpreter/runtime/elem.mli

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
open Values
2+
3+
type elem
4+
type t = elem
5+
6+
val alloc : ref_ list -> elem
7+
val size : elem -> Table.size
8+
val load : elem -> Table.index -> ref_
9+
val drop : elem -> unit

interpreter/runtime/instance.ml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,18 @@ type module_inst =
77
tables : table_inst list;
88
memories : memory_inst list;
99
globals : global_inst list;
10-
exports : export_inst list;
1110
elems : elem_inst list;
1211
datas : data_inst list;
12+
exports : export_inst list;
1313
}
1414

1515
and func_inst = module_inst ref Func.t
1616
and table_inst = Table.t
1717
and memory_inst = Memory.t
1818
and global_inst = Global.t
19+
and elem_inst = Elem.t
20+
and data_inst = Data.t
1921
and export_inst = Ast.name * extern
20-
and elem_inst = Values.ref_ list ref
21-
and data_inst = string ref
2222

2323
and extern =
2424
| ExternFunc of func_inst
@@ -55,7 +55,7 @@ let () =
5555

5656
let empty_module_inst =
5757
{ types = []; funcs = []; tables = []; memories = []; globals = [];
58-
exports = []; elems = []; datas = [] }
58+
elems = []; datas = []; exports = [] }
5959

6060
let extern_type_of = function
6161
| ExternFunc func -> ExternFuncType (Func.type_of func)

0 commit comments

Comments
 (0)