Skip to content

Commit a5e87e4

Browse files
[interpreter] Add event section (WebAssembly#151)
* [interpreter] Add event section * fixup! [interpreter] Add event section * fixup! [interpreter] Add event section
1 parent 176d5c3 commit a5e87e4

File tree

18 files changed

+257
-27
lines changed

18 files changed

+257
-27
lines changed

interpreter/binary/decode.ml

+21-4
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ let sized f s =
135135

136136
open Types
137137

138+
let zero s = expect 0x00 s "zero byte expected"
139+
let var s = vu32 s
140+
138141
let num_type s =
139142
match vs7 s with
140143
| -0x01 -> I32Type
@@ -189,17 +192,17 @@ let global_type s =
189192
let mut = mutability s in
190193
GlobalType (t, mut)
191194

195+
let event_type s =
196+
zero s; at var s
197+
192198

193199
(* Decode instructions *)
194200

195201
open Ast
196202
open Operators
197203

198-
let var s = vu32 s
199-
200204
let op s = u8 s
201205
let end_ s = expect 0x0b s "END opcode expected"
202-
let zero s = expect 0x00 s "zero byte expected"
203206

204207
let memop s =
205208
let align = vu32 s in
@@ -527,6 +530,7 @@ let id s =
527530
| 10 -> `CodeSection
528531
| 11 -> `DataSection
529532
| 12 -> `DataCountSection
533+
| 13 -> `EventSection
530534
| _ -> error s (pos s) "malformed section id"
531535
) bo
532536

@@ -555,6 +559,7 @@ let import_desc s =
555559
| 0x01 -> TableImport (table_type s)
556560
| 0x02 -> MemoryImport (memory_type s)
557561
| 0x03 -> GlobalImport (global_type s)
562+
| 0x04 -> EventImport (event_type s)
558563
| _ -> error s (pos s - 1) "malformed import kind"
559564

560565
let import s =
@@ -592,6 +597,14 @@ let memory s =
592597
let memory_section s =
593598
section `MemorySection (vec (at memory)) [] s
594599

600+
(* Event section *)
601+
602+
let event s =
603+
let etype = event_type s in
604+
{etype}
605+
606+
let event_section s =
607+
section `EventSection (vec (at event)) [] s
595608

596609
(* Global section *)
597610

@@ -612,6 +625,7 @@ let export_desc s =
612625
| 0x01 -> TableExport (at var s)
613626
| 0x02 -> MemoryExport (at var s)
614627
| 0x03 -> GlobalExport (at var s)
628+
| 0x04 -> EventExport (at var s)
615629
| _ -> error s (pos s - 1) "malformed export kind"
616630

617631
let export s =
@@ -787,6 +801,8 @@ let module_ s =
787801
iterate custom_section s;
788802
let memories = memory_section s in
789803
iterate custom_section s;
804+
let events = event_section s in
805+
iterate custom_section s;
790806
let globals = global_section s in
791807
iterate custom_section s;
792808
let exports = export_section s in
@@ -812,7 +828,8 @@ let module_ s =
812828
let funcs =
813829
List.map2 Source.(fun t f -> {f.it with ftype = t} @@ f.at)
814830
func_types func_bodies
815-
in {types; tables; memories; globals; funcs; imports; exports; elems; datas; start}
831+
in {types; tables; memories; events; globals; funcs; imports; exports; elems;
832+
datas; start}
816833

817834

818835
let decode name bs = at module_ (stream name bs)

interpreter/binary/encode.ml

+14-3
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ let encode m =
9090
(* Types *)
9191

9292
open Types
93+
open Source
94+
95+
let var x = vu32 x.it
9396

9497
let num_type = function
9598
| I32Type -> vs7 (-0x01)
@@ -118,6 +121,8 @@ let encode m =
118121
let memory_type = function
119122
| MemoryType lim -> limits vu32 lim
120123

124+
let event_type x = vu32 0x00l; var x
125+
121126
let mutability = function
122127
| Immutable -> u8 0
123128
| Mutable -> u8 1
@@ -127,7 +132,6 @@ let encode m =
127132

128133
(* Expressions *)
129134

130-
open Source
131135
open Ast
132136
open Values
133137

@@ -136,8 +140,6 @@ let encode m =
136140

137141
let memop {align; offset; _} = vu32 (Int32.of_int align); vu32 offset
138142

139-
let var x = vu32 x.it
140-
141143
let block_type = function
142144
| VarBlockType x -> vs33 x.it
143145
| ValBlockType None -> vs7 (-0x40)
@@ -426,6 +428,7 @@ let encode m =
426428
| TableImport t -> u8 0x01; table_type t
427429
| MemoryImport t -> u8 0x02; memory_type t
428430
| GlobalImport t -> u8 0x03; global_type t
431+
| EventImport t -> u8 0x04; event_type t
429432

430433
let import im =
431434
let {module_name; item_name; idesc} = im.it in
@@ -456,6 +459,12 @@ let encode m =
456459
let memory_section mems =
457460
section 5 (vec memory) mems (mems <> [])
458461

462+
(* Event section *)
463+
let event (e : event) = u8 0x00; var e.it.etype
464+
465+
let event_section es =
466+
section 13 (vec event) es (es <> [])
467+
459468
(* Global section *)
460469
let global g =
461470
let {gtype; ginit} = g.it in
@@ -471,6 +480,7 @@ let encode m =
471480
| TableExport x -> u8 1; var x
472481
| MemoryExport x -> u8 2; var x
473482
| GlobalExport x -> u8 3; var x
483+
| EventExport x -> u8 4; var x
474484

475485
let export ex =
476486
let {name = n; edesc} = ex.it in
@@ -579,6 +589,7 @@ let encode m =
579589
func_section m.it.funcs;
580590
table_section m.it.tables;
581591
memory_section m.it.memories;
592+
event_section m.it.events;
582593
global_section m.it.globals;
583594
export_section m.it.exports;
584595
start_section m.it.start;

interpreter/exec/eval.ml

+8-1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ let type_ (inst : module_inst) x = lookup "type" inst.types x
8585
let func (inst : module_inst) x = lookup "function" inst.funcs x
8686
let table (inst : module_inst) x = lookup "table" inst.tables x
8787
let memory (inst : module_inst) x = lookup "memory" inst.memories x
88+
let event (inst : module_inst) x = lookup "event" inst.events x
8889
let global (inst : module_inst) x = lookup "global" inst.globals x
8990
let elem (inst : module_inst) x = lookup "element segment" inst.elems x
9091
let data (inst : module_inst) x = lookup "data segment" inst.datas x
@@ -580,6 +581,9 @@ let create_memory (inst : module_inst) (mem : memory) : memory_inst =
580581
let {mtype} = mem.it in
581582
Memory.alloc mtype
582583

584+
let create_event (inst : module_inst) (e : event) : event_inst =
585+
Event.alloc (type_ inst e.it.etype)
586+
583587
let create_global (inst : module_inst) (glob : global) : global_inst =
584588
let {gtype; ginit} = glob.it in
585589
let v = eval_const inst ginit in
@@ -593,6 +597,7 @@ let create_export (inst : module_inst) (ex : export) : export_inst =
593597
| TableExport x -> ExternTable (table inst x)
594598
| MemoryExport x -> ExternMemory (memory inst x)
595599
| GlobalExport x -> ExternGlobal (global inst x)
600+
| EventExport x -> ExternEvent (event inst x)
596601
in (name, ext)
597602

598603
let create_elem (inst : module_inst) (seg : elem_segment) : elem_inst =
@@ -612,6 +617,7 @@ let add_import (m : module_) (ext : extern) (im : import) (inst : module_inst)
612617
| ExternFunc func -> {inst with funcs = func :: inst.funcs}
613618
| ExternTable tab -> {inst with tables = tab :: inst.tables}
614619
| ExternMemory mem -> {inst with memories = mem :: inst.memories}
620+
| ExternEvent event -> {inst with events = event :: inst.events}
615621
| ExternGlobal glob -> {inst with globals = glob :: inst.globals}
616622

617623
let init_func (inst : module_inst) (func : func_inst) =
@@ -654,7 +660,7 @@ let run_start start =
654660

655661
let init (m : module_) (exts : extern list) : module_inst =
656662
let
657-
{ imports; tables; memories; globals; funcs; types;
663+
{ imports; tables; memories; events; globals; funcs; types;
658664
exports; elems; datas; start
659665
} = m.it
660666
in
@@ -670,6 +676,7 @@ let init (m : module_) (exts : extern list) : module_inst =
670676
{ inst1 with
671677
tables = inst1.tables @ List.map (create_table inst1) tables;
672678
memories = inst1.memories @ List.map (create_memory inst1) memories;
679+
events = inst1.events @ List.map (create_event inst1) events;
673680
globals = inst1.globals @ List.map (create_global inst1) globals;
674681
}
675682
in

interpreter/runtime/event.ml

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
open Types
2+
3+
type event = {ty : func_type}
4+
type t = event
5+
6+
let alloc ty =
7+
{ty}
8+
9+
let type_of evt =
10+
evt.ty

interpreter/runtime/event.mli

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
open Types
2+
3+
type event = {ty : func_type}
4+
type t = event
5+
6+
val alloc : func_type -> event
7+
val type_of : event -> func_type

interpreter/runtime/instance.ml

+6-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ type module_inst =
66
funcs : func_inst list;
77
tables : table_inst list;
88
memories : memory_inst list;
9+
events : event_inst list;
910
globals : global_inst list;
1011
exports : export_inst list;
1112
elems : elem_inst list;
@@ -15,6 +16,7 @@ type module_inst =
1516
and func_inst = module_inst ref Func.t
1617
and table_inst = Table.t
1718
and memory_inst = Memory.t
19+
and event_inst = Event.t
1820
and global_inst = Global.t
1921
and export_inst = Ast.name * extern
2022
and elem_inst = Values.ref_ list ref
@@ -24,6 +26,7 @@ and extern =
2426
| ExternFunc of func_inst
2527
| ExternTable of table_inst
2628
| ExternMemory of memory_inst
29+
| ExternEvent of event_inst
2730
| ExternGlobal of global_inst
2831

2932

@@ -47,14 +50,15 @@ let () =
4750
(* Auxiliary functions *)
4851

4952
let empty_module_inst =
50-
{ types = []; funcs = []; tables = []; memories = []; globals = [];
51-
exports = []; elems = []; datas = [] }
53+
{ types = []; funcs = []; tables = []; memories = []; events = [];
54+
globals = []; exports = []; elems = []; datas = [] }
5255

5356
let extern_type_of = function
5457
| ExternFunc func -> ExternFuncType (Func.type_of func)
5558
| ExternTable tab -> ExternTableType (Table.type_of tab)
5659
| ExternMemory mem -> ExternMemoryType (Memory.type_of mem)
5760
| ExternGlobal glob -> ExternGlobalType (Global.type_of glob)
61+
| ExternEvent event -> ExternEventType (Event.type_of event)
5862

5963
let export inst name =
6064
try Some (List.assoc name inst.exports) with Not_found -> None

interpreter/script/run.ml

+2
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ let print_import m im =
215215
| ExternFuncType t -> "func", string_of_func_type t
216216
| ExternTableType t -> "table", string_of_table_type t
217217
| ExternMemoryType t -> "memory", string_of_memory_type t
218+
| ExternEventType t -> "event", string_of_func_type t
218219
| ExternGlobalType t -> "global", string_of_global_type t
219220
in
220221
Printf.printf " import %s \"%s\" \"%s\" : %s\n"
@@ -228,6 +229,7 @@ let print_export m ex =
228229
| ExternFuncType t -> "func", string_of_func_type t
229230
| ExternTableType t -> "table", string_of_table_type t
230231
| ExternMemoryType t -> "memory", string_of_memory_type t
232+
| ExternEventType t -> "event", string_of_func_type t
231233
| ExternGlobalType t -> "global", string_of_global_type t
232234
in
233235
Printf.printf " export %s \"%s\" : %s\n"

interpreter/syntax/ast.ml

+16
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,13 @@ and memory' =
150150
mtype : memory_type;
151151
}
152152

153+
type event = event' Source.phrase
154+
and event' =
155+
{
156+
etype : var;
157+
}
158+
159+
153160
type segment_mode = segment_mode' Source.phrase
154161
and segment_mode' =
155162
| Passive
@@ -182,6 +189,7 @@ and export_desc' =
182189
| TableExport of var
183190
| MemoryExport of var
184191
| GlobalExport of var
192+
| EventExport of var
185193

186194
type export = export' Source.phrase
187195
and export' =
@@ -196,6 +204,7 @@ and import_desc' =
196204
| TableImport of table_type
197205
| MemoryImport of memory_type
198206
| GlobalImport of global_type
207+
| EventImport of var
199208

200209
type import = import' Source.phrase
201210
and import' =
@@ -212,6 +221,7 @@ and module_' =
212221
globals : global list;
213222
tables : table list;
214223
memories : memory list;
224+
events : event list;
215225
funcs : func list;
216226
start : var option;
217227
elems : elem_segment list;
@@ -229,6 +239,7 @@ let empty_module =
229239
globals = [];
230240
tables = [];
231241
memories = [];
242+
events = [];
232243
funcs = [];
233244
start = None;
234245
elems = [];
@@ -248,6 +259,7 @@ let import_type (m : module_) (im : import) : extern_type =
248259
| FuncImport x -> ExternFuncType (func_type_for m x)
249260
| TableImport t -> ExternTableType t
250261
| MemoryImport t -> ExternMemoryType t
262+
| EventImport x -> ExternEventType (func_type_for m x)
251263
| GlobalImport t -> ExternGlobalType t
252264

253265
let export_type (m : module_) (ex : export) : extern_type =
@@ -268,6 +280,10 @@ let export_type (m : module_) (ex : export) : extern_type =
268280
| GlobalExport x ->
269281
let gts = globals its @ List.map (fun g -> g.it.gtype) m.it.globals in
270282
ExternGlobalType (nth gts x.it)
283+
| EventExport x ->
284+
let ets =
285+
events its @ List.map (fun (e : event) -> func_type_for m e.it.etype) m.it.events
286+
in ExternEventType (nth ets x.it)
271287

272288
let string_of_name n =
273289
let b = Buffer.create 16 in

0 commit comments

Comments
 (0)