Skip to content

Commit a9d46aa

Browse files
committed
[interpreter] Factor data and element segments into abstract types (WebAssembly#1492)
1 parent 07a4a26 commit a9d46aa

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
@@ -142,15 +142,15 @@ let mem_oob frame x i n =
142142

143143
let data_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 (String.length !(data frame.inst x)))
145+
(Data.size (data frame.inst x))
146146

147147
let table_oob frame x i n =
148148
I64.gt_u (I64.add (I64_convert.extend_i32_u i) (I64_convert.extend_i32_u n))
149149
(I64_convert.extend_i32_u (Table.size (table frame.inst x)))
150150

151151
let elem_oob frame x i n =
152152
I64.gt_u (I64.add (I64_convert.extend_i32_u i) (I64_convert.extend_i32_u n))
153-
(I64.of_int_u (List.length !(elem frame.inst x)))
153+
(I64_convert.extend_i32_u (Elem.size (elem frame.inst x)))
154154

155155
let rec step (c : config) : config =
156156
let vs, es = c.code in
@@ -349,10 +349,10 @@ let rec step (c : config) : config =
349349
else if n = 0l then
350350
vs', []
351351
else
352-
let seg = !(elem c.frame.inst y) in
352+
let seg = elem c.frame.inst y in
353353
vs', List.map (Lib.Fun.flip (@@) e.at) [
354354
Plain (Const (I32 d @@ e.at));
355-
Refer (List.nth seg (Int32.to_int s));
355+
Refer (Elem.load seg s);
356356
Plain (TableSet x);
357357
Plain (Const (I32 (I32.add d 1l) @@ e.at));
358358
Plain (Const (I32 (I32.add s 1l) @@ e.at));
@@ -362,7 +362,7 @@ let rec step (c : config) : config =
362362

363363
| ElemDrop x, vs ->
364364
let seg = elem c.frame.inst x in
365-
seg := [];
365+
Elem.drop seg;
366366
vs, []
367367

368368
| Load {offset; ty; pack; _}, Num (I32 i) :: vs' ->
@@ -513,11 +513,12 @@ let rec step (c : config) : config =
513513
else if n = 0l then
514514
vs', []
515515
else
516-
let seg = !(data c.frame.inst x) in
517-
let b = Int32.of_int (Char.code seg.[Int32.to_int s]) in
516+
let seg = data c.frame.inst x in
517+
let a = I64_convert.extend_i32_u s in
518+
let b = Data.load seg a in
518519
vs', List.map (Lib.Fun.flip (@@) e.at) [
519520
Plain (Const (I32 d @@ e.at));
520-
Plain (Const (I32 b @@ e.at));
521+
Plain (Const (I32 (I32.of_int_u (Char.code b)) @@ e.at));
521522
Plain (Store
522523
{ty = Types.I32T; align = 0; offset = 0l; pack = Some Pack8});
523524
Plain (Const (I32 (I32.add d 1l) @@ e.at));
@@ -528,7 +529,7 @@ let rec step (c : config) : config =
528529

529530
| DataDrop x, vs ->
530531
let seg = data c.frame.inst x in
531-
seg := "";
532+
Data.drop seg;
532533
vs, []
533534

534535
| RefNull t, vs' ->
@@ -788,11 +789,11 @@ let create_export (inst : module_inst) (ex : export) : export_inst =
788789

789790
let create_elem (inst : module_inst) (seg : elem_segment) : elem_inst =
790791
let {etype; einit; _} = seg.it in
791-
ref (List.map (fun c -> as_ref (eval_const inst c)) einit)
792+
Elem.alloc (List.map (fun c -> as_ref (eval_const inst c)) einit)
792793

793794
let create_data (inst : module_inst) (seg : data_segment) : data_inst =
794795
let {dinit; _} = seg.it in
795-
ref dinit
796+
Data.alloc dinit
796797

797798

798799
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,19 +7,19 @@ 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 type_inst = var
1616
and func_inst = module_inst Lib.Promise.t Func.t
1717
and table_inst = Table.t
1818
and memory_inst = Memory.t
1919
and global_inst = Global.t
20+
and elem_inst = Elem.t
21+
and data_inst = Data.t
2022
and export_inst = Ast.name * extern
21-
and elem_inst = Value.ref_ list ref
22-
and data_inst = string ref
2323

2424
and extern =
2525
| ExternFunc of func_inst
@@ -56,7 +56,7 @@ let () =
5656

5757
let empty_module_inst =
5858
{ types = []; funcs = []; tables = []; memories = []; globals = [];
59-
exports = []; elems = []; datas = [] }
59+
elems = []; datas = []; exports = [] }
6060

6161
let extern_type_of c = function
6262
| ExternFunc func -> ExternFuncT (Func.type_of func)

0 commit comments

Comments
 (0)